source: trunk/third/gcc/getopt1.c @ 11288

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