1 /* getopt_long and getopt_long_only entry points for GNU getopt. 2 Copyright (C) 1987-2018 Free Software Foundation, Inc. 3 4 NOTE: This source is derived from an old version taken from the GNU C 5 Library (glibc). 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, 20 USA. */ 21 22 #ifdef HAVE_CONFIG_H 23 #include <config.h> 24 #endif 25 26 #if !defined __STDC__ || !__STDC__ 27 /* This is a separate conditional since some stdc systems 28 reject `defined (const)'. */ 29 #ifndef const 30 #define const 31 #endif 32 #endif 33 34 #include <stdio.h> 35 36 #include "getopt.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 67 int 68 getopt_long (int argc, char *const *argv, const char *options, 69 const struct option *long_options, int *opt_index) 70 { 71 return _getopt_internal (argc, argv, options, long_options, opt_index, 0); 72 } 73 74 /* Like getopt_long, but '-' as well as '--' can indicate a long option. 75 If an option that starts with '-' (not '--') doesn't match a long option, 76 but does match a short option, it is parsed as a short option 77 instead. */ 78 79 int 80 getopt_long_only (int argc, char *const *argv, const char *options, 81 const struct option *long_options, int *opt_index) 82 { 83 return _getopt_internal (argc, argv, options, long_options, opt_index, 1); 84 } 85 86 87 #endif /* Not ELIDE_CODE. */ 88 89 #ifdef TEST 90 91 #include <stdio.h> 92 93 int 94 main (int argc, char **argv) 95 { 96 int c; 97 int digit_optind = 0; 98 99 while (1) 100 { 101 int this_option_optind = optind ? optind : 1; 102 int option_index = 0; 103 static struct option long_options[] = 104 { 105 {"add", 1, 0, 0}, 106 {"append", 0, 0, 0}, 107 {"delete", 1, 0, 0}, 108 {"verbose", 0, 0, 0}, 109 {"create", 0, 0, 0}, 110 {"file", 1, 0, 0}, 111 {0, 0, 0, 0} 112 }; 113 114 c = getopt_long (argc, argv, "abc:d:0123456789", 115 long_options, &option_index); 116 if (c == -1) 117 break; 118 119 switch (c) 120 { 121 case 0: 122 printf ("option %s", long_options[option_index].name); 123 if (optarg) 124 printf (" with arg %s", optarg); 125 printf ("\n"); 126 break; 127 128 case '0': 129 case '1': 130 case '2': 131 case '3': 132 case '4': 133 case '5': 134 case '6': 135 case '7': 136 case '8': 137 case '9': 138 if (digit_optind != 0 && digit_optind != this_option_optind) 139 printf ("digits occur in two different argv-elements.\n"); 140 digit_optind = this_option_optind; 141 printf ("option %c\n", c); 142 break; 143 144 case 'a': 145 printf ("option a\n"); 146 break; 147 148 case 'b': 149 printf ("option b\n"); 150 break; 151 152 case 'c': 153 printf ("option c with value `%s'\n", optarg); 154 break; 155 156 case 'd': 157 printf ("option d with value `%s'\n", optarg); 158 break; 159 160 case '?': 161 break; 162 163 default: 164 printf ("?? getopt returned character code 0%o ??\n", c); 165 } 166 } 167 168 if (optind < argc) 169 { 170 printf ("non-option ARGV-elements: "); 171 while (optind < argc) 172 printf ("%s ", argv[optind++]); 173 printf ("\n"); 174 } 175 176 exit (0); 177 } 178 179 #endif /* TEST */ 180