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