1/* getopt_long and getopt_long_only entry points for GNU getopt. 2Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, 31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software 4Foundation, Inc. 5 6NOTE: The canonical source of this file is maintained with the GNU C Library. 7Bugs can be reported to bug-glibc@gnu.org. 8 9This program is free software; you can redistribute it and/or modify it 10under the terms of the GNU General Public License as published by the 11Free Software Foundation; either version 2, or (at your option) any 12later version. 13 14This program is distributed in the hope that it will be useful, 15but WITHOUT ANY WARRANTY; without even the implied warranty of 16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17GNU General Public License for more details. 18 19You should have received a copy of the GNU General Public License along with 20this program; see the file COPYING. If not, write to the Free Software 21Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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#define GETOPT_INTERFACE_VERSION 2 48#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 49#include <gnu-versions.h> 50#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION 51#define ELIDE_CODE 52#endif 53#endif 54 55#ifndef ELIDE_CODE 56 57 58/* This needs to come after some library #include 59 to get __GNU_LIBRARY__ defined. */ 60#ifdef __GNU_LIBRARY__ 61#include <stdlib.h> 62#endif 63 64#ifndef NULL 65#define NULL 0 66#endif 67 68int 69getopt_long (int argc, char *const *argv, const char *options, 70 const struct option *long_options, int *opt_index) 71{ 72 return _getopt_internal (argc, argv, options, long_options, opt_index, 0); 73} 74 75/* Like getopt_long, but '-' as well as '--' can indicate a long option. 76 If an option that starts with '-' (not '--') doesn't match a long option, 77 but does match a short option, it is parsed as a short option 78 instead. */ 79 80int 81getopt_long_only (int argc, char *const *argv, const char *options, 82 const struct option *long_options, int *opt_index) 83{ 84 return _getopt_internal (argc, argv, options, long_options, opt_index, 1); 85} 86 87 88#endif /* Not ELIDE_CODE. */ 89 90#ifdef TEST 91 92#include <stdio.h> 93 94int 95main (int argc, char **argv) 96{ 97 int c; 98 int digit_optind = 0; 99 100 while (1) 101 { 102 int this_option_optind = optind ? optind : 1; 103 int option_index = 0; 104 static struct option long_options[] = 105 { 106 {"add", 1, 0, 0}, 107 {"append", 0, 0, 0}, 108 {"delete", 1, 0, 0}, 109 {"verbose", 0, 0, 0}, 110 {"create", 0, 0, 0}, 111 {"file", 1, 0, 0}, 112 {0, 0, 0, 0} 113 }; 114 115 c = getopt_long (argc, argv, "abc:d:0123456789", 116 long_options, &option_index); 117 if (c == -1) 118 break; 119 120 switch (c) 121 { 122 case 0: 123 printf ("option %s", long_options[option_index].name); 124 if (optarg) 125 printf (" with arg %s", optarg); 126 printf ("\n"); 127 break; 128 129 case '0': 130 case '1': 131 case '2': 132 case '3': 133 case '4': 134 case '5': 135 case '6': 136 case '7': 137 case '8': 138 case '9': 139 if (digit_optind != 0 && digit_optind != this_option_optind) 140 printf ("digits occur in two different argv-elements.\n"); 141 digit_optind = this_option_optind; 142 printf ("option %c\n", c); 143 break; 144 145 case 'a': 146 printf ("option a\n"); 147 break; 148 149 case 'b': 150 printf ("option b\n"); 151 break; 152 153 case 'c': 154 printf ("option c with value `%s'\n", optarg); 155 break; 156 157 case 'd': 158 printf ("option d with value `%s'\n", optarg); 159 break; 160 161 case '?': 162 break; 163 164 default: 165 printf ("?? getopt returned character code 0%o ??\n", c); 166 } 167 } 168 169 if (optind < argc) 170 { 171 printf ("non-option ARGV-elements: "); 172 while (optind < argc) 173 printf ("%s ", argv[optind++]); 174 printf ("\n"); 175 } 176 177 exit (0); 178} 179 180#endif /* TEST */ 181