1283407Sdchagin/* getopt_long and getopt_long_only entry points for GNU getopt. 2283407Sdchagin Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 3283407Sdchagin Free Software Foundation, Inc. 4283407Sdchagin This file is part of the GNU C Library. 5283407Sdchagin 6283407Sdchagin The GNU C Library is free software; you can redistribute it and/or 7283407Sdchagin modify it under the terms of the GNU Lesser General Public 8283407Sdchagin License as published by the Free Software Foundation; either 9283407Sdchagin version 2.1 of the License, or (at your option) any later version. 10283407Sdchagin 11283407Sdchagin The GNU C Library is distributed in the hope that it will be useful, 12283407Sdchagin but WITHOUT ANY WARRANTY; without even the implied warranty of 13283407Sdchagin MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14283407Sdchagin Lesser General Public License for more details. 15283407Sdchagin 16283407Sdchagin You should have received a copy of the GNU Lesser General Public 17283407Sdchagin License along with the GNU C Library; if not, write to the Free 18283407Sdchagin Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 19283407Sdchagin 02111-1307 USA. */ 20283407Sdchagin 21283407Sdchagin#ifdef HAVE_CONFIG_H 22283407Sdchagin#include <config.h> 23283407Sdchagin#endif 24283407Sdchagin 25283407Sdchagin#ifdef _LIBC 26283407Sdchagin# include <getopt.h> 27283407Sdchagin#else 28283407Sdchagin# include "getopt.h" 29283407Sdchagin#endif 30283407Sdchagin 31283407Sdchagin#if !defined __STDC__ || !__STDC__ 32283407Sdchagin/* This is a separate conditional since some stdc systems 33283407Sdchagin reject `defined (const)'. */ 34283407Sdchagin#ifndef const 35283407Sdchagin#define const 36283407Sdchagin#endif 37283407Sdchagin#endif 38283407Sdchagin 39283407Sdchagin#include <stdio.h> 40283407Sdchagin 41283407Sdchagin/* Comment out all this code if we are using the GNU C Library, and are not 42283407Sdchagin actually compiling the library itself. This code is part of the GNU C 43283407Sdchagin Library, but also included in many other GNU distributions. Compiling 44283407Sdchagin and linking in this code is a waste when using the GNU C library 45283407Sdchagin (especially if it is a shared library). Rather than having every GNU 46283407Sdchagin program understand `configure --with-gnu-libc' and omit the object files, 47283407Sdchagin it is simpler to just do this in the source for each such file. */ 48283407Sdchagin 49283407Sdchagin#define GETOPT_INTERFACE_VERSION 2 50283407Sdchagin#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 51283407Sdchagin#include <gnu-versions.h> 52283407Sdchagin#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION 53283407Sdchagin#define ELIDE_CODE 54283407Sdchagin#endif 55283407Sdchagin#endif 56283407Sdchagin 57283407Sdchagin#ifndef ELIDE_CODE 58283407Sdchagin 59283407Sdchagin 60283407Sdchagin/* This needs to come after some library #include 61283407Sdchagin to get __GNU_LIBRARY__ defined. */ 62283407Sdchagin#ifdef __GNU_LIBRARY__ 63293516Sdchagin#include <stdlib.h> 64283407Sdchagin#endif 65283407Sdchagin 66283407Sdchagin#ifndef NULL 67#define NULL 0 68#endif 69 70int 71getopt_long (argc, argv, options, long_options, opt_index) 72 int argc; 73 char *const *argv; 74 const char *options; 75 const struct option *long_options; 76 int *opt_index; 77{ 78 return _getopt_internal (argc, argv, options, long_options, opt_index, 0); 79} 80 81/* Like getopt_long, but '-' as well as '--' can indicate a long option. 82 If an option that starts with '-' (not '--') doesn't match a long option, 83 but does match a short option, it is parsed as a short option 84 instead. */ 85 86int 87getopt_long_only (argc, argv, options, long_options, opt_index) 88 int argc; 89 char *const *argv; 90 const char *options; 91 const struct option *long_options; 92 int *opt_index; 93{ 94 return _getopt_internal (argc, argv, options, long_options, opt_index, 1); 95} 96 97# ifdef _LIBC 98libc_hidden_def (getopt_long) 99libc_hidden_def (getopt_long_only) 100# endif 101 102#endif /* Not ELIDE_CODE. */ 103 104#ifdef TEST 105 106#include <stdio.h> 107 108int 109main (argc, argv) 110 int argc; 111 char **argv; 112{ 113 int c; 114 int digit_optind = 0; 115 116 while (1) 117 { 118 int this_option_optind = optind ? optind : 1; 119 int option_index = 0; 120 static struct option long_options[] = 121 { 122 {"add", 1, 0, 0}, 123 {"append", 0, 0, 0}, 124 {"delete", 1, 0, 0}, 125 {"verbose", 0, 0, 0}, 126 {"create", 0, 0, 0}, 127 {"file", 1, 0, 0}, 128 {0, 0, 0, 0} 129 }; 130 131 c = getopt_long (argc, argv, "abc:d:0123456789", 132 long_options, &option_index); 133 if (c == -1) 134 break; 135 136 switch (c) 137 { 138 case 0: 139 printf ("option %s", long_options[option_index].name); 140 if (optarg) 141 printf (" with arg %s", optarg); 142 printf ("\n"); 143 break; 144 145 case '0': 146 case '1': 147 case '2': 148 case '3': 149 case '4': 150 case '5': 151 case '6': 152 case '7': 153 case '8': 154 case '9': 155 if (digit_optind != 0 && digit_optind != this_option_optind) 156 printf ("digits occur in two different argv-elements.\n"); 157 digit_optind = this_option_optind; 158 printf ("option %c\n", c); 159 break; 160 161 case 'a': 162 printf ("option a\n"); 163 break; 164 165 case 'b': 166 printf ("option b\n"); 167 break; 168 169 case 'c': 170 printf ("option c with value `%s'\n", optarg); 171 break; 172 173 case 'd': 174 printf ("option d with value `%s'\n", optarg); 175 break; 176 177 case '?': 178 break; 179 180 default: 181 printf ("?? getopt returned character code 0%o ??\n", c); 182 } 183 } 184 185 if (optind < argc) 186 { 187 printf ("non-option ARGV-elements: "); 188 while (optind < argc) 189 printf ("%s ", argv[optind++]); 190 printf ("\n"); 191 } 192 193 exit (0); 194} 195 196#endif /* TEST */ 197