Don't use '-' in option string to getopt().
authorGeorge Koehler <xkernigh@netscape.net>
Mon, 30 Oct 2017 02:00:43 +0000 (22:00 -0400)
committerGeorge Koehler <xkernigh@netscape.net>
Mon, 30 Oct 2017 03:25:07 +0000 (23:25 -0400)
@dram reported a build failure in FreeBSD at
https://github.com/davidgiven/ack/issues/1#issuecomment-273668299

Linux manual for getopt(3) says:
> If the first character of optstring is '-', then each nonoption
> argv-element is handled as if it were the argument of an option with
> character code 1....
>
> The use of '+' and '-' in optstring is a GNU extension.

GNU/Linux and OpenBSD handle '-' in this special way, but FreeBSD
seems not to.  If '-' is not special, then em_ego can't find its input
file, so the build must fail.  This commit stops using '-' in both
em_b and em_ego, but doesn't change mcg.

Also fix em_ego -O3 to not act like -O4.

lang/b/compiler/b0.c
util/ego/em_ego/em_ego.c

index 7ae3523..2bf9368 100644 (file)
@@ -34,12 +34,19 @@ init(char *s, int val)
        np->offset = val;
 }
 
+static void
+usage(void)
+{
+       error("Usage: em_b [-w wordsize] [-B modulename] [-i inputfile] [-o outputfile]");
+       exit(1);
+}
+
 int
 main(int argc, char *argv[])
 {
 
        for (;;) {
-               int opt = getopt(argc, argv, "-w:B:i:o:");
+               int opt = getopt(argc, argv, "w:B:i:o:");
                if (opt == -1)
                        break;
 
@@ -66,11 +73,12 @@ main(int argc, char *argv[])
                                }
                                break;
 
-                       derfault:
-                               error("Usage: em_b [-w wordsize] [-B modulename] [-i inputfile] [-o outputfile]");
-                               exit(1);
+                       default:
+                               usage();
                }
        }
+       if (optind < argc)
+               usage();
 
        init("auto", AUTO);
        init("extrn", EXTERN);
index 36d6456..eb17711 100644 (file)
@@ -346,7 +346,7 @@ int main(int argc, char* argv[])
        opterr = 0;
        for (;;)
        {
-               int opt = getopt(argc, argv, "-M:P:O:vt");
+               int opt = getopt(argc, argv, "M:P:O:vt");
                if (opt == -1)
                        break;
 
@@ -364,17 +364,14 @@ int main(int argc, char* argv[])
                        {
                                int o = atoi(optarg);
                                if (o <= 2)
-                                       break;
-                               if (o <= 3)
+                                       Ophase = &O2phases[0];
+                               else if (o == 3)
                                        Ophase = &O3phases[0];
-                               Ophase = &O4phases[0];
+                               else
+                                       Ophase = &O4phases[0];
                                break;
                        }
 
-                       case 1:
-                               add_file(optarg);
-                               break;
-
                        case 't':
                                keeptemps = 1;
                                goto addopt;
@@ -390,6 +387,9 @@ int main(int argc, char* argv[])
                }
        }
 
+       for (i = optind; i < argc; i++)
+               add_file(argv[i]);
+
        phase_args[nphase_args] = 0;
        if (nuphases)
                Ophase = uphases;