awk: getopt_ulflags'isation
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 22 Sep 2006 09:02:30 +0000 (09:02 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 22 Sep 2006 09:02:30 +0000 (09:02 -0000)
editors/awk.c

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