1/* 2 NOTE: 3 I cannot get the vanilla getopt code to work (i.e. compile only what 4 is needed and not duplicate symbols found in the standard library) 5 on all the platforms that FLAC supports. In particular the gating 6 of code with the ELIDE_CODE #define is not accurate enough on systems 7 that are POSIX but not glibc. If someone has a patch that works on 8 GNU/Linux, Darwin, AND Solaris please submit it on the project page: 9 http://sourceforge.net/projects/flac 10 11 In the meantime I have munged the global symbols and removed gates 12 around code, while at the same time trying to touch the original as 13 little as possible. 14*/ 15/* getopt_long and getopt_long_only entry points for GNU getopt. 16 Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 17 Free Software Foundation, Inc. 18 This file is part of the GNU C Library. 19 20 The GNU C Library is free software; you can redistribute it and/or 21 modify it under the terms of the GNU Library General Public License as 22 published by the Free Software Foundation; either version 2 of the 23 License, or (at your option) any later version. 24 25 The GNU C Library is distributed in the hope that it will be useful, 26 but WITHOUT ANY WARRANTY; without even the implied warranty of 27 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 28 Library General Public License for more details. 29 30 You should have received a copy of the GNU Library General Public 31 License along with the GNU C Library; see the file COPYING.LIB. If not, 32 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 33 Boston, MA 02111-1307, USA. */ 34 35#if HAVE_CONFIG_H 36# include <config.h> 37#endif 38 39#include "share/getopt.h" 40/*[JEC] was:#include "getopt.h"*/ 41 42#if !defined __STDC__ || !__STDC__ 43/* This is a separate conditional since some stdc systems 44 reject `defined (const)'. */ 45#ifndef const 46#define const 47#endif 48#endif 49 50#include <stdio.h> 51 52/* Comment out all this code if we are using the GNU C Library, and are not 53 actually compiling the library itself. This code is part of the GNU C 54 Library, but also included in many other GNU distributions. Compiling 55 and linking in this code is a waste when using the GNU C library 56 (especially if it is a shared library). Rather than having every GNU 57 program understand `configure --with-gnu-libc' and omit the object files, 58 it is simpler to just do this in the source for each such file. */ 59 60#define GETOPT_INTERFACE_VERSION 2 61#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 62#include <gnu-versions.h> 63#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION 64#define ELIDE_CODE 65#endif 66#endif 67 68#if 1 69/*[JEC] was:#ifndef ELIDE_CODE*/ 70 71 72/* This needs to come after some library #include 73 to get __GNU_LIBRARY__ defined. */ 74#ifdef __GNU_LIBRARY__ 75#include <stdlib.h> 76#endif 77 78#ifndef NULL 79#define NULL 0 80#endif 81 82int 83share__getopt_long (argc, argv, options, long_options, opt_index) 84 int argc; 85 char *const *argv; 86 const char *options; 87 const struct share__option *long_options; 88 int *opt_index; 89{ 90 return share___getopt_internal (argc, argv, options, long_options, opt_index, 0); 91} 92 93/* Like share__getopt_long, but '-' as well as '--' can indicate a long option. 94 If an option that starts with '-' (not '--') doesn't match a long option, 95 but does match a short option, it is parsed as a short option 96 instead. */ 97 98int 99share__getopt_long_only (argc, argv, options, long_options, opt_index) 100 int argc; 101 char *const *argv; 102 const char *options; 103 const struct share__option *long_options; 104 int *opt_index; 105{ 106 return share___getopt_internal (argc, argv, options, long_options, opt_index, 1); 107} 108 109 110#endif /* Not ELIDE_CODE. */ 111 112#ifdef TEST 113 114#include <stdio.h> 115 116int 117main (argc, argv) 118 int argc; 119 char **argv; 120{ 121 int c; 122 int digit_optind = 0; 123 124 while (1) 125 { 126 int this_option_optind = share__optind ? share__optind : 1; 127 int option_index = 0; 128 static struct share__option long_options[] = 129 { 130 {"add", 1, 0, 0}, 131 {"append", 0, 0, 0}, 132 {"delete", 1, 0, 0}, 133 {"verbose", 0, 0, 0}, 134 {"create", 0, 0, 0}, 135 {"file", 1, 0, 0}, 136 {0, 0, 0, 0} 137 }; 138 139 c = share__getopt_long (argc, argv, "abc:d:0123456789", 140 long_options, &option_index); 141 if (c == -1) 142 break; 143 144 switch (c) 145 { 146 case 0: 147 printf ("option %s", long_options[option_index].name); 148 if (share__optarg) 149 printf (" with arg %s", share__optarg); 150 printf ("\n"); 151 break; 152 153 case '0': 154 case '1': 155 case '2': 156 case '3': 157 case '4': 158 case '5': 159 case '6': 160 case '7': 161 case '8': 162 case '9': 163 if (digit_optind != 0 && digit_optind != this_option_optind) 164 printf ("digits occur in two different argv-elements.\n"); 165 digit_optind = this_option_optind; 166 printf ("option %c\n", c); 167 break; 168 169 case 'a': 170 printf ("option a\n"); 171 break; 172 173 case 'b': 174 printf ("option b\n"); 175 break; 176 177 case 'c': 178 printf ("option c with value `%s'\n", share__optarg); 179 break; 180 181 case 'd': 182 printf ("option d with value `%s'\n", share__optarg); 183 break; 184 185 case '?': 186 break; 187 188 default: 189 printf ("?? getopt returned character code 0%o ??\n", c); 190 } 191 } 192 193 if (share__optind < argc) 194 { 195 printf ("non-option ARGV-elements: "); 196 while (share__optind < argc) 197 printf ("%s ", argv[share__optind++]); 198 printf ("\n"); 199 } 200 201 exit (0); 202} 203 204#endif /* TEST */ 205