New module attribute 'Applicability'.
[gnulib.git] / tests / test-getopt.h
index 352fe32..bcc7fe6 100644 (file)
 
 /* Written by Bruno Haible <bruno@clisp.org>, 2009.  */
 
+#include <stdbool.h>
+
 static void
-getopt_loop (int argc, char **argv,
-            const char *options,
-            int *a_seen, int *b_seen,
-            const char **p_value, const char **q_value,
-            int *non_options_count, const char **non_options,
-            int *unrecognized)
+getopt_loop (int argc, const char **argv,
+             const char *options,
+             int *a_seen, int *b_seen,
+             const char **p_value, const char **q_value,
+             int *non_options_count, const char **non_options,
+             int *unrecognized)
 {
   int c;
 
   opterr = 0;
-  while ((c = getopt (argc, argv, options)) != -1)
+  while ((c = getopt (argc, (char **) argv, options)) != -1)
     {
       switch (c)
-       {
-       case 'a':
-         (*a_seen)++;
-         break;
-       case 'b':
-         (*b_seen)++;
-         break;
-       case 'p':
-         *p_value = optarg;
-         break;
-       case 'q':
-         *q_value = optarg;
-         break;
-       case '\1':
-         /* Must only happen with option '-' at the beginning.  */
-         ASSERT (options[0] == '-');
-         non_options[(*non_options_count)++] = optarg;
-         break;
-       case '?':
-         *unrecognized = optopt;
-         break;
-       default:
-         *unrecognized = c;
-         break;
-       }
+        {
+        case 'a':
+          (*a_seen)++;
+          break;
+        case 'b':
+          (*b_seen)++;
+          break;
+        case 'p':
+          *p_value = optarg;
+          break;
+        case 'q':
+          *q_value = optarg;
+          break;
+        case '\1':
+          /* Must only happen with option '-' at the beginning.  */
+          ASSERT (options[0] == '-');
+          non_options[(*non_options_count)++] = optarg;
+          break;
+        case '?':
+          *unrecognized = optopt;
+          break;
+        default:
+          *unrecognized = c;
+          break;
+        }
     }
 }
 
@@ -62,6 +64,14 @@ static void
 test_getopt (void)
 {
   int start;
+  bool posixly = !!getenv ("POSIXLY_CORRECT");
+  /* See comment in getopt.c:
+     glibc gets a LSB-compliant getopt.
+     Standalone applications get a POSIX-compliant getopt.  */
+#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
+  /* Using getopt from gnulib or from a non-glibc system.  */
+  posixly = true;
+#endif
 
   /* Test processing of boolean options.  */
   for (start = OPTIND_MIN; start <= 1; start++)
@@ -74,16 +84,17 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-a";
       argv[argc++] = "foo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "ab",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 0);
       ASSERT (p_value == NULL);
@@ -102,17 +113,18 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-b";
       argv[argc++] = "-a";
       argv[argc++] = "foo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "ab",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 1);
       ASSERT (p_value == NULL);
@@ -131,16 +143,17 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-ba";
       argv[argc++] = "foo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "ab",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 1);
       ASSERT (p_value == NULL);
@@ -159,17 +172,18 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-ab";
       argv[argc++] = "-a";
       argv[argc++] = "foo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "ab",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 2);
       ASSERT (b_seen == 1);
       ASSERT (p_value == NULL);
@@ -190,15 +204,16 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-pfoo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "p:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
@@ -217,16 +232,17 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-p";
       argv[argc++] = "foo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "p:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
@@ -245,7 +261,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-ab";
@@ -253,10 +269,11 @@ test_getopt (void)
       argv[argc++] = "baz";
       argv[argc++] = "-pfoo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 1);
       ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
@@ -278,15 +295,16 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-pfoo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "p::q::",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
@@ -305,16 +323,17 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-p";
       argv[argc++] = "foo";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "p::q::",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value == NULL);
@@ -333,16 +352,17 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-p";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp::q::",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 0);
       ASSERT (p_value == NULL);
@@ -364,7 +384,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-p";
@@ -372,10 +392,11 @@ test_getopt (void)
       argv[argc++] = "-x";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 0);
       ASSERT (p_value != NULL && strcmp (p_value, "foo") == 0);
