-fix compiler warning
[oweals/gnunet.git] / src / util / getopt_helpers.c
index 8564d591f151cc48f9f60ddf58477e15a46af018..e744c2fada27889570a2b5ae03570e80a3e33d1b 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet
 /*
      This file is part of GNUnet
-     (C) 2006, 2011 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2006, 2011 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet 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
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
 */
 
 /**
  * @brief implements command line that sets option
  * @author Christian Grothoff
  */
  * @brief implements command line that sets option
  * @author Christian Grothoff
  */
-
 #include "platform.h"
 #include "platform.h"
-#include "gnunet_common.h"
-#include "gnunet_getopt_lib.h"
+#include "gnunet_util_lib.h"
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 
 
 #define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
 
  * @param scls additional closure (points to version string)
  * @param option name of the option
  * @param value not used (NULL)
  * @param scls additional closure (points to version string)
  * @param option name of the option
  * @param value not used (NULL)
- * @return GNUNET_SYSERR (do not continue)
+ * @return #GNUNET_NO (do not continue, not an error)
  */
 int
  */
 int
-GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext
-                             *ctx, void *scls, const char *option,
-                             const char *value)
+GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+                             void *scls,
+                             const char *option,
+                              const char *value)
 {
   const char *version = scls;
 
 {
   const char *version = scls;
 
-  printf ("%s v%s\n", ctx->binaryName, version);
-  return GNUNET_SYSERR;
+  printf ("%s v%s\n",
+         ctx->binaryName,
+         version);
+  return GNUNET_NO;
 }
 
 
 }
 
 
-
+/**
+ * At what offset does the help text start?
+ */
 #define BORDER 29
 
 /**
 #define BORDER 29
 
 /**
@@ -62,12 +65,13 @@ GNUNET_GETOPT_print_version_ (struct GNUNET_GETOPT_CommandLineProcessorContext
  * @param scls additional closure (points to about text)
  * @param option name of the option
  * @param value not used (NULL)
  * @param scls additional closure (points to about text)
  * @param option name of the option
  * @param value not used (NULL)
- * @return GNUNET_SYSERR (do not continue)
+ * @return #GNUNET_NO (do not continue, not an error)
  */
 int
  */
 int
