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 Library General Public License as 8 published by the Free Software Foundation; either version 2 of the 9 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 Library General Public License for more details. 15 16 You should have received a copy of the GNU Library General Public 17 License along with the GNU C Library; see the file COPYING.LIB. If not, 18 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 19 Boston, MA 02111-1307, USA. */ 20 21#ifdef HAVE_CONFIG_H 22#include <config.h> 23#endif 24 25#include "getopt.h" 26 27#if !defined __STDC__ || !__STDC__ 28/* This is a separate conditional since some stdc systems 29 reject `defined (const)'. */ 30#ifndef const 31#define const 32#endif 33#endif 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 66int 67getopt_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 82int 83getopt_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 100int 101main (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