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 NOTE: The canonical source of this file is maintained with the GNU C Library. 5 Bugs can be reported to bug-glibc@gnu.org. 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 Foundation, 19 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 20 21 #ifdef HAVE_CONFIG_H 22 #include <config.h> 23 #else 24 #if !defined __STDC__ || !__STDC__ 25 /* This is a separate conditional since some stdc systems 26 reject `defined (const)'. */ 27 #ifndef const 28 #define const 29 #endif 30 #endif 31 #endif 32 33 #include "getopt.h" 34 35 #include <stdio.h> 36 37 /* Comment out all this code if we are using the GNU C Library, and are not 38 actually compiling the library itself. This code is part of the GNU C 39 Library, but also included in many other GNU distributions. Compiling 40 and linking in this code is a waste when using the GNU C library 41 (especially if it is a shared library). Rather than having every GNU 42 program understand `configure --with-gnu-libc' and omit the object files, 43 it is simpler to just do this in the source for each such file. */ 44 45 #define GETOPT_INTERFACE_VERSION 2 46 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 47 #include <gnu-versions.h> 48 #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION 49 #define ELIDE_CODE 50 #endif 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 (argc, argv, options, long_options, opt_index) 68 int argc; 69 char *const *argv; 70 const char *options; 71 const struct option *long_options; 72 int *opt_index; 73 { 74 return _getopt_internal (argc, argv, options, long_options, opt_index, 0); 75 } 76 77 /* Like getopt_long, but '-' as well as '--' can indicate a long option. 78 If an option that starts with '-' (not '--') doesn't match a long option, 79 but does match a short option, it is parsed as a short option 80 instead. */ 81 82 int 83 getopt_long_only (argc, argv, options, long_options, opt_index) 84 int argc; 85 char *const *argv; 86 const char *options; 87 const struct option *long_options; 88 int *opt_index; 89 { 90 return _getopt_internal (argc, argv, options, long_options, opt_index, 1); 91 } 92 93 94 #endif /* Not ELIDE_CODE. */ 95 96 #ifdef TEST 97 98 #include <stdio.h> 99 100 int 101 main (argc, argv) 102 int argc; 103 char **argv; 104 { 105 int c; 106 int digit_optind = 0; 107 108 while (1) 109 { 110 int this_option_optind = optind ? optind : 1; 111 int option_index = 0; 112 static struct option long_options[] = 113 { 114 {"add", 1, 0, 0}, 115 {"append", 0, 0, 0}, 116 {"delete", 1, 0, 0}, 117 {"verbose", 0, 0, 0}, 118 {"create", 0, 0, 0}, 119 {"file", 1, 0, 0}, 120 {0, 0, 0, 0} 121 }; 122 123 c = getopt_long (argc, argv, "abc:d:0123456789", 124 long_options, &option_index); 125 if (c == -1) 126 break; 127 128 switch (c) 129 { 130 case 0: 131 printf ("option %s", long_options[option_index].name); 132 if (optarg) 133 printf (" with arg %s", optarg); 134 printf ("\n"); 135 break; 136 137 case '0': 138 case '1': 139 case '2': 140 case '3': 141 case '4': 142 case '5': 143 case '6': 144 case '7': 145 case '8': 146 case '9': 147 if (digit_optind != 0 && digit_optind != this_option_optind) 148 printf ("digits occur in two different argv-elements.\n"); 149 digit_optind = this_option_optind; 150 printf ("option %c\n", c); 151 break; 152 153 case 'a': 154 printf ("option a\n"); 155 break; 156 157 case 'b': 158 printf ("option b\n"); 159 break; 160 161 case 'c': 162 printf ("option c with value `%s'\n", optarg); 163 break; 164 165 case 'd': 166 printf ("option d with value `%s'\n", optarg); 167 break; 168 169 case '?': 170 break; 171 172 default: 173 printf ("?? getopt returned character code 0%o ??\n", c); 174 } 175 } 176 177 if (optind < argc) 178 { 179 printf ("non-option ARGV-elements: "); 180 while (optind < argc) 181 printf ("%s ", argv[optind++]); 182 printf ("\n"); 183 } 184 185 exit (0); 186 } 187 188 #endif /* TEST */ 189