-GNUNET_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext
-                           *ctx, void *scls, const char *option,
-                           const char *value)
+GNUNET_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+                           void *scls,
+                           const char *option,
+                            const char *value)
 {
   const char *about = scls;
   size_t slen;
 {
   const char *about = scls;
   size_t slen;
@@ -79,77 +83,80 @@ GNUNET_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext
   const char *trans;
   const struct GNUNET_GETOPT_CommandLineOption *opt;
 
   const char *trans;
   const struct GNUNET_GETOPT_CommandLineOption *opt;
 
-  printf ("%s\n%s\n", ctx->binaryOptions, gettext (about));
-  printf (_
-         ("Arguments mandatory for long options are also mandatory for short options.\n"));
+  if (NULL != about)
+  {
+    printf ("%s\n%s\n", ctx->binaryOptions, gettext (about));
+    printf (_
+           ("Arguments mandatory for long options are also mandatory for short options.\n"));
+  }
   i = 0;
   opt = ctx->allOptions;
   while (opt[i].description != NULL)
   i = 0;
   opt = ctx->allOptions;
   while (opt[i].description != NULL)
+  {
+    if (opt[i].shortName == '\0')
+      printf ("      ");
+    else
+      printf ("  -%c, ", opt[i].shortName);
+    printf ("--%s", opt[i].name);
+    slen = 8 + strlen (opt[i].name);
+    if (opt[i].argumentHelp != NULL)
+    {
+      printf ("=%s", opt[i].argumentHelp);
+      slen += 1 + strlen (opt[i].argumentHelp);
+    }
+    if (slen > BORDER)
+    {
+      printf ("\n%*s", BORDER, "");
+      slen = BORDER;
+    }
+    if (slen < BORDER)
+    {
+      printf ("%*s", (int) (BORDER - slen), "");
+      slen = BORDER;
+    }
+    if (0 < strlen (opt[i].description))
+      trans = gettext (opt[i].description);
+    else
+      trans = "";
+    ml = strlen (trans);
+    p = 0;
+OUTER:
+    while (ml - p > 78 - slen)
     {
     {
-      if (opt[i].shortName == '\0')
-       printf ("      ");
-      else
-       printf ("  -%c, ", opt[i].shortName);
-      printf ("--%s", opt[i].name);
-      slen = 8 + strlen (opt[i].name);
-      if (opt[i].argumentHelp != NULL)
-       {
-         printf ("=%s", opt[i].argumentHelp);
-         slen += 1 + strlen (opt[i].argumentHelp);
-       }
-      if (slen > BORDER)
-       {
-         printf ("\n%*s", BORDER, "");
-         slen = BORDER;
-       }
-      if (slen < BORDER)
-       {
-         printf ("%*s", (int) (BORDER - slen), "");
-         slen = BORDER;
-       }
-      if (0 < strlen (opt[i].description))
-       trans = gettext (opt[i].description);
-      else
-       trans = "";
-      ml = strlen (trans);
-      p = 0;
-    OUTER:
-      while (ml - p > 78 - slen)
-       {
-         for (j = p + 78 - slen; j > p; j--)
-           {
-             if (isspace ((unsigned char) trans[j]))
-               {
-                 scp = GNUNET_malloc (j - p + 1);
-                 memcpy (scp, &trans[p], j - p);
-                 scp[j - p] = '\0';
-                 printf ("%s\n%*s", scp, BORDER + 2, "");
-                 GNUNET_free (scp);
-                 p = j + 1;
-                 slen = BORDER + 2;
-                 goto OUTER;
-               }
-           }
-         /* could not find space to break line */
-         scp = GNUNET_malloc (78 - slen + 1);
-         memcpy (scp, &trans[p], 78 - slen);
-         scp[78 - slen] = '\0';
-         printf ("%s\n%*s", scp, BORDER + 2, "");
-         GNUNET_free (scp);
-         slen = BORDER + 2;
-         p = p + 78 - slen;
-       }
-      /* print rest */
-      if (p < ml)
-       printf ("%s\n", &trans[p]);
-      if (strlen (trans) == 0)
-       printf ("\n");
-      i++;
+      for (j = p + 78 - slen; j > p; j--)
+      {
+        if (isspace ((unsigned char) trans[j]))
+        {
+          scp = GNUNET_malloc (j - p + 1);
+          memcpy (scp, &trans[p], j - p);
+          scp[j - p] = '\0';
+          printf ("%s\n%*s", scp, BORDER + 2, "");
+          GNUNET_free (scp);
+          p = j + 1;
+          slen = BORDER + 2;
+          goto OUTER;
+        }
+      }
+      /* could not find space to break line */
+      scp = GNUNET_malloc (78 - slen + 1);
+      memcpy (scp, &trans[p], 78 - slen);
+      scp[78 - slen] = '\0';
+      printf ("%s\n%*s", scp, BORDER + 2, "");
+      GNUNET_free (scp);
+      slen = BORDER + 2;
+      p = p + 78 - slen;
     }
     }
+    /* print rest */
+    if (p < ml)
+      printf ("%s\n", &trans[p]);
+    if (strlen (trans) == 0)
+      printf ("\n");
+    i++;
+  }
   printf ("Report bugs to gnunet-developers@gnu.org.\n"
   printf ("Report bugs to gnunet-developers@gnu.org.\n"
-         "GNUnet home page: http://www.gnu.org/software/gnunet/\n"
-         "General help using GNU software: http://www.gnu.org/gethelp/\n");
-  return GNUNET_SYSERR;
+          "GNUnet home page: http://www.gnu.org/software/gnunet/\n"
+          "General help using GNU software: http://www.gnu.org/gethelp/\n");
+  return GNUNET_NO;
 }
 
 
 }
 
 