@@ -396,7 +417,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -405,46 +426,47 @@ test_getopt (void)
       argv[argc++] = "duck";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
-      /* See comment in getopt.c:
-         glibc gets a LSB-compliant getopt.
-         Standalone applications get a POSIX-compliant getopt.  */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
-      /* Using getopt from gnulib or from a non-glibc system.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "donald") == 0);
-      ASSERT (strcmp (argv[2], "-p") == 0);
-      ASSERT (strcmp (argv[3], "billy") == 0);
-      ASSERT (strcmp (argv[4], "duck") == 0);
-      ASSERT (strcmp (argv[5], "-a") == 0);
-      ASSERT (strcmp (argv[6], "bar") == 0);
-      ASSERT (a_seen == 0);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value == NULL);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 1);
-#else
-      /* Using getopt from glibc.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "-p") == 0);
-      ASSERT (strcmp (argv[2], "billy") == 0);
-      ASSERT (strcmp (argv[3], "-a") == 0);
-      ASSERT (strcmp (argv[4], "donald") == 0);
-      ASSERT (strcmp (argv[5], "duck") == 0);
-      ASSERT (strcmp (argv[6], "bar") == 0);
-      ASSERT (a_seen == 1);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 4);
-#endif
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
+      if (posixly)
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "donald") == 0);
+          ASSERT (strcmp (argv[2], "-p") == 0);
+          ASSERT (strcmp (argv[3], "billy") == 0);
+          ASSERT (strcmp (argv[4], "duck") == 0);
+          ASSERT (strcmp (argv[5], "-a") == 0);
+          ASSERT (strcmp (argv[6], "bar") == 0);
+          ASSERT (argv[7] == NULL);
+          ASSERT (a_seen == 0);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value == NULL);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 1);
+        }
+      else
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "-p") == 0);
+          ASSERT (strcmp (argv[2], "billy") == 0);
+          ASSERT (strcmp (argv[3], "-a") == 0);
+          ASSERT (strcmp (argv[4], "donald") == 0);
+          ASSERT (strcmp (argv[5], "duck") == 0);
+          ASSERT (strcmp (argv[6], "bar") == 0);
+          ASSERT (argv[7] == NULL);
+          ASSERT (a_seen == 1);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 4);
+        }
     }
 
   /* Check that '--' ends the argument processing.  */
@@ -458,7 +480,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[20];
+      const char *argv[20];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -472,56 +494,57 @@ test_getopt (void)
       argv[argc++] = "-q";
       argv[argc++] = "johnny";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
