add crc8
[oweals/gnunet.git] / src / util / getopt.c
index db81d1c3d76b6eb004082d3caec29be8d3872129..e150496ae22989f29a909ca5f33c9fc74fa0a29e 100644 (file)
@@ -3,7 +3,7 @@
    "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
    before changing it!
 
    "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.
      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
 
 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,
 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
 
 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.
 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.
  */
  * replace main GNU getopt parser with one that
  * actually fits our API.
  */
-
 #include "platform.h"
 #include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_getopt_lib.h"
+#include "gnunet_util_lib.h"
 
 #ifdef VMS
 #include <unixlib.h>
 
 #ifdef VMS
 #include <unixlib.h>
@@ -49,6 +47,10 @@ Copyright (C) 2006 Christian Grothoff
 #endif
 #endif
 
 #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>
 #if defined (WIN32) && !defined (__CYGWIN32__)
 /* It's not Unix, really.  See?  Capital letters.  */
 #include <windows.h>
@@ -194,12 +196,12 @@ static char *posixly_correct;
 /* Avoid depending on library functions or files
    whose names are inconsistent.  */
 
 /* Avoid depending on library functions or files
    whose names are inconsistent.  */
 
-char *getenv ();
+char *
+getenv ();
 
 static char *
 
 static char *
-my_index (str, chr)
-  const char *str;
-  int chr;
+my_index (const char *str,
+         int chr)
 {
   while (*str)
   {
 {
   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.  */
 #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__ */
 
 #endif /* not __STDC__ */
 #endif /* __GNUC__ */
 
@@ -233,45 +236,7 @@ extern int strlen (const char *);
 static int first_nonopt;
 static int last_nonopt;
 
 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)
 #define SWAP_FLAGS(ch1, ch2)
-#endif /* _LIBC */
 
 /* Exchange two adjacent subsequences of ARGV.
    One subsequence is elements [first_nonopt,last_nonopt)
 
 /* 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__
    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
 #endif
 
 static void
-exchange (argv)
-  char **argv;
+exchange (char **argv)
 {
   int bottom = first_nonopt;
   int middle = last_nonopt;
 {
   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.  */
 
    * 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)
   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__
 /* 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 *
 #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
 {
   /* 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;
 
   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;
 }
   return optstring;
 }
-\f
+
 /* Scan elements of ARGV (whose length is ARGC) for option characters
    given in OPTSTRING.
 
 /* Scan elements of ARGV (whose length is ARGC) for option characters
    given in OPTSTRING.
 
@@ -518,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.  */
    * 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')
 #define NONOPTION_P (argv[GNoptind][0] != '-' || argv[GNoptind][1] == '\0')
-#endif
 
   if (nextchar == NULL || *nextchar == '\0')
   {
 
   if (nextchar == NULL || *nextchar == '\0')
   {
@@ -605,16 +509,16 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
   /* Decode the current option-ARGV-element.  */
 
   /* Check whether the ARGV-element is a long option.
   /* 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.
    * 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".
    * 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 &&
    * This distinction seems to be the most useful approach.  */
 
   if (longopts != NULL &&
@@ -661,7 +565,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
     if (ambig && !exact)
     {
       if (GNopterr)
     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++;
                  argv[GNoptind]);
       nextchar += strlen (nextchar);
       GNoptind++;
@@ -684,12 +588,12 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
           {
             if (argv[GNoptind - 1][1] == '-')
               /* --option */
           {
             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 */
                        _("%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);
           }
                        _("%s: option `%c%s' does not allow an argument\n"),
                        argv[0], argv[GNoptind - 1][0], pfound->name);
           }
@@ -707,7 +611,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
         {
           if (GNopterr)
           {
         {
           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);
                      argv[0], argv[GNoptind - 1]);
           }
           nextchar += strlen (nextchar);
@@ -736,11 +640,11 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
       {
         if (argv[GNoptind][1] == '-')
           /* --option */
       {
         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 */
                    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 *) "";
                    argv[GNoptind][0], nextchar);
       }
       nextchar = (char *) "";
@@ -765,9 +669,9 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
       {
         if (posixly_correct)
           /* 1003.2 specifies the format of this message.  */
       {
         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
         else
-          fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
+          FPRINTF (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
       }
       return '?';
     }
       }
       return '?';
     }
@@ -795,7 +699,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
         if (GNopterr)
         {
           /* 1003.2 specifies the format of this message.  */
         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] == ':')
                    argv[0], c);
         }
         if (optstring[0] == ':')
@@ -843,7 +747,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
       if (ambig && !exact)
       {
         if (GNopterr)
       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++;
                    argv[GNoptind]);
         nextchar += strlen (nextchar);
         GNoptind++;
@@ -861,8 +765,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
           else
           {
             if (GNopterr)
           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 '?';
 
             nextchar += strlen (nextchar);
             return '?';
@@ -875,7 +778,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
           else
           {
             if (GNopterr)
           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] == ':' ? ':' : '?';
                        argv[0], argv[GNoptind - 1]);
             nextchar += strlen (nextchar);
             return optstring[0] == ':' ? ':' : '?';
@@ -923,7 +826,7 @@ GN_getopt_internal (int argc, char *const *argv, const char *optstring,
           if (GNopterr)
           {
             /* 1003.2 specifies the format of this message.  */
           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] == ':')
                      argv[0], c);
           }
           if (optstring[0] == ':')
@@ -1027,15 +930,17 @@ GNUNET_GETOPT_run (const char *binaryOptions,
     }
     if (i == count)
     {
     }
     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);
       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;
 }
 
   return GNoptind;
 }