sed: unbreak multiple -e, -f option handling (my fault)
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 1 Oct 2006 21:05:12 +0000 (21:05 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 1 Oct 2006 21:05:12 +0000 (21:05 -0000)
coreutils/od.c
editors/sed.c
include/dump.h
libbb/get_line_from_file.c

index df06dd3ec13d6ce2f41d7de2620747373d04eb80..60a5174d9b66772c990fac71b16ab27833f0b40d 100644 (file)
@@ -189,7 +189,7 @@ int od_main(int argc, char **argv)
 
        odoffset(argc, &argv);
 
-       return(bb_dump_dump(argv));
+       return bb_dump_dump(argv);
 }
 
 /*-
index ee910d7ab6c08545967697211b35e33dbd02153b..229a9feaaa086fe98a06a6c05c1e62c88b3d1299 100644 (file)
@@ -1087,8 +1087,8 @@ static void add_cmd_block(char *cmdstr)
 int sed_main(int argc, char **argv)
 {
        unsigned long opt;
-       char *opt_e, *opt_f;
-       int status = EXIT_SUCCESS, getpat = 1;
+       llist_t *opt_e, *opt_f;
+       int status = EXIT_SUCCESS;
 
        bbg.sed_cmd_tail=&bbg.sed_cmd_head;
 
@@ -1102,6 +1102,8 @@ int sed_main(int argc, char **argv)
        }
 
        /* do normal option parsing */
+       opt_e = opt_f = NULL;
+       bb_opt_complementally = "e::f::"; /* can occur multiple times */
        opt = bb_getopt_ulflags(argc, argv, "irne:f:", &opt_e, &opt_f);
        if (opt & 0x1) { // -i
                bbg.in_place++;
@@ -1110,23 +1112,30 @@ int sed_main(int argc, char **argv)
        if (opt & 0x2) bbg.regex_type|=REG_EXTENDED; // -r
        if (opt & 0x4) bbg.be_quiet++; // -n
        if (opt & 0x8) { // -e
-               add_cmd_block(opt_e);
-               getpat=0;
+               while (opt_e) {
+                       llist_t *cur = opt_e;
+                       add_cmd_block(cur->data);
+                       opt_e = cur->link;
+                       free(cur);
+               }
        }
        if (opt & 0x10) { // -f
-               FILE *cmdfile;
-               char *line;
-               cmdfile = xfopen(opt_f, "r");
-               while ((line = bb_get_chomped_line_from_file(cmdfile)) != NULL) {
-                       add_cmd(line);
-                       getpat=0;
-                       free(line);
+               while (opt_f) {
+                       llist_t *cur = opt_f;
+                       FILE *cmdfile;
+                       char *line;
+                       cmdfile = xfopen(cur->data, "r");
+                       while ((line = bb_get_chomped_line_from_file(cmdfile)) != NULL) {
+                               add_cmd(line);
+                               free(line);
+                       }
+                       xprint_and_close_file(cmdfile);
+                       opt_f = cur->link;
+                       free(cur);
                }
-               xprint_and_close_file(cmdfile);
        }
-
        /* if we didn't get a pattern from -e or -f, use argv[optind] */
-       if(getpat) {
+       if(!(opt & 0x18)) {
                if (argv[optind] == NULL)
                        bb_show_usage();
                else
@@ -1136,7 +1145,7 @@ int sed_main(int argc, char **argv)
        add_cmd("");
 
        /* By default, we write to stdout */
-       bbg.nonstdout=stdout;
+       bbg.nonstdout = stdout;
 
        /* argv[(optind)..(argc-1)] should be names of file to process. If no
         * files were specified or '-' was specified, take input from stdin.
index e8a96ef874846a4adf17e47f602bd78a24e03ce6..7e171543094cc3482d8f88e265083acd9f05f4b1 100644 (file)
@@ -40,7 +40,7 @@ typedef struct _fs {                  /* format strings */
 } FS;
 
 extern void bb_dump_add(const char *fmt);
-extern int bb_dump_dump (char **argv);
+extern int bb_dump_dump(char **argv);
 extern int bb_dump_size(FS * fs);
 
 extern FS *bb_dump_fshead;             /* head of format strings */
index 68837b20d785c7c3dbffae52866228992fcc7d1f..de49eb51d9bd228cd081699d34ecd2e37b111153 100644 (file)
@@ -16,7 +16,7 @@
 /* get_line_from_file() - This function reads an entire line from a text file,
  * up to a newline or NUL byte.  It returns a malloc'ed char * which must be
  * stored and free'ed  by the caller.  If end is null '\n' isn't considered
- * and of line.  If end isn't null, length of the chunk read is stored in it. */
+ * end of line.  If end isn't null, length of the chunk read is stored in it. */
 
 char *bb_get_chunk_from_file(FILE * file, int *end)
 {
@@ -46,7 +46,7 @@ char *bb_get_chunk_from_file(FILE * file, int *end)
        return linebuf;
 }
 
-/* Get line, including trailing /n if any */
+/* Get line, including trailing \n if any */
 char *bb_get_line_from_file(FILE * file)
 {
        int i;
@@ -54,7 +54,7 @@ char *bb_get_line_from_file(FILE * file)
        return bb_get_chunk_from_file(file, &i);
 }
 
-/* Get line.  Remove trailing /n */
+/* Get line.  Remove trailing \n */
 char *bb_get_chomped_line_from_file(FILE * file)
 {
        int i;