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