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