-      /* See comment in getopt.c:
-         glibc gets a LSB-compliant getopt.
-         Standalone applications get a POSIX-compliant getopt.  */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
-      /* Using getopt from gnulib or from a non-glibc system.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "donald") == 0);
-      ASSERT (strcmp (argv[2], "-p") == 0);
-      ASSERT (strcmp (argv[3], "billy") == 0);
-      ASSERT (strcmp (argv[4], "duck") == 0);
-      ASSERT (strcmp (argv[5], "-a") == 0);
-      ASSERT (strcmp (argv[6], "--") == 0);
-      ASSERT (strcmp (argv[7], "-b") == 0);
-      ASSERT (strcmp (argv[8], "foo") == 0);
-      ASSERT (strcmp (argv[9], "-q") == 0);
-      ASSERT (strcmp (argv[10], "johnny") == 0);
-      ASSERT (strcmp (argv[11], "bar") == 0);
-      ASSERT (a_seen == 0);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value == NULL);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 1);
-#else
-      /* Using getopt from glibc.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "-p") == 0);
-      ASSERT (strcmp (argv[2], "billy") == 0);
-      ASSERT (strcmp (argv[3], "-a") == 0);
-      ASSERT (strcmp (argv[4], "--") == 0);
-      ASSERT (strcmp (argv[5], "donald") == 0);
-      ASSERT (strcmp (argv[6], "duck") == 0);
-      ASSERT (strcmp (argv[7], "-b") == 0);
-      ASSERT (strcmp (argv[8], "foo") == 0);
-      ASSERT (strcmp (argv[9], "-q") == 0);
-      ASSERT (strcmp (argv[10], "johnny") == 0);
-      ASSERT (strcmp (argv[11], "bar") == 0);
-      ASSERT (a_seen == 1);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 5);
-#endif
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
+      if (posixly)
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "donald") == 0);
+          ASSERT (strcmp (argv[2], "-p") == 0);
+          ASSERT (strcmp (argv[3], "billy") == 0);
+          ASSERT (strcmp (argv[4], "duck") == 0);
+          ASSERT (strcmp (argv[5], "-a") == 0);
+          ASSERT (strcmp (argv[6], "--") == 0);
+          ASSERT (strcmp (argv[7], "-b") == 0);
+          ASSERT (strcmp (argv[8], "foo") == 0);
+          ASSERT (strcmp (argv[9], "-q") == 0);
+          ASSERT (strcmp (argv[10], "johnny") == 0);
+          ASSERT (strcmp (argv[11], "bar") == 0);
+          ASSERT (argv[12] == NULL);
+          ASSERT (a_seen == 0);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value == NULL);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 1);
+        }
+      else
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "-p") == 0);
+          ASSERT (strcmp (argv[2], "billy") == 0);
+          ASSERT (strcmp (argv[3], "-a") == 0);
+          ASSERT (strcmp (argv[4], "--") == 0);
+          ASSERT (strcmp (argv[5], "donald") == 0);
+          ASSERT (strcmp (argv[6], "duck") == 0);
+          ASSERT (strcmp (argv[7], "-b") == 0);
+          ASSERT (strcmp (argv[8], "foo") == 0);
+          ASSERT (strcmp (argv[9], "-q") == 0);
+          ASSERT (strcmp (argv[10], "johnny") == 0);
+          ASSERT (strcmp (argv[11], "bar") == 0);
+          ASSERT (argv[12] == NULL);
+          ASSERT (a_seen == 1);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 5);
+        }
     }
 
 #if GNULIB_GETOPT_GNU
@@ -536,7 +559,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -545,10 +568,11 @@ test_getopt (void)
       argv[argc++] = "duck";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "-abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (strcmp (argv[0], "program") == 0);
       ASSERT (strcmp (argv[1], "donald") == 0);
       ASSERT (strcmp (argv[2], "-p") == 0);
@@ -556,6 +580,7 @@ test_getopt (void)
       ASSERT (strcmp (argv[4], "duck") == 0);
       ASSERT (strcmp (argv[5], "-a") == 0);
       ASSERT (strcmp (argv[6], "bar") == 0);
+      ASSERT (argv[7] == NULL);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 0);
       ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
@@ -579,7 +604,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[20];
+      const char *argv[20];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -593,10 +618,11 @@ test_getopt (void)
       argv[argc++] = "-q";
       argv[argc++] = "johnny";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "-abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (strcmp (argv[0], "program") == 0);
       ASSERT (strcmp (argv[1], "donald") == 0);
       ASSERT (strcmp (argv[2], "-p") == 0);
@@ -609,32 +635,33 @@ test_getopt (void)
       ASSERT (strcmp (argv[9], "-q") == 0);
       ASSERT (strcmp (argv[10], "johnny") == 0);
       ASSERT (strcmp (argv[11], "bar") == 0);
+      ASSERT (argv[12] == NULL);
       ASSERT (a_seen == 1);
       ASSERT (b_seen == 0);
       ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
       ASSERT (q_value == NULL);
       if (non_options_count == 2)
         {
-         /* glibc behaviour.  */
-         ASSERT (non_options_count == 2);
-         ASSERT (strcmp (non_options[0], "donald") == 0);
-         ASSERT (strcmp (non_options[1], "duck") == 0);
-         ASSERT (unrecognized == 0);
-         ASSERT (optind == 7);
+          /* glibc behaviour.  */
+          ASSERT (non_options_count == 2);
+          ASSERT (strcmp (non_options[0], "donald") == 0);
+          ASSERT (strcmp (non_options[1], "duck") == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 7);
         }
       else
         {
-         /* Another valid behaviour.  */
-         ASSERT (non_options_count == 7);
-         ASSERT (strcmp (non_options[0], "donald") == 0);
-         ASSERT (strcmp (non_options[1], "duck") == 0);
-         ASSERT (strcmp (non_options[2], "-b") == 0);
-         ASSERT (strcmp (non_options[3], "foo") == 0);
-         ASSERT (strcmp (non_options[4], "-q") == 0);
-         ASSERT (strcmp (non_options[5], "johnny") == 0);
-         ASSERT (strcmp (non_options[6], "bar") == 0);
-         ASSERT (unrecognized == 0);
-         ASSERT (optind == 12);
+          /* Another valid behaviour.  */
+          ASSERT (non_options_count == 7);
+          ASSERT (strcmp (non_options[0], "donald") == 0);
+          ASSERT (strcmp (non_options[1], "duck") == 0);
+          ASSERT (strcmp (non_options[2], "-b") == 0);
+          ASSERT (strcmp (non_options[3], "foo") == 0);
+          ASSERT (strcmp (non_options[4], "-q") == 0);
+          ASSERT (strcmp (non_options[5], "johnny") == 0);
+          ASSERT (strcmp (non_options[6], "bar") == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 12);
         }
     }
 #endif
