1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* getopt_long and getopt_long_only entry points for GNU getopt.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 1987-1994, 1996-1998, 2004, 2006, 2009-2012 Free Software
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of the GNU C Library.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef _LIBC
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <getopt.h>
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include <config.h>
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "getopt.h"
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getopt_int.h"
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This needs to come after some library #include
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   to get __GNU_LIBRARY__ defined.  */
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef __GNU_LIBRARY__
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h>
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef NULL
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define NULL 0
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang             const struct option *long_options, int *opt_index)
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return _getopt_internal (argc, (char **) argv, options, long_options,
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           opt_index, 0, 0);
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_getopt_long_r (int argc, char **argv, const char *options,
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                const struct option *long_options, int *opt_index,
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                struct _getopt_data *d)
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             0, d, 0);
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Like getopt_long, but '-' as well as '--' can indicate a long option.
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   If an option that starts with '-' (not '--') doesn't match a long option,
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but does match a short option, it is parsed as a short option
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   instead.  */
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectgetopt_long_only (int argc, char *__getopt_argv_const *argv,
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  const char *options,
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                  const struct option *long_options, int *opt_index)
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return _getopt_internal (argc, (char **) argv, options, long_options,
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           opt_index, 1, 0);
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project_getopt_long_only_r (int argc, char **argv, const char *options,
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     const struct option *long_options, int *opt_index,
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                     struct _getopt_data *d)
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                             1, d, 0);
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef TEST
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdio.h>
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (int argc, char **argv)
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int c;
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  int digit_optind = 0;
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (1)
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int this_option_optind = optind ? optind : 1;
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      int option_index = 0;
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang      static const struct option long_options[] =
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      {
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {"add", 1, 0, 0},
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {"append", 0, 0, 0},
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {"delete", 1, 0, 0},
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {"verbose", 0, 0, 0},
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {"create", 0, 0, 0},
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {"file", 1, 0, 0},
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {0, 0, 0, 0}
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      };
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      c = getopt_long (argc, argv, "abc:d:0123456789",
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       long_options, &option_index);
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (c == -1)
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        break;
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      switch (c)
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 0:
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option %s", long_options[option_index].name);
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (optarg)
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang            printf (" with arg %s", optarg);
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("\n");
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '0':
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '1':
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '2':
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '3':
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '4':
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '5':
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '6':
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '7':
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '8':
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '9':
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (digit_optind != 0 && digit_optind != this_option_optind)
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang            printf ("digits occur in two different argv-elements.\n");
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          digit_optind = this_option_optind;
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option %c\n", c);
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'a':
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option a\n");
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'b':
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option b\n");
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'c':
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option c with value '%s'\n", optarg);
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case 'd':
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("option d with value '%s'\n", optarg);
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang        case '?':
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang          break;
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang        default:
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang          printf ("?? getopt returned character code 0%o ??\n", c);
15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (optind < argc)
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      printf ("non-option ARGV-elements: ");
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      while (optind < argc)
16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang        printf ("%s ", argv[optind++]);
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      printf ("\n");
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  exit (0);
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* TEST */
171