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,2004 3 Free Software Foundation, Inc. 4 This file is part of the GNU C Library. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 This program 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 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License along 17 with this program; if not, write to the Free Software Foundation, 18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19 20#ifdef HAVE_CONFIG_H 21# include <config.h> 22#endif 23 24#ifdef _LIBC 25# include <getopt.h> 26#else 27# include "getopt.h" 28#endif 29#include "getopt_int.h" 30 31#include <stdio.h> 32 33/* This needs to come after some library #include 34 to get __GNU_LIBRARY__ defined. */ 35#ifdef __GNU_LIBRARY__ 36#include <stdlib.h> 37#endif 38 39#ifndef NULL 40#define NULL 0 41#endif 42 43int 44getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, 45 const struct option *long_options, int *opt_index) 46{ 47 return _getopt_internal (argc, (char **) argv, options, long_options, 48 opt_index, 0, 0); 49} 50 51int 52_getopt_long_r (int argc, char **argv, const char *options, 53 const struct option *long_options, int *opt_index, 54 struct _getopt_data *d) 55{ 56 return _getopt_internal_r (argc, argv, options, long_options, opt_index, 57 0, 0, d); 58} 59 60/* Like getopt_long, but '-' as well as '--' can indicate a long option. 61 If an option that starts with '-' (not '--') doesn't match a long option, 62 but does match a short option, it is parsed as a short option 63 instead. */ 64 65int 66getopt_long_only (int argc, char *__getopt_argv_const *argv, 67 const char *options, 68 const struct option *long_options, int *opt_index) 69{ 70 return _getopt_internal (argc, (char **) argv, options, long_options, 71 opt_index, 1, 0); 72} 73 74int 75_getopt_long_only_r (int argc, char **argv, const char *options, 76 const struct option *long_options, int *opt_index, 77 struct _getopt_data *d) 78{ 79 return _getopt_internal_r (argc, argv, options, long_options, opt_index, 80 1, 0, d); 81} 82 83 84#ifdef TEST 85 86#include <stdio.h> 87 88int 89main (int argc, char **argv) 90{ 91 int c; 92 int digit_optind = 0; 93 94 while (1) 95 { 96 int this_option_optind = optind ? optind : 1; 97 int option_index = 0; 98 static struct option long_options[] = 99 { 100 {"add", 1, 0, 0}, 101 {"append", 0, 0, 0}, 102 {"delete", 1, 0, 0}, 103 {"verbose", 0, 0, 0}, 104 {"create", 0, 0, 0}, 105 {"file", 1, 0, 0}, 106 {0, 0, 0, 0} 107 }; 108 109 c = getopt_long (argc, argv, "abc:d:0123456789", 110 long_options, &option_index); 111 if (c == -1) 112 break; 113 114 switch (c) 115 { 116 case 0: 117 printf ("option %s", long_options[option_index].name); 118 if (optarg) 119 printf (" with arg %s", optarg); 120 printf ("\n"); 121 break; 122 123 case '0': 124 case '1': 125 case '2': 126 case '3': 127 case '4': 128 case '5': 129 case '6': 130 case '7': 131 case '8': 132 case '9': 133 if (digit_optind != 0 && digit_optind != this_option_optind) 134 printf ("digits occur in two different argv-elements.\n"); 135 digit_optind = this_option_optind; 136 printf ("option %c\n", c); 137 break; 138 139 case 'a': 140 printf ("option a\n"); 141 break; 142 143 case 'b': 144 printf ("option b\n"); 145 break; 146 147 case 'c': 148 printf ("option c with value `%s'\n", optarg); 149 break; 150 151 case 'd': 152 printf ("option d with value `%s'\n", optarg); 153 break; 154 155 case '?': 156 break; 157 158 default: 159 printf ("?? getopt returned character code 0%o ??\n", c); 160 } 161 } 162 163 if (optind < argc) 164 { 165 printf ("non-option ARGV-elements: "); 166 while (optind < argc) 167 printf ("%s ", argv[optind++]); 168 printf ("\n"); 169 } 170 171 exit (0); 172} 173 174#endif /* TEST */ 175