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