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,
* 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 <unixlib.h>
#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 <windows.h>
getenv ();
static char *
-my_index (str, chr)
- const char *str;
- int chr;
+my_index (const char *str,
+ int chr)
{
while (*str)
{
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)
#endif
static void
-exchange (argv)
- char **argv;
+exchange (char **argv)
{
int bottom = first_nonopt;
int middle = last_nonopt;
* 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)
_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
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;
}
-\f
+
/* Scan elements of ARGV (whose length is ARGC) for option characters
given in 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')
{
if (ambig && !exact)
{
if (GNopterr)
- fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0],
+ FPRINTF (stderr, _("%s: option `%s' is ambiguous\n"), argv[0],
argv[GNoptind]);
nextchar += strlen (nextchar);
GNoptind++;
{
if (argv[GNoptind - 1][1] == '-')
/* --option */
- fprintf (stderr,
+ FPRINTF (stderr,
_("%s: option `--%s' does not allow an argument\n"),
argv[0], pfound->name);
else
/* +option or -option */
- fprintf (stderr,
+ FPRINTF (stderr,
_("%s: option `%c%s' does not allow an argument\n"),
argv[0], argv[GNoptind - 1][0], pfound->name);
}
{
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);
{
if (argv[GNoptind][1] == '-')
/* --option */
- fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0],
+ FPRINTF (stderr, _("%s: unrecognized option `--%s'\n"), argv[0],
nextchar);
else
/* +option or -option */
- fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0],
+ FPRINTF (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0],
argv[GNoptind][0], nextchar);
}
nextchar = (char *) "";
{
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 '?';
}
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] == ':')
if (ambig && !exact)
{
if (GNopterr)
- fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0],
+ FPRINTF (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0],
argv[GNoptind]);
nextchar += strlen (nextchar);
GNoptind++;
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 '?';
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] == ':' ? ':' : '?';
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] == ':')
}
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;
}