From b97c9842a521a54980b247ab8b920f057b128b2e Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 1 Oct 2006 21:05:12 +0000 Subject: [PATCH] sed: unbreak multiple -e, -f option handling (my fault) --- coreutils/od.c | 2 +- editors/sed.c | 39 +++++++++++++++++++++++--------------- include/dump.h | 2 +- libbb/get_line_from_file.c | 6 +++--- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/coreutils/od.c b/coreutils/od.c index df06dd3ec..60a5174d9 100644 --- a/coreutils/od.c +++ b/coreutils/od.c @@ -189,7 +189,7 @@ int od_main(int argc, char **argv) odoffset(argc, &argv); - return(bb_dump_dump(argv)); + return bb_dump_dump(argv); } /*- diff --git a/editors/sed.c b/editors/sed.c index ee910d7ab..229a9feaa 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -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. diff --git a/include/dump.h b/include/dump.h index e8a96ef87..7e1715430 100644 --- a/include/dump.h +++ b/include/dump.h @@ -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 */ diff --git a/libbb/get_line_from_file.c b/libbb/get_line_from_file.c index 68837b20d..de49eb51d 100644 --- a/libbb/get_line_from_file.c +++ b/libbb/get_line_from_file.c @@ -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;