X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fgetopt.c;h=e150496ae22989f29a909ca5f33c9fc74fa0a29e;hb=71e181512d1cd61d3865f93f5b85b208b5720ba5;hp=169949821ed2a432299c1fea66552a0e98b66c5e;hpb=416c2f5a713b93ba689a8cd1e038682a53e6bc17;p=oweals%2Fgnunet.git diff --git a/src/util/getopt.c b/src/util/getopt.c index 169949821..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 @@ -202,9 +200,8 @@ char * getenv (); static char * -my_index (str, chr) - const char *str; - int chr; +my_index (const char *str, + int chr) { while (*str) { @@ -239,45 +236,7 @@ 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 GNUNET_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) @@ -294,8 +253,7 @@ exchange (char **); #endif static void -exchange (argv) - char **argv; +exchange (char **argv) { int bottom = first_nonopt; int middle = last_nonopt; @@ -307,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) @@ -381,10 +316,9 @@ 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 @@ -413,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. @@ -526,13 +428,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring, * 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') { @@ -869,8 +765,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring, 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 '?'; @@ -1042,8 +937,10 @@ GNUNET_GETOPT_run (const char *binaryOptions, GNUNET_free (shorts); GNUNET_free (long_options); - if (cont == GNUNET_SYSERR) - return GNUNET_SYSERR; + if (cont != GNUNET_OK) + { + return cont; + } return GNoptind; }