Skip to content
getopt.c 39 KiB
Newer Older
#if defined _LIBC && defined USE_IN_LIBIO
                char *buf;

                __asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
                            argv[0], argv[optind]);

                if (_IO_fwide (stderr, 0) > 0)
                  __fwprintf (stderr, L"%s", buf);
                else
                  fputs (buf, stderr);

                free (buf);
#else
                fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
                         argv[0], argv[optind]);
#endif
              }
            nextchar += strlen (nextchar);
            optind++;
            return '?';
          }
        if (pfound != NULL)
          {
            option_index = indfound;
            if (*nameend)
              {
                /* Don't test has_arg with >, because some C compilers don't
                   allow it to be used on enums.  */
                if (pfound->has_arg)
                  optarg = nameend + 1;
                else
                  {
                    if (print_errors)
                      {
#if defined _LIBC && defined USE_IN_LIBIO
                        char *buf;

                        __asprintf (&buf, _("\
%s: option `-W %s' doesn't allow an argument\n"),
                                    argv[0], pfound->name);

                        if (_IO_fwide (stderr, 0) > 0)
                          __fwprintf (stderr, L"%s", buf);
                        else
                          fputs (buf, stderr);

                        free (buf);
#else
                        fprintf (stderr, _("\
%s: option `-W %s' doesn't allow an argument\n"),
                                 argv[0], pfound->name);
#endif
                      }

                    nextchar += strlen (nextchar);
                    return '?';
                  }
              }
            else if (pfound->has_arg == 1)
              {
                if (optind < argc)
                  optarg = argv[optind++];
                else
                  {
                    if (print_errors)
                      {
#if defined _LIBC && defined USE_IN_LIBIO
                        char *buf;

                        __asprintf (&buf, _("\
%s: option `%s' requires an argument\n"),
                                    argv[0], argv[optind - 1]);

                        if (_IO_fwide (stderr, 0) > 0)
                          __fwprintf (stderr, L"%s", buf);
                        else
                          fputs (buf, stderr);

                        free (buf);
#else
                        fprintf (stderr,
                                 _("%s: option `%s' requires an argument\n"),
                                 argv[0], argv[optind - 1]);
#endif
                      }
                    nextchar += strlen (nextchar);
                    return optstring[0] == ':' ? ':' : '?';
                  }
              }
            nextchar += strlen (nextchar);
            if (longind != NULL)
              *longind = option_index;
            if (pfound->flag)
              {
                *(pfound->flag) = pfound->val;
                return 0;
              }
            return pfound->val;
          }
          nextchar = NULL;
          return 'W';   /* Let the application handle it.   */
      }
    if (temp[1] == ':')
      {
        if (temp[2] == ':')
          {
            /* This is an option that accepts an argument optionally.  */
            if (*nextchar != '\0')
              {
                optarg = nextchar;
                optind++;
              }
            else
              optarg = NULL;
            nextchar = NULL;
          }
        else
          {
            /* This is an option that requires an argument.  */
            if (*nextchar != '\0')
              {
                optarg = nextchar;
                /* If we end this ARGV-element by taking the rest as an arg,
                   we must advance to the next element now.  */
                optind++;
              }
            else if (optind == argc)
              {
                if (print_errors)
                  {
                    /* 1003.2 specifies the format of this message.  */
#if defined _LIBC && defined USE_IN_LIBIO
                    char *buf;

                    __asprintf (&buf,
                                _("%s: option requires an argument -- %c\n"),
                                argv[0], c);

                    if (_IO_fwide (stderr, 0) > 0)
                      __fwprintf (stderr, L"%s", buf);
                    else
                      fputs (buf, stderr);

                    free (buf);
#else
                    fprintf (stderr,
                             _("%s: option requires an argument -- %c\n"),
                             argv[0], c);
#endif
                  }
                optopt = c;
                if (optstring[0] == ':')
                  c = ':';
                else
                  c = '?';
              }
            else
              /* We already incremented `optind' once;
                 increment it again when taking next ARGV-elt as argument.  */
              optarg = argv[optind++];
            nextchar = NULL;
          }
      }
    return c;
  }
}

int
getopt (argc, argv, optstring)
     int argc;
     char *const *argv;
     const char *optstring;
{
  return _getopt_internal (argc, argv, optstring,
                           (const struct option *) 0,
                           (int *) 0,
                           0);
}

#endif  /* Not ELIDE_CODE.  */


/* Compile with -DTEST to make an executable for use in testing
   the above definition of `getopt'.  */