awk: fix a case with multiple -f options. simplify -f file reading.
No binary (build failed)
—
(log yok)
| @@ -681,11 +681,6 @@ static ALWAYS_INLINE int isalnum_(int c) | |
| return (isalnum(c) || c == '_'); | |
| } | |
| - | static FILE *afopen(const char *path, const char *mode) |
| - | { |
| - | return (*path == '-' && *(path+1) == '\0') ? stdin : xfopen(path, mode); |
| - | } |
| - | |
| /* -------- working with variables (set/get/copy/etc) -------- */ | |
| static xhash *iamarray(var *v) | |
| @@ -2740,7 +2735,7 @@ static rstream *next_input_file(void) | |
| ind = getvar_s(incvar(intvar[ARGIND])); | |
| fname = getvar_s(findvar(iamarray(intvar[ARGV]), ind)); | |
| if (fname && *fname && !is_assignment(fname)) | |
| - | F = afopen(fname, "r"); |
| + | F = xfopen_stdin(fname); |
| } | |
| } while (!F); | |
| @@ -2757,8 +2752,9 @@ int awk_main(int argc, char **argv) | |
| { | |
| unsigned opt; | |
| char *opt_F, *opt_W; | |
| - | llist_t *opt_v = NULL; |
| - | int i, j, flen; |
| + | llist_t *list_v = NULL; |
| + | llist_t *list_f = NULL; |
| + | int i, j; |
| var *v; | |
| var tv; | |
| char **envp; | |
| @@ -2816,35 +2812,33 @@ int awk_main(int argc, char **argv) | |
| *s1 = '='; | |
| } | |
| } | |
| - | opt_complementary = "v::"; |
| - | opt = getopt32(argv, "F:v:f:W:", &opt_F, &opt_v, &g_progname, &opt_W); |
| + | opt_complementary = "v::f::"; /* -v and -f can occur multiple times */ |
| + | opt = getopt32(argv, "F:v:f:W:", &opt_F, &list_v, &list_f, &opt_W); |
| argv += optind; | |
| argc -= optind; | |
| if (opt & 0x1) | |
| setvar_s(intvar[FS], opt_F); // -F | |
| - | while (opt_v) { /* -v */ |
| - | if (!is_assignment(llist_pop(&opt_v))) |
| + | while (list_v) { /* -v */ |
| + | if (!is_assignment(llist_pop(&list_v))) |
| bb_show_usage(); | |
| } | |
| - | if (opt & 0x4) { // -f |
| - | char *s = s; /* die, gcc, die */ |
| - | FILE *from_file = afopen(g_progname, "r"); |
| - | /* one byte is reserved for some trick in next_token */ |
| - | if (fseek(from_file, 0, SEEK_END) == 0) { |
| - | flen = ftell(from_file); |
| - | s = xmalloc(flen + 4); |
| - | fseek(from_file, 0, SEEK_SET); |
| - | i = 1 + fread(s + 1, 1, flen, from_file); |
| - | } else { |
| + | if (list_f) { /* -f */ |
| + | do { |
| + | char *s = NULL; |
| + | FILE *from_file; |
| + | |
| + | g_progname = llist_pop(&list_f); |
| + | from_file = xfopen_stdin(g_progname); |
| + | /* one byte is reserved for some trick in next_token */ |
| for (i = j = 1; j > 0; i += j) { | |
| s = xrealloc(s, i + 4096); | |
| j = fread(s + i, 1, 4094, from_file); | |
| } | |
| - | } |
| - | s[i] = '\0'; |
| - | fclose(from_file); |
| - | parse_program(s + 1); |
| - | free(s); |
| + | s[i] = '\0'; |
| + | fclose(from_file); |
| + | parse_program(s + 1); |
| + | free(s); |
| + | } while (list_f); |
| } else { // no -f: take program from 1st parameter | |
| if (!argc) | |
| bb_show_usage(); | |
| @@ -17,4 +17,11 @@ testing "awk -F case 5" "awk -F '[#]' '{ print NF }'" "4\n" "" "#abc##zz\n" | |
| testing "awk -F case 6" "awk -F '[#]' '{ print NF }'" "4\n" "" "z#abc##zz\n" | |
| testing "awk -F case 7" "awk -F '[#]' '{ print NF }'" "5\n" "" "z##abc##zz\n" | |
| + | tar xjf awk_t1.tar.bz2 |
| + | testing "awk 'gcc build bug'" \ |
| + | "awk -f awk_t1_opt-functions.awk -f awk_t1_opth-gen.awk <awk_t1_input | md5sum" \ |
| + | "f842e256461a5ab1ec60b58d16f1114f -\n" \ |
| + | "" "" |
| + | rm -rf awk_t1_* |
| + | |
| exit $FAILCOUNT | |