sed: unbreak multiple -e, -f option handling (my fault)

This commit is contained in:
Denis Vlasenko 2006-10-01 21:05:12 +00:00
parent bb119d059a
commit b97c9842a5
4 changed files with 29 additions and 20 deletions

View File

@ -189,7 +189,7 @@ int od_main(int argc, char **argv)
odoffset(argc, &argv); odoffset(argc, &argv);
return(bb_dump_dump(argv)); return bb_dump_dump(argv);
} }
/*- /*-

View File

@ -1087,8 +1087,8 @@ static void add_cmd_block(char *cmdstr)
int sed_main(int argc, char **argv) int sed_main(int argc, char **argv)
{ {
unsigned long opt; unsigned long opt;
char *opt_e, *opt_f; llist_t *opt_e, *opt_f;
int status = EXIT_SUCCESS, getpat = 1; int status = EXIT_SUCCESS;
bbg.sed_cmd_tail=&bbg.sed_cmd_head; bbg.sed_cmd_tail=&bbg.sed_cmd_head;
@ -1102,6 +1102,8 @@ int sed_main(int argc, char **argv)
} }
/* do normal option parsing */ /* 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); opt = bb_getopt_ulflags(argc, argv, "irne:f:", &opt_e, &opt_f);
if (opt & 0x1) { // -i if (opt & 0x1) { // -i
bbg.in_place++; 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 & 0x2) bbg.regex_type|=REG_EXTENDED; // -r
if (opt & 0x4) bbg.be_quiet++; // -n if (opt & 0x4) bbg.be_quiet++; // -n
if (opt & 0x8) { // -e if (opt & 0x8) { // -e
add_cmd_block(opt_e); while (opt_e) {
getpat=0; llist_t *cur = opt_e;
add_cmd_block(cur->data);
opt_e = cur->link;
free(cur);
}
} }
if (opt & 0x10) { // -f if (opt & 0x10) { // -f
while (opt_f) {
llist_t *cur = opt_f;
FILE *cmdfile; FILE *cmdfile;
char *line; char *line;
cmdfile = xfopen(opt_f, "r"); cmdfile = xfopen(cur->data, "r");
while ((line = bb_get_chomped_line_from_file(cmdfile)) != NULL) { while ((line = bb_get_chomped_line_from_file(cmdfile)) != NULL) {
add_cmd(line); add_cmd(line);
getpat=0;
free(line); free(line);
} }
xprint_and_close_file(cmdfile); xprint_and_close_file(cmdfile);
opt_f = cur->link;
free(cur);
}
} }
/* if we didn't get a pattern from -e or -f, use argv[optind] */ /* if we didn't get a pattern from -e or -f, use argv[optind] */
if(getpat) { if(!(opt & 0x18)) {
if (argv[optind] == NULL) if (argv[optind] == NULL)
bb_show_usage(); bb_show_usage();
else else

View File

@ -16,7 +16,7 @@
/* get_line_from_file() - This function reads an entire line from a text file, /* 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 * 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 * 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) 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; return linebuf;
} }
/* Get line, including trailing /n if any */ /* Get line, including trailing \n if any */
char *bb_get_line_from_file(FILE * file) char *bb_get_line_from_file(FILE * file)
{ {
int i; int i;
@ -54,7 +54,7 @@ char *bb_get_line_from_file(FILE * file)
return bb_get_chunk_from_file(file, &i); 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) char *bb_get_chomped_line_from_file(FILE * file)
{ {
int i; int i;