merge with 1.10f
[gnulib.git] / lib / getopt.c
index 812258a..82f6ad9 100644 (file)
@@ -60,7 +60,7 @@
 
 /* This needs to come after some library #include
    to get __GNU_LIBRARY__ defined.  */
-#ifdef __GNU_LIBRARY__
+#if defined (__GNU_LIBRARY__) || defined (__sgi)
 /* Don't include stdlib.h for non-GNU C libraries because some of them
    contain conflicting prototypes for getopt.  */
 #include <stdlib.h>
@@ -158,8 +158,11 @@ static enum
 {
   REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
 } ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
 \f
-#ifdef __GNU_LIBRARY__
+#if defined (__GNU_LIBRARY__) || defined (__sgi)
 /* We want to avoid inclusion of string.h with non-GNU libraries
    because there are many ways it can cause trouble.
    On some systems, it contains special magic macros that don't work
@@ -190,11 +193,12 @@ my_index (str, chr)
 /* If using GCC, we can safely declare strlen this way.
    If not using GCC, it is ok not to declare it.  */
 #ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
 #ifndef __STDC__
-/* Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
-   Enable Emacs to compile on it.  */
-#include <stddef.h>
-extern size_t strlen (const char *);
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
 #endif /* not __STDC__ */
 #endif /* __GNUC__ */
 
@@ -288,6 +292,8 @@ _getopt_initialize (optstring)
 
   nextchar = NULL;
 
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
   /* Determine how to handle the ordering of options and nonoptions.  */
 
   if (optstring[0] == '-')
@@ -300,7 +306,7 @@ _getopt_initialize (optstring)
       ordering = REQUIRE_ORDER;
       ++optstring;
     }
-  else if (getenv ("POSIXLY_CORRECT") != NULL)
+  else if (posixly_correct != NULL)
     ordering = REQUIRE_ORDER;
   else
     ordering = PERMUTE;
@@ -479,6 +485,10 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
       for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
        /* Do nothing.  */ ;
 
+#ifdef lint            /* Suppress `used before initialized' warning.  */
+      indfound = 0;
+#endif
+
       /* Test all long options for either exact match
         or abbreviated matches.  */
       for (p = longopts, option_index = 0; p->name; p++, option_index++)
@@ -604,8 +614,11 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
       {
        if (opterr)
          {
-           /* 1003.2 specifies the format of this message.  */
-           fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+           if (posixly_correct)
+             /* 1003.2 specifies the format of this message.  */
+             fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+           else
+             fprintf (stderr, "%s: invalid option -- %c\n", argv[0], c);
          }
        optopt = c;
        return '?';