@@ -650,7 +677,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -659,46 +686,47 @@ test_getopt (void)
       argv[argc++] = "duck";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp:q:-",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
-      /* See comment in getopt.c:
-         glibc gets a LSB-compliant getopt.
-         Standalone applications get a POSIX-compliant getopt.  */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
-      /* Using getopt from gnulib or from a non-glibc system.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "donald") == 0);
-      ASSERT (strcmp (argv[2], "-p") == 0);
-      ASSERT (strcmp (argv[3], "billy") == 0);
-      ASSERT (strcmp (argv[4], "duck") == 0);
-      ASSERT (strcmp (argv[5], "-a") == 0);
-      ASSERT (strcmp (argv[6], "bar") == 0);
-      ASSERT (a_seen == 0);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value == NULL);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 1);
-#else
-      /* Using getopt from glibc.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "-p") == 0);
-      ASSERT (strcmp (argv[2], "billy") == 0);
-      ASSERT (strcmp (argv[3], "-a") == 0);
-      ASSERT (strcmp (argv[4], "donald") == 0);
-      ASSERT (strcmp (argv[5], "duck") == 0);
-      ASSERT (strcmp (argv[6], "bar") == 0);
-      ASSERT (a_seen == 1);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 4);
-#endif
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
+      if (posixly)
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "donald") == 0);
+          ASSERT (strcmp (argv[2], "-p") == 0);
+          ASSERT (strcmp (argv[3], "billy") == 0);
+          ASSERT (strcmp (argv[4], "duck") == 0);
+          ASSERT (strcmp (argv[5], "-a") == 0);
+          ASSERT (strcmp (argv[6], "bar") == 0);
+          ASSERT (argv[7] == NULL);
+          ASSERT (a_seen == 0);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value == NULL);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 1);
+        }
+      else
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "-p") == 0);
+          ASSERT (strcmp (argv[2], "billy") == 0);
+          ASSERT (strcmp (argv[3], "-a") == 0);
+          ASSERT (strcmp (argv[4], "donald") == 0);
+          ASSERT (strcmp (argv[5], "duck") == 0);
+          ASSERT (strcmp (argv[6], "bar") == 0);
+          ASSERT (argv[7] == NULL);
+          ASSERT (a_seen == 1);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 4);
+        }
     }
 
   /* Check that the '+' flag causes the first non-option to terminate the
@@ -713,7 +741,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -722,10 +750,11 @@ test_getopt (void)
       argv[argc++] = "duck";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "+abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (strcmp (argv[0], "program") == 0);
       ASSERT (strcmp (argv[1], "donald") == 0);
       ASSERT (strcmp (argv[2], "-p") == 0);
@@ -733,6 +762,7 @@ test_getopt (void)
       ASSERT (strcmp (argv[4], "duck") == 0);
       ASSERT (strcmp (argv[5], "-a") == 0);
       ASSERT (strcmp (argv[6], "bar") == 0);
+      ASSERT (argv[7] == NULL);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value == NULL);
@@ -751,14 +781,15 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "-+";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "+abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value == NULL);
@@ -779,7 +810,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[20];
+      const char *argv[20];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -793,10 +824,11 @@ test_getopt (void)
       argv[argc++] = "-q";
       argv[argc++] = "johnny";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "+abp:q:",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
       ASSERT (strcmp (argv[0], "program") == 0);
       ASSERT (strcmp (argv[1], "donald") == 0);
       ASSERT (strcmp (argv[2], "-p") == 0);
@@ -809,6 +841,7 @@ test_getopt (void)
       ASSERT (strcmp (argv[9], "-q") == 0);
       ASSERT (strcmp (argv[10], "johnny") == 0);
       ASSERT (strcmp (argv[11], "bar") == 0);
+      ASSERT (argv[12] == NULL);
       ASSERT (a_seen == 0);
       ASSERT (b_seen == 0);
       ASSERT (p_value == NULL);
@@ -829,7 +862,7 @@ test_getopt (void)
       const char *non_options[10];
       int unrecognized = 0;
       int argc = 0;
-      char *argv[10];
+      const char *argv[10];
 
       argv[argc++] = "program";
       argv[argc++] = "donald";
@@ -838,45 +871,46 @@ test_getopt (void)
       argv[argc++] = "duck";
       argv[argc++] = "-a";
       argv[argc++] = "bar";
+      argv[argc] = NULL;
       optind = start;
       getopt_loop (argc, argv, "abp:q:+",
-                  &a_seen, &b_seen, &p_value, &q_value,
-                  &non_options_count, non_options, &unrecognized);
-      /* See comment in getopt.c:
-         glibc gets a LSB-compliant getopt.
-         Standalone applications get a POSIX-compliant getopt.  */
-#if defined __GETOPT_PREFIX || !(__GLIBC__ >= 2 || defined __MINGW32__)
-      /* Using getopt from gnulib or from a non-glibc system.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "donald") == 0);
-      ASSERT (strcmp (argv[2], "-p") == 0);
-      ASSERT (strcmp (argv[3], "billy") == 0);
-      ASSERT (strcmp (argv[4], "duck") == 0);
-      ASSERT (strcmp (argv[5], "-a") == 0);
-      ASSERT (strcmp (argv[6], "bar") == 0);
-      ASSERT (a_seen == 0);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value == NULL);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 1);
-#else
-      /* Using getopt from glibc.  */
-      ASSERT (strcmp (argv[0], "program") == 0);
-      ASSERT (strcmp (argv[1], "-p") == 0);
-      ASSERT (strcmp (argv[2], "billy") == 0);
-      ASSERT (strcmp (argv[3], "-a") == 0);
-      ASSERT (strcmp (argv[4], "donald") == 0);
-      ASSERT (strcmp (argv[5], "duck") == 0);
-      ASSERT (strcmp (argv[6], "bar") == 0);
-      ASSERT (a_seen == 1);
-      ASSERT (b_seen == 0);
-      ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
-      ASSERT (q_value == NULL);
-      ASSERT (non_options_count == 0);
-      ASSERT (unrecognized == 0);
-      ASSERT (optind == 4);
-#endif
+                   &a_seen, &b_seen, &p_value, &q_value,
+                   &non_options_count, non_options, &unrecognized);
+      if (posixly)
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "donald") == 0);
+          ASSERT (strcmp (argv[2], "-p") == 0);
+          ASSERT (strcmp (argv[3], "billy") == 0);
+          ASSERT (strcmp (argv[4], "duck") == 0);
+          ASSERT (strcmp (argv[5], "-a") == 0);
+          ASSERT (strcmp (argv[6], "bar") == 0);
+          ASSERT (argv[7] == NULL);
+          ASSERT (a_seen == 0);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value == NULL);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 1);
+        }
+      else
+        {
+          ASSERT (strcmp (argv[0], "program") == 0);
+          ASSERT (strcmp (argv[1], "-p") == 0);
+          ASSERT (strcmp (argv[2], "billy") == 0);
+          ASSERT (strcmp (argv[3], "-a") == 0);
+          ASSERT (strcmp (argv[4], "donald") == 0);
+          ASSERT (strcmp (argv[5], "duck") == 0);
+          ASSERT (strcmp (argv[6], "bar") == 0);
+          ASSERT (argv[7] == NULL);
+          ASSERT (a_seen == 1);
+          ASSERT (b_seen == 0);
+          ASSERT (p_value != NULL && strcmp (p_value, "billy") == 0);
+          ASSERT (q_value == NULL);
+          ASSERT (non_options_count == 0);
+          ASSERT (unrecognized == 0);
+          ASSERT (optind == 4);
+        }
     }
 }