LibOFX
|
00001 /* getopt_long and getopt_long_only entry points for GNU getopt. 00002 Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 00003 Free Software Foundation, Inc. 00004 This file is part of the GNU C Library. 00005 00006 The GNU C Library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Lesser General Public 00008 License as published by the Free Software Foundation; either 00009 version 2.1 of the License, or (at your option) any later version. 00010 00011 The GNU C Library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Lesser General Public License for more details. 00015 00016 You should have received a copy of the GNU Lesser General Public 00017 License along with the GNU C Library; if not, write to the Free 00018 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 00019 02111-1307 USA. */ 00020 00021 #ifdef HAVE_CONFIG_H 00022 #include <config.h> 00023 #endif 00024 00025 #include "getopt.h" 00026 00027 #if !defined __STDC__ || !__STDC__ 00028 /* This is a separate conditional since some stdc systems 00029 reject `defined (const)'. */ 00030 #ifndef const 00031 #define const 00032 #endif 00033 #endif 00034 00035 #include <stdio.h> 00036 00037 /* Comment out all this code if we are using the GNU C Library, and are not 00038 actually compiling the library itself. This code is part of the GNU C 00039 Library, but also included in many other GNU distributions. Compiling 00040 and linking in this code is a waste when using the GNU C library 00041 (especially if it is a shared library). Rather than having every GNU 00042 program understand `configure --with-gnu-libc' and omit the object files, 00043 it is simpler to just do this in the source for each such file. */ 00044 00045 #define GETOPT_INTERFACE_VERSION 2 00046 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 00047 #include <gnu-versions.h> 00048 #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION 00049 #define ELIDE_CODE 00050 #endif 00051 #endif 00052 00053 #ifndef ELIDE_CODE 00054 00055 00056 /* This needs to come after some library #include 00057 to get __GNU_LIBRARY__ defined. */ 00058 #ifdef __GNU_LIBRARY__ 00059 #include <stdlib.h> 00060 #endif 00061 00062 #ifndef NULL 00063 #define NULL 0 00064 #endif 00065 00066 int 00067 getopt_long (argc, argv, options, long_options, opt_index) 00068 int argc; 00069 char *const *argv; 00070 const char *options; 00071 const struct option *long_options; 00072 int *opt_index; 00073 { 00074 return _getopt_internal (argc, argv, options, long_options, opt_index, 0); 00075 } 00076 00077 /* Like getopt_long, but '-' as well as '--' can indicate a long option. 00078 If an option that starts with '-' (not '--') doesn't match a long option, 00079 but does match a short option, it is parsed as a short option 00080 instead. */ 00081 00082 int 00083 getopt_long_only (argc, argv, options, long_options, opt_index) 00084 int argc; 00085 char *const *argv; 00086 const char *options; 00087 const struct option *long_options; 00088 int *opt_index; 00089 { 00090 return _getopt_internal (argc, argv, options, long_options, opt_index, 1); 00091 } 00092 00093 00094 #endif /* Not ELIDE_CODE. */ 00095 00096 #ifdef TEST 00097 00098 #include <stdio.h> 00099 00100 int 00101 main (argc, argv) 00102 int argc; 00103 char **argv; 00104 { 00105 int c; 00106 int digit_optind = 0; 00107 00108 while (1) 00109 { 00110 int this_option_optind = optind ? optind : 1; 00111 int option_index = 0; 00112 static struct option long_options[] = 00113 { 00114 {"add", 1, 0, 0}, 00115 {"append", 0, 0, 0}, 00116 {"delete", 1, 0, 0}, 00117 {"verbose", 0, 0, 0}, 00118 {"create", 0, 0, 0}, 00119 {"file", 1, 0, 0}, 00120 {0, 0, 0, 0} 00121 }; 00122 00123 c = getopt_long (argc, argv, "abc:d:0123456789", 00124 long_options, &option_index); 00125 if (c == -1) 00126 break; 00127 00128 switch (c) 00129 { 00130 case 0: 00131 printf ("option %s", long_options[option_index].name); 00132 if (optarg) 00133 printf (" with arg %s", optarg); 00134 printf ("\n"); 00135 break; 00136 00137 case '0': 00138 case '1': 00139 case '2': 00140 case '3': 00141 case '4': 00142 case '5': 00143 case '6': 00144 case '7': 00145 case '8': 00146 case '9': 00147 if (digit_optind != 0 && digit_optind != this_option_optind) 00148 printf ("digits occur in two different argv-elements.\n"); 00149 digit_optind = this_option_optind; 00150 printf ("option %c\n", c); 00151 break; 00152 00153 case 'a': 00154 printf ("option a\n"); 00155 break; 00156 00157 case 'b': 00158 printf ("option b\n"); 00159 break; 00160 00161 case 'c': 00162 printf ("option c with value `%s'\n", optarg); 00163 break; 00164 00165 case 'd': 00166 printf ("option d with value `%s'\n", optarg); 00167 break; 00168 00169 case '?': 00170 break; 00171 00172 default: 00173 printf ("?? getopt returned character code 0%o ??\n", c); 00174 } 00175 } 00176 00177 if (optind < argc) 00178 { 00179 printf ("non-option ARGV-elements: "); 00180 while (optind < argc) 00181 printf ("%s ", argv[optind++]); 00182 printf ("\n"); 00183 } 00184 00185 exit (0); 00186 } 00187 00188 #endif /* TEST */