awk: getopt_ulflags'isation

This commit is contained in:
Denis Vlasenko 2006-09-22 09:02:30 +00:00
parent 750fc6d7bb
commit 099efbf99e

View File

@ -2605,6 +2605,8 @@ static rstream *next_input_file(void)
int awk_main(int argc, char **argv) int awk_main(int argc, char **argv)
{ {
unsigned long opt;
char *opt_F, *opt_v, *opt_W;
char *s, *s1; char *s, *s1;
int i, j, c, flen; int i, j, c, flen;
var *v; var *v;
@ -2660,49 +2662,37 @@ keep_going:
free(s); free(s);
} }
while((c = getopt(argc, argv, "F:v:f:W:")) != EOF) { opt = bb_getopt_ulflags(argc, argv, "F:v:f:W:", &opt_F, &opt_v, &programname, &opt_W);
switch (c) { if (opt & 0x1) setvar_s(V[FS], opt_F); // -F
case 'F': if (opt & 0x2) if (!is_assignment(opt_v)) bb_show_usage(); // -v
setvar_s(V[FS], optarg); if (opt & 0x4) { // -f
break; from_file = TRUE;
case 'v': F = afopen(programname, "r");
if (! is_assignment(optarg)) s = NULL;
bb_show_usage(); /* one byte is reserved for some trick in next_token */
break; if (fseek(F, 0, SEEK_END) == 0) {
case 'f': flen = ftell(F);
from_file = TRUE; s = (char *)xmalloc(flen+4);
F = afopen(programname = optarg, "r"); fseek(F, 0, SEEK_SET);
s = NULL; i = 1 + fread(s+1, 1, flen, F);
/* one byte is reserved for some trick in next_token */ } else {
if (fseek(F, 0, SEEK_END) == 0) { for (i=j=1; j>0; i+=j) {
flen = ftell(F); s = (char *)xrealloc(s, i+4096);
s = (char *)xmalloc(flen+4); j = fread(s+i, 1, 4094, F);
fseek(F, 0, SEEK_SET); }
i = 1 + fread(s+1, 1, flen, F);
} else {
for (i=j=1; j>0; i+=j) {
s = (char *)xrealloc(s, i+4096);
j = fread(s+i, 1, 4094, F);
}
}
s[i] = '\0';
fclose(F);
parse_program(s+1);
free(s);
break;
case 'W':
bb_error_msg("Warning: unrecognized option '-W %s' ignored", optarg);
break;
default:
bb_show_usage();
} }
s[i] = '\0';
fclose(F);
parse_program(s+1);
free(s);
} }
if (opt & 0x8) // -W
bb_error_msg("Warning: unrecognized option '-W %s' ignored", opt_W);
if (!from_file) { if (!from_file) {
if (argc == optind) if (argc == optind)
bb_show_usage(); bb_show_usage();
programname="cmd. line"; programname = "cmd. line";
parse_program(argv[optind++]); parse_program(argv[optind++]);
} }