Patch -i support from Berhnard Fischer.
authorRob Landley <rob@landley.net>
Thu, 1 Sep 2005 03:02:23 +0000 (03:02 -0000)
committerRob Landley <rob@landley.net>
Thu, 1 Sep 2005 03:02:23 +0000 (03:02 -0000)
TODO
editors/patch.c
include/usage.h

diff --git a/TODO b/TODO
index 38c0a53..771fa9f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -39,8 +39,8 @@ fuser
   Would be nice.  The basic susv3 options, plus fuser -k.
 ---
 patch
-  should have -i support, and simple fuzz factor support to apply patches
-  at an offset shouldn't take up too much space.
+  should have simple fuzz factor support to apply patches at an offset which
+  shouldn't take up too much space.
 ---
 man
   It would be nice to have a man command.  Not one that handles troff or
index 6a68d2e..59b7021 100644 (file)
@@ -107,14 +107,24 @@ extern int patch_main(int argc, char **argv)
 {
        unsigned int patch_level = -1;
        char *patch_line;
-       int ret = 0;
+       int ret;
+       FILE *patch_file = NULL;
 
-       /* Handle 'p' option */
-       if (argv[1] && (argv[1][0] == '-') && (argv[1][1] == 'p')) {
-               patch_level = atoi(&argv[1][2]);
+       {
+               char *p, *i;
+               ret = bb_getopt_ulflags(argc, argv, "p:i:", &p, &i);
+               if (ret & 1)
+                       patch_level = bb_xgetularg10_bnd(p, -1, USHRT_MAX);
+               if (ret & 2) {
+                       patch_file = bb_xfopen(i, "r");
+               }
+               ret = 0;
        }
 
-       patch_line = bb_get_line_from_file(stdin);
+       if (!patch_file)
+               patch_file = stdin;
+
+       patch_line = bb_get_line_from_file(patch_file);
        while (patch_line) {
                FILE *src_stream;
                FILE *dst_stream;
@@ -133,14 +143,14 @@ extern int patch_main(int argc, char **argv)
                 */
                while (patch_line && strncmp(patch_line, "--- ", 4) != 0) {
                        free(patch_line);
-                       patch_line = bb_get_line_from_file(stdin);
+                       patch_line = bb_get_line_from_file(patch_file);
                }
 
                /* Extract the filename used before the patch was generated */
                original_filename = extract_filename(patch_line, patch_level);
                free(patch_line);
 
-               patch_line = bb_get_line_from_file(stdin);
+               patch_line = bb_get_line_from_file(patch_file);
                if (strncmp(patch_line, "+++ ", 4) != 0) {
                        ret = 2;
                        bb_error_msg("Invalid patch");
@@ -183,7 +193,7 @@ extern int patch_main(int argc, char **argv)
                printf("patching file %s\n", new_filename);
 
                /* Handle each hunk */
-               patch_line = bb_get_line_from_file(stdin);
+               patch_line = bb_get_line_from_file(patch_file);
                while (patch_line) {
                        unsigned int count;
                        unsigned int src_beg_line;
@@ -214,7 +224,7 @@ extern int patch_main(int argc, char **argv)
                        }
                        hunk_offset_start = src_cur_line;
 
-                       while ((patch_line = bb_get_line_from_file(stdin)) != NULL) {
+                       while ((patch_line = bb_get_line_from_file(patch_file)) != NULL) {
                                if ((*patch_line == '-') || (*patch_line == ' ')) {
                                        char *src_line = NULL;
                                        if (src_stream) {
index 6622278..9227025 100644 (file)
        "\t-u\tUnlocks (re-enables) the specified user account"
 
 #define patch_trivial_usage \
-       "[-p<num>]"
+       "[-p<num>] [-i<patch.diff>]"
 #define patch_full_usage \
-       "[-p<num>]"
+       "[-p<num>]\n" \
+       "[-i<diff>]"
 #define patch_example_usage \
-       "$ patch -p1 <example.diff"
+       "$ patch -p1 <example.diff\n" \
+       "$ patch -p0 -i example.diff"
 
 #define pidof_trivial_usage \
        "process-name [OPTION] [process-name ...]"