source: trunk/third/diffutils/getopt1.c @ 16149

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