X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fgetopt.c;h=e150496ae22989f29a909ca5f33c9fc74fa0a29e;hb=71e181512d1cd61d3865f93f5b85b208b5720ba5;hp=2a35ab278852dcc5004e43143b7af31ef08e4c77;hpb=502af2167f7c218366666ca4944bd7cc54b5b19a;p=oweals%2Fgnunet.git diff --git a/src/util/getopt.c b/src/util/getopt.c index 2a35ab278..e150496ae 100644 --- a/src/util/getopt.c +++ b/src/util/getopt.c @@ -3,7 +3,7 @@ "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 + Copyright Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. NOTE: The canonical source of this file is maintained with the GNU C Library. @@ -11,7 +11,7 @@ Bugs can be reported to bug-glibc@prep.ai.mit.edu. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any +Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -21,12 +21,12 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This code was heavily modified for GNUnet. -Copyright (C) 2006 Christian Grothoff +Copyright Copyright (C) 2006 Christian Grothoff */ /** @@ -37,10 +37,8 @@ Copyright (C) 2006 Christian Grothoff * replace main GNU getopt parser with one that * actually fits our API. */ - #include "platform.h" -#include "gnunet_common.h" -#include "gnunet_getopt_lib.h" +#include "gnunet_util_lib.h" #ifdef VMS #include @@ -49,6 +47,10 @@ Copyright (C) 2006 Christian Grothoff #endif #endif +#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) + +#define LOG_STRERROR(kind,syscall) GNUNET_log_from_strerror (kind, "util", syscall) + #if defined (WIN32) && !defined (__CYGWIN32__) /* It's not Unix, really. See? Capital letters. */ #include @@ -194,12 +196,12 @@ static char *posixly_correct; /* Avoid depending on library functions or files whose names are inconsistent. */ -char *getenv (); +char * +getenv (); static char * -my_index (str, chr) - const char *str; - int chr; +my_index (const char *str, + int chr) { while (*str) { @@ -218,7 +220,8 @@ my_index (str, chr) #if !defined (__STDC__) || !__STDC__ /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ -extern int strlen (const char *); +extern int +strlen (const char *); #endif /* not __STDC__ */ #endif /* __GNUC__ */ @@ -233,45 +236,7 @@ extern int strlen (const char *); static int first_nonopt; static int last_nonopt; -#ifdef _LIBC -/* Bash 2.0 gives us an environment variable containing flags - indicating ARGV elements that should not be considered arguments. */ - -/* Defined in getopt_init.c */ -extern char *__getopt_nonoption_flags; - -static int nonoption_flags_max_len; -static int nonoption_flags_len; - -static int original_argc; -static char *const *original_argv; - -extern pid_t __libc_pid; - -/* Make sure the environment variable bash 2.0 puts in the environment - is valid for the getopt call we must make sure that the ARGV passed - to getopt is that one passed to the process. */ -static void - __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) -{ - /* XXX This is no good solution. We should rather copy the args so - * that we can compare them later. But we must not use malloc(3). */ - original_argc = argc; - original_argv = argv; -} - -text_set_element (__libc_subinit, store_args_and_env); - -#define SWAP_FLAGS(ch1, ch2) \ - if (nonoption_flags_len > 0) \ - { \ - char __tmp = __getopt_nonoption_flags[ch1]; \ - __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ - __getopt_nonoption_flags[ch2] = __tmp; \ - } -#else /* !_LIBC */ #define SWAP_FLAGS(ch1, ch2) -#endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) @@ -283,12 +248,12 @@ text_set_element (__libc_subinit, store_args_and_env); the new indices of the non-options in ARGV after they are moved. */ #if defined (__STDC__) && __STDC__ -static void exchange (char **); +static void +exchange (char **); #endif static void -exchange (argv) - char **argv; +exchange (char **argv) { int bottom = first_nonopt; int middle = last_nonopt; @@ -300,29 +265,6 @@ exchange (argv) * It leaves the longer segment in the right place overall, * but it consists of two parts that need to be swapped next. */ -#ifdef _LIBC - /* First make sure the handling of the `__getopt_nonoption_flags' - * string can work normally. Our top argument must be in the range - * of the string. */ - if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) - { - /* We must extend the array. The user plays games with us and - * presents new arguments. */ - char *new_str = malloc (top + 1); - - if (new_str == NULL) - nonoption_flags_len = nonoption_flags_max_len = 0; - else - { - memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len); - memset (&new_str[nonoption_flags_max_len], '\0', - top + 1 - nonoption_flags_max_len); - nonoption_flags_max_len = top + 1; - __getopt_nonoption_flags = new_str; - } - } -#endif - while (top > middle && middle > bottom) { if (top - middle > middle - bottom) @@ -370,13 +312,13 @@ exchange (argv) /* Initialize the internal data when the first call is made. */ #if defined (__STDC__) && __STDC__ -static const char *_getopt_initialize (int, char *const *, const char *); +static const char * +_getopt_initialize (int, char *const *, const char *); #endif static const char * -_getopt_initialize (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; +_getopt_initialize (int argc, + char *const *argv, + const char *optstring) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 * is the program name); the sequence of previously skipped @@ -405,41 +347,9 @@ _getopt_initialize (argc, argv, optstring) else ordering = PERMUTE; -#ifdef _LIBC - if (posixly_correct == NULL && argc == original_argc && argv == original_argv) - { - if (nonoption_flags_max_len == 0) - { - if (__getopt_nonoption_flags == NULL - || __getopt_nonoption_flags[0] == '\0') - nonoption_flags_max_len = -1; - else - { - const char *orig_str = __getopt_nonoption_flags; - int len = nonoption_flags_max_len = strlen (orig_str); - - if (nonoption_flags_max_len < argc) - nonoption_flags_max_len = argc; - __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); - if (__getopt_nonoption_flags == NULL) - nonoption_flags_max_len = -1; - else - { - memcpy (__getopt_nonoption_flags, orig_str, len); - memset (&__getopt_nonoption_flags[len], '\0', - nonoption_flags_max_len - len); - } - } - } - nonoption_flags_len = nonoption_flags_max_len; - } - else - nonoption_flags_len = 0; -#endif - return optstring; } - + /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. @@ -497,11 +407,9 @@ _getopt_initialize (argc, argv, optstring) long-named options. */ static int -GN_getopt_internal (int argc, - char *const *argv, - const char *optstring, - const struct GNoption *longopts, - int *longind, int long_only) +GN_getopt_internal (int argc, char *const *argv, const char *optstring, + const struct GNoption *longopts, int *longind, + int long_only) { static int __getopt_initialized = 0; static int GNopterr = 1; @@ -520,13 +428,7 @@ GN_getopt_internal (int argc, * Either it does not have option syntax, or there is an environment flag * from the shell indicating it is not an option. The later information * is only used when the used in the GNU libc. */ -#ifdef _LIBC -#define NONOPTION_P (argv[GNoptind][0] != '-' || argv[GNoptind][1] == '\0' \ - || (GNoptind < nonoption_flags_len \ - && __getopt_nonoption_flags[GNoptind] == '1')) -#else #define NONOPTION_P (argv[GNoptind][0] != '-' || argv[GNoptind][1] == '\0') -#endif if (nextchar == NULL || *nextchar == '\0') { @@ -600,30 +502,29 @@ GN_getopt_internal (int argc, /* We have found another option-ARGV-element. * Skip the initial punctuation. */ - nextchar = (argv[GNoptind] + 1 - + (longopts != NULL && argv[GNoptind][1] == '-')); + nextchar = + (argv[GNoptind] + 1 + (longopts != NULL && argv[GNoptind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. - * + * * If long_only and the ARGV-element has the form "-f", where f is * a valid short option, don't consider it an abbreviated form of * a long option that starts with f. Otherwise there would be no * way to give the -f short option. - * + * * On the other hand, if there's a long option "fubar" and * the ARGV-element is "-fu", do consider that an abbreviation of * the long option, just like "--fu", and not "-f" with arg "u". - * + * * This distinction seems to be the most useful approach. */ - if (longopts != NULL - && (argv[GNoptind][1] == '-' - || (long_only - && (argv[GNoptind][2] - || !my_index (optstring, argv[GNoptind][1]))))) + if (longopts != NULL && + (argv[GNoptind][1] == '-' || + (long_only && + (argv[GNoptind][2] || !my_index (optstring, argv[GNoptind][1]))))) { char *nameend; const struct GNoption *p; @@ -641,8 +542,8 @@ GN_getopt_internal (int argc, for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { - if ((unsigned int) (nameend - nextchar) - == (unsigned int) strlen (p->name)) + if ((unsigned int) (nameend - nextchar) == + (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; @@ -664,8 +565,8 @@ GN_getopt_internal (int argc, if (ambig && !exact) { if (GNopterr) - fprintf (stderr, _("%s: option `%s' is ambiguous\n"), - argv[0], argv[GNoptind]); + FPRINTF (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], + argv[GNoptind]); nextchar += strlen (nextchar); GNoptind++; return '?'; @@ -687,15 +588,13 @@ GN_getopt_internal (int argc, { if (argv[GNoptind - 1][1] == '-') /* --option */ - fprintf (stderr, - _ - ("%s: option `--%s' does not allow an argument\n"), + FPRINTF (stderr, + _("%s: option `--%s' does not allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ - fprintf (stderr, - _ - ("%s: option `%c%s' does not allow an argument\n"), + FPRINTF (stderr, + _("%s: option `%c%s' does not allow an argument\n"), argv[0], argv[GNoptind - 1][0], pfound->name); } nextchar += strlen (nextchar); @@ -712,8 +611,7 @@ GN_getopt_internal (int argc, { if (GNopterr) { - fprintf (stderr, - _("%s: option `%s' requires an argument\n"), + FPRINTF (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[GNoptind - 1]); } nextchar += strlen (nextchar); @@ -735,19 +633,19 @@ GN_getopt_internal (int argc, * or the option starts with '--' or is not a valid short * option, then it's an error. * Otherwise interpret it as a short option. */ - if (!long_only || argv[GNoptind][1] == '-' - || my_index (optstring, *nextchar) == NULL) + if (!long_only || argv[GNoptind][1] == '-' || + my_index (optstring, *nextchar) == NULL) { if (GNopterr) { if (argv[GNoptind][1] == '-') /* --option */ - fprintf (stderr, _("%s: unrecognized option `--%s'\n"), - argv[0], nextchar); + FPRINTF (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], + nextchar); else /* +option or -option */ - fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), - argv[0], argv[GNoptind][0], nextchar); + FPRINTF (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], + argv[GNoptind][0], nextchar); } nextchar = (char *) ""; GNoptind++; @@ -771,9 +669,9 @@ GN_getopt_internal (int argc, { if (posixly_correct) /* 1003.2 specifies the format of this message. */ - fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); + FPRINTF (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else - fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); + FPRINTF (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } return '?'; } @@ -801,7 +699,7 @@ GN_getopt_internal (int argc, if (GNopterr) { /* 1003.2 specifies the format of this message. */ - fprintf (stderr, _("%s: option requires an argument -- %c\n"), + FPRINTF (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } if (optstring[0] == ':') @@ -849,8 +747,8 @@ GN_getopt_internal (int argc, if (ambig && !exact) { if (GNopterr) - fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), - argv[0], argv[GNoptind]); + FPRINTF (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], + argv[GNoptind]); nextchar += strlen (nextchar); GNoptind++; return '?'; @@ -867,8 +765,7 @@ GN_getopt_internal (int argc, else { if (GNopterr) - fprintf (stderr, _("\ -%s: option `-W %s' does not allow an argument\n"), argv[0], pfound->name); + FPRINTF (stderr, _("%s: option `-W %s' does not allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; @@ -881,8 +778,7 @@ GN_getopt_internal (int argc, else { if (GNopterr) - fprintf (stderr, - _("%s: option `%s' requires an argument\n"), + FPRINTF (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[GNoptind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; @@ -930,8 +826,8 @@ GN_getopt_internal (int argc, if (GNopterr) { /* 1003.2 specifies the format of this message. */ - fprintf (stderr, - _("%s: option requires an argument -- %c\n"), argv[0], c); + FPRINTF (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); } if (optstring[0] == ':') c = ':'; @@ -950,9 +846,7 @@ GN_getopt_internal (int argc, } static int -GNgetopt_long (int argc, - char *const *argv, - const char *options, +GNgetopt_long (int argc, char *const *argv, const char *options, const struct GNoption *long_options, int *opt_index) { return GN_getopt_internal (argc, argv, options, long_options, opt_index, 0); @@ -1028,23 +922,25 @@ GNUNET_GETOPT_run (const char *binaryOptions, clpc.currentArgument = GNoptind - 1; if ((char) c == allOptions[i].shortName) { - cont = allOptions[i].processor (&clpc, - allOptions[i].scls, - allOptions[i].name, GNoptarg); + cont = + allOptions[i].processor (&clpc, allOptions[i].scls, + allOptions[i].name, GNoptarg); break; } } if (i == count) { - fprintf (stderr, _("Use --help to get a list of options.\n")); + FPRINTF (stderr, _("Use %s to get a list of options.\n"), "--help"); cont = GNUNET_SYSERR; } } GNUNET_free (shorts); GNUNET_free (long_options); - if (cont == GNUNET_SYSERR) - return GNUNET_SYSERR; + if (cont != GNUNET_OK) + { + return cont; + } return GNoptind; }