~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to getopt1.c

  • Committer: Arnold D. Robbins
  • Date: 2016-12-22 15:23:16 UTC
  • mfrom: (731.1.11)
  • mto: (731.14.2) (1056.1.1)
  • mto: This revision was merged to the branch mainline in revision 742.
  • Revision ID: git-v1:293b5a86a9053668773e75b35682c41ca64e0db6
Merge branch 'master' into feature/andy

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* getopt_long and getopt_long_only entry points for GNU getopt.
2
 
   Copyright (C) 1987-2016 Free Software Foundation, Inc.
3
 
   This file is part of the GNU C Library.
4
 
 
5
 
   The GNU C Library is free software; you can redistribute it and/or
6
 
   modify it under the terms of the GNU Lesser General Public
7
 
   License as published by the Free Software Foundation; either
8
 
   version 2.1 of the License, or (at your option) any later version.
9
 
 
10
 
   The GNU C Library is distributed in the hope that it will be useful,
11
 
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 
   Lesser General Public License for more details.
14
 
 
15
 
   You should have received a copy of the GNU Lesser General Public
16
 
   License along with the GNU C Library; if not, see
17
 
   <http://www.gnu.org/licenses/>.  */
18
 
 
19
 
#ifdef HAVE_CONFIG_H
20
 
#include <config.h>
21
 
#endif
22
 
 
23
 
#ifdef _LIBC
24
 
# include <getopt.h>
25
 
#else
26
 
# include "getopt.h"
27
 
#endif
28
 
#include "getopt_int.h"
29
 
 
30
 
#include <stdio.h>
31
 
 
32
 
/* Comment out all this code if we are using the GNU C Library, and are not
33
 
   actually compiling the library itself.  This code is part of the GNU C
34
 
   Library, but also included in many other GNU distributions.  Compiling
35
 
   and linking in this code is a waste when using the GNU C library
36
 
   (especially if it is a shared library).  Rather than having every GNU
37
 
   program understand `configure --with-gnu-libc' and omit the object files,
38
 
   it is simpler to just do this in the source for each such file.  */
39
 
 
40
 
#define GETOPT_INTERFACE_VERSION 2
41
 
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
42
 
#include <gnu-versions.h>
43
 
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
44
 
#define ELIDE_CODE
45
 
#endif
46
 
#endif
47
 
 
48
 
/* !@#$%^&*() !!!!!!!! */
49
 
#ifdef GAWK
50
 
#undef ELIDE_CODE
51
 
#endif
52
 
 
53
 
#ifndef ELIDE_CODE
54
 
 
55
 
 
56
 
/* This needs to come after some library #include
57
 
   to get __GNU_LIBRARY__ defined.  */
58
 
#ifdef __GNU_LIBRARY__
59
 
#include <stdlib.h>
60
 
#endif
61
 
 
62
 
#ifndef NULL
63
 
#define NULL 0
64
 
#endif
65
 
 
66
 
int
67
 
getopt_long (int argc, char *const *argv, const char *options,
68
 
             const struct option *long_options, int *opt_index)
69
 
{
70
 
  return _getopt_internal (argc, argv, options, long_options, opt_index, 0, 0);
71
 
}
72
 
 
73
 
int
74
 
_getopt_long_r (int argc, char *const *argv, const char *options,
75
 
                const struct option *long_options, int *opt_index,
76
 
                struct _getopt_data *d)
77
 
{
78
 
  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
79
 
                             0, d, 0);
80
 
}
81
 
 
82
 
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
83
 
   If an option that starts with '-' (not '--') doesn't match a long option,
84
 
   but does match a short option, it is parsed as a short option
85
 
   instead.  */
86
 
 
87
 
int
88
 
getopt_long_only (int argc, char *const *argv, const char *options,
89
 
                  const struct option *long_options, int *opt_index)
90
 
{
91
 
  return _getopt_internal (argc, argv, options, long_options, opt_index, 1, 0);
92
 
}
93
 
 
94
 
int
95
 
_getopt_long_only_r (int argc, char *const *argv, const char *options,
96
 
                     const struct option *long_options, int *opt_index,
97
 
                     struct _getopt_data *d)
98
 
{
99
 
  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
100
 
                             1, d, 0);
101
 
}
102
 
 
103
 
#endif  /* Not ELIDE_CODE.  */
104
 
 
105
 
#ifdef TEST
106
 
 
107
 
#include <stdio.h>
108
 
 
109
 
int
110
 
main (int argc, char **argv)
111
 
{
112
 
  int c;
113
 
  int digit_optind = 0;
114
 
 
115
 
  while (1)
116
 
    {
117
 
      int this_option_optind = optind ? optind : 1;
118
 
      int option_index = 0;
119
 
      static struct option long_options[] =
120
 
      {
121
 
        {"add", 1, 0, 0},
122
 
        {"append", 0, 0, 0},
123
 
        {"delete", 1, 0, 0},
124
 
        {"verbose", 0, 0, 0},
125
 
        {"create", 0, 0, 0},
126
 
        {"file", 1, 0, 0},
127
 
        {0, 0, 0, 0}
128
 
      };
129
 
 
130
 
      c = getopt_long (argc, argv, "abc:d:0123456789",
131
 
                       long_options, &option_index);
132
 
      if (c == -1)
133
 
        break;
134
 
 
135
 
      switch (c)
136
 
        {
137
 
        case 0:
138
 
          printf ("option %s", long_options[option_index].name);
139
 
          if (optarg)
140
 
            printf (" with arg %s", optarg);
141
 
          printf ("\n");
142
 
          break;
143
 
 
144
 
        case '0':
145
 
        case '1':
146
 
        case '2':
147
 
        case '3':
148
 
        case '4':
149
 
        case '5':
150
 
        case '6':
151
 
        case '7':
152
 
        case '8':
153
 
        case '9':
154
 
          if (digit_optind != 0 && digit_optind != this_option_optind)
155
 
            printf ("digits occur in two different argv-elements.\n");
156
 
          digit_optind = this_option_optind;
157
 
          printf ("option %c\n", c);
158
 
          break;
159
 
 
160
 
        case 'a':
161
 
          printf ("option a\n");
162
 
          break;
163
 
 
164
 
        case 'b':
165
 
          printf ("option b\n");
166
 
          break;
167
 
 
168
 
        case 'c':
169
 
          printf ("option c with value `%s'\n", optarg);
170
 
          break;
171
 
 
172
 
        case 'd':
173
 
          printf ("option d with value `%s'\n", optarg);
174
 
          break;
175
 
 
176
 
        case '?':
177
 
          break;
178
 
 
179
 
        default:
180
 
          printf ("?? getopt returned character code 0%o ??\n", c);
181
 
        }
182
 
    }
183
 
 
184
 
  if (optind < argc)
185
 
    {
186
 
      printf ("non-option ARGV-elements: ");
187
 
      while (optind < argc)
188
 
        printf ("%s ", argv[optind++]);
189
 
      printf ("\n");
190
 
    }
191
 
 
192
 
  exit (0);
193
 
}
194
 
 
195
 
#endif /* TEST */