@@ -165,13 +172,12 @@ GNUNET_GETOPT_format_help_ (struct GNUNET_GETOPT_CommandLineProcessorContext
  * @param scls additional closure (will point to the 'int')
  * @param option name of the option
  * @param value not used (NULL)
  * @param scls additional closure (will point to the 'int')
  * @param option name of the option
  * @param value not used (NULL)
- * @return GNUNET_OK
+ * @return #GNUNET_OK
  */
 int
  */
 int
-GNUNET_GETOPT_increment_value (struct
-                              GNUNET_GETOPT_CommandLineProcessorContext *ctx,
-                              void *scls, const char *option,
-                              const char *value)
+GNUNET_GETOPT_increment_value (struct GNUNET_GETOPT_CommandLineProcessorContext
+                               *ctx, void *scls, const char *option,
+                               const char *value)
 {
   int *val = scls;
 
 {
   int *val = scls;
 
@@ -192,11 +198,11 @@ GNUNET_GETOPT_increment_value (struct
  * @param scls additional closure (will point to the 'int')
  * @param option name of the option
  * @param value not used (NULL)
  * @param scls additional closure (will point to the 'int')
  * @param option name of the option
  * @param value not used (NULL)
- * @return GNUNET_OK
+ * @return #GNUNET_OK
  */
 int
 GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  */
 int
 GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
-                      void *scls, const char *option, const char *value)
+                       void *scls, const char *option, const char *value)
 {
   int *val = scls;
 
 {
   int *val = scls;
 
@@ -210,19 +216,18 @@ GNUNET_GETOPT_set_one (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  * A pointer to this function should be passed as part of the
  * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
  * of this type.  It should be followed by a pointer to a value of
  * A pointer to this function should be passed as part of the
  * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
  * of this type.  It should be followed by a pointer to a value of
- * type 'char *'.
+ * type 'char *', which will be allocated with the requested string.
  *
  * @param ctx command line processing context
  * @param scls additional closure (will point to the 'char *',
  *             which will be allocated)
  * @param option name of the option
  * @param value actual value of the option (a string)
  *
  * @param ctx command line processing context
  * @param scls additional closure (will point to the 'char *',
  *             which will be allocated)
  * @param option name of the option
  * @param value actual value of the option (a string)
- * @return GNUNET_OK
+ * @return #GNUNET_OK
  */
 int
  */
 int
-GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext
-                         *ctx, void *scls, const char *option,
-                         const char *value)
+GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+                          void *scls, const char *option, const char *value)
 {
   char **val = scls;
 
 {
   char **val = scls;
 
@@ -233,6 +238,18 @@ GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext
 }
 
 
 }
 
 
+int
+GNUNET_GETOPT_set_filename (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+                            void *scls, const char *option, const char *value)
+{
+  char **val = scls;
+
+  GNUNET_assert (value != NULL);
+  GNUNET_free_non_null (*val);
+  *val = GNUNET_STRINGS_filename_expand (value);
+  return GNUNET_OK;
+}
+
 /**
  * Set an option of type 'unsigned long long' from the command line.
  * A pointer to this function should be passed as part of the
 /**
  * Set an option of type 'unsigned long long' from the command line.
  * A pointer to this function should be passed as part of the
@@ -244,27 +261,55 @@ GNUNET_GETOPT_set_string (struct GNUNET_GETOPT_CommandLineProcessorContext
  * @param scls additional closure (will point to the 'unsigned long long')
  * @param option name of the option
  * @param value actual value of the option as a string.
  * @param scls additional closure (will point to the 'unsigned long long')
  * @param option name of the option
  * @param value actual value of the option as a string.
- * @return GNUNET_OK if parsing the value worked
+ * @return #GNUNET_OK if parsing the value worked
  */
 int
  */
 int
-GNUNET_GETOPT_set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext
-                        *ctx, void *scls, const char *option,
-                        const char *value)
+GNUNET_GETOPT_set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+                         void *scls, const char *option, const char *value)
 {
   unsigned long long *val = scls;
 
   if (1 != SSCANF (value, "%llu", val))
 {
   unsigned long long *val = scls;
 
   if (1 != SSCANF (value, "%llu", val))
-    {
-      fprintf (stderr, _("You must pass a number to the `%s' option.\n"),
-              option);
-      return GNUNET_SYSERR;
-    }
+  {
+    FPRINTF (stderr, _("You must pass a number to the `%s' option.\n"), option);
+    return GNUNET_SYSERR;
+  }
   return GNUNET_OK;
 }
 
 
 /**
   return GNUNET_OK;
 }
 
 
 /**
- * Set an option of type 'unsigned long long' from the command line.
+ * Set an option of type 'struct GNUNET_TIME_Relative' from the command line.
+ * A pointer to this function should be passed as part of the
+ * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
+ * of this type.  It should be followed by a pointer to a value of
+ * type 'struct GNUNET_TIME_Relative'.
+ *
+ * @param ctx command line processing context
+ * @param scls additional closure (will point to the 'struct GNUNET_TIME_Relative')
+ * @param option name of the option
+ * @param value actual value of the option as a string.
+ * @return #GNUNET_OK if parsing the value worked
+ */
+int
+GNUNET_GETOPT_set_relative_time (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
+                                void *scls, const char *option, const char *value)
+{
+  struct GNUNET_TIME_Relative *val = scls;
+
+  if (GNUNET_OK !=
+      GNUNET_STRINGS_fancy_time_to_relative (value,
+                                            val))
+  {
+    FPRINTF (stderr, _("You must pass relative time to the `%s' option.\n"), option);
+    return GNUNET_SYSERR;
+  }
+  return GNUNET_OK;
+}
+
+
+/**
+ * Set an option of type 'unsigned int' from the command line.
  * A pointer to this function should be passed as part of the
  * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
  * of this type.  It should be followed by a pointer to a value of
  * A pointer to this function should be passed as part of the
  * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
  * of this type.  It should be followed by a pointer to a value of
@@ -274,20 +319,19 @@ GNUNET_GETOPT_set_ulong (struct GNUNET_GETOPT_CommandLineProcessorContext
  * @param scls additional closure (will point to the 'unsigned int')
  * @param option name of the option
  * @param value actual value of the option as a string.
  * @param scls additional closure (will point to the 'unsigned int')
  * @param option name of the option
  * @param value actual value of the option as a string.
- * @return GNUNET_OK if parsing the value worked
+ * @return #GNUNET_OK if parsing the value worked
  */
 int
 GNUNET_GETOPT_set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
  */
 int
 GNUNET_GETOPT_set_uint (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
-                       void *scls, const char *option, const char *value)
+                        void *scls, const char *option, const char *value)
 {
   unsigned int *val = scls;
 
   if (1 != SSCANF (value, "%u", val))
 {
   unsigned int *val = scls;
 
   if (1 != SSCANF (value, "%u", val))
-    {
-      fprintf (stderr, _("You must pass a number to the `%s' option.\n"),
-              option);
-      return GNUNET_SYSERR;
-    }
+  {
+    FPRINTF (stderr, _("You must pass a number to the `%s' option.\n"), option);
+    return GNUNET_SYSERR;
+  }
   return GNUNET_OK;
 }
 
   return GNUNET_OK;
 }