gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r17971 - in gnunet/src: include util


From: gnunet
Subject: [GNUnet-SVN] r17971 - in gnunet/src: include util
Date: Thu, 3 Nov 2011 22:10:27 +0100

Author: grothoff
Date: 2011-11-03 22:10:27 +0100 (Thu, 03 Nov 2011)
New Revision: 17971

Modified:
   gnunet/src/include/gnunet_configuration_lib.h
   gnunet/src/include/gnunet_strings_lib.h
   gnunet/src/util/configuration.c
   gnunet/src/util/strings.c
   gnunet/src/util/test_configuration.c
   gnunet/src/util/test_configuration_data.conf
Log:
implementing time and size parsers for #1875

Modified: gnunet/src/include/gnunet_configuration_lib.h
===================================================================
--- gnunet/src/include/gnunet_configuration_lib.h       2011-11-03 20:41:05 UTC 
(rev 17970)
+++ gnunet/src/include/gnunet_configuration_lib.h       2011-11-03 21:10:27 UTC 
(rev 17971)
@@ -226,7 +226,24 @@
                                      struct GNUNET_TIME_Relative *time);
 
 
+
 /**
+ * Get a configuration value that should be a size in bytes.
+ *
+ * @param cfg configuration to inspect
+ * @param section section of interest
+ * @param option option of interest
+ * @param size set to the size in bytes as stored in the configuration
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_CONFIGURATION_get_value_size (const struct GNUNET_CONFIGURATION_Handle
+                                     *cfg, const char *section,
+                                     const char *option,
+                                     unsigned long long *size);
+
+
+/**
  * Test if we have a value for a particular option
  *
  * @param cfg configuration to inspect
@@ -337,6 +354,7 @@
                                       *cfg, const char *section,
                                       const char *option);
 
+
 /**
  * Expand an expression of the form "$FOO/BAR" to "DIRECTORY/BAR"
  * where either in the "PATHS" section or the environtment
@@ -378,6 +396,7 @@
                                        const char *section, const char *option,
                                        const char *value);
 
+
 /**
  * Remove a filename from a configuration value that
  * represents a list of filenames

Modified: gnunet/src/include/gnunet_strings_lib.h
===================================================================
--- gnunet/src/include/gnunet_strings_lib.h     2011-11-03 20:41:05 UTC (rev 
17970)
+++ gnunet/src/include/gnunet_strings_lib.h     2011-11-03 21:10:27 UTC (rev 
17971)
@@ -51,6 +51,18 @@
 
 
 /**
+ * Convert a given fancy human-readable size to bytes.
+ *
+ * @param fancy_size human readable string (i.e. 1 MB)
+ * @param size set to the size in bytes
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_STRINGS_fancy_size_to_bytes (const char *fancy_size,
+                                   unsigned long long *size);
+
+
+/**
  * Convert a given filesize into a fancy human-readable format.
  *
  * @param size number of bytes
@@ -85,6 +97,7 @@
 char *
 GNUNET_STRINGS_filename_expand (const char *fil);
 
+
 /**
  * Fill a buffer of the given size with
  * count 0-terminated strings (given as varargs).

Modified: gnunet/src/util/configuration.c
===================================================================
--- gnunet/src/util/configuration.c     2011-11-03 20:41:05 UTC (rev 17970)
+++ gnunet/src/util/configuration.c     2011-11-03 21:10:27 UTC (rev 17971)
@@ -731,16 +731,34 @@
   e = findEntry (cfg, section, option);
   if (e == NULL)
     return GNUNET_SYSERR;
-  if ((0 == strcasecmp (e->val, "infinity")) ||
-      (0 == strcasecmp (e->val, "forever")))
-    {
-      *time = GNUNET_TIME_UNIT_FOREVER_REL;
-      return GNUNET_OK;
-    }
-  if (1 != SSCANF (e->val, "%llu", &num))
+
+  return GNUNET_STRINGS_fancy_time_to_relative (e->val,
+                                               time);
+}
+
+
+/**
+ * Get a configuration value that should be a size in bytes.
+ *
+ * @param cfg configuration to inspect
+ * @param section section of interest
+ * @param option option of interest
+ * @param size set to the size in bytes as stored in the configuration
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_CONFIGURATION_get_value_size (const struct GNUNET_CONFIGURATION_Handle
+                                     *cfg, const char *section,
+                                     const char *option,
+                                     unsigned long long *size)
+{
+  struct ConfigEntry *e;
+
+  e = findEntry (cfg, section, option);
+  if (e == NULL)
     return GNUNET_SYSERR;
-  time->rel_value = (uint64_t) num;
-  return GNUNET_OK;
+  return GNUNET_STRINGS_fancy_size_to_bytes (e->val,
+                                            size);
 }
 
 

Modified: gnunet/src/util/strings.c
===================================================================
--- gnunet/src/util/strings.c   2011-11-03 20:41:05 UTC (rev 17970)
+++ gnunet/src/util/strings.c   2011-11-03 21:10:27 UTC (rev 17971)
@@ -171,6 +171,132 @@
 
 
 /**
+ * Convert a given fancy human-readable size to bytes.
+ *
+ * @param fancy_size human readable string (i.e. 1 MB)
+ * @param size set to the size in bytes
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_STRINGS_fancy_size_to_bytes (const char *fancy_size,
+                                   unsigned long long *size)
+{
+  struct { 
+    const char *name; 
+    unsigned long long value;
+  } table[] = {
+    { "B", 1 },
+    { "KiB", 1024 },
+    { "kB",  1000 },
+    { "MiB", 1024 * 1024 },
+    { "MB",  1000 * 1000 },
+    { "GiB", 1024 * 1024 * 1024 },
+    { "GB",  1000 * 1000 * 1000 },
+    { "TiB", 1024LL * 1024LL * 1024LL * 1024LL },
+    { "TB",  1000LL * 1000LL * 1000LL * 1024LL },
+    { "PiB", 1024LL * 1024LL * 1024LL * 1024LL * 1024LL },
+    { "PB",  1000LL * 1000LL * 1000LL * 1024LL * 1000LL},
+    { "EiB", 1024LL * 1024LL * 1024LL * 1024LL * 1024LL * 1024LL},
+    { "EB",  1000LL * 1000LL * 1000LL * 1024LL * 1000LL * 1000LL },
+    { NULL, 0 }
+  };
+  unsigned long long ret;
+  char *in;
+  const char *tok;
+  unsigned long long last;
+  unsigned int i;
+
+  ret = 0;
+  last = 0;
+  in = GNUNET_strdup (fancy_size);
+  for (tok = strtok (in, " "); tok != NULL; tok = strtok (NULL, " "))
+  {
+    fprintf (stderr, "%s - %llu %llu\n", tok, ret, last);
+    i=0;
+    while ( (table[i].name != NULL) &&
+           (0 != strcasecmp (table[i].name, tok) ) )
+      i++;
+    if (table[i].name != NULL)
+      last *= table[i].value;
+    else
+    {
+      ret += last;
+      last = 0;
+      if (1 != sscanf (tok, "%llu", &last))
+       return GNUNET_SYSERR; /* expected number */
+    }      
+  }
+  ret += last;
+  *size = ret;
+  return GNUNET_OK;
+}
+
+
+/**
+ * Convert a given fancy human-readable time to our internal
+ * representation.
+ *
+ * @param fancy_size human readable string (i.e. 1 minute)
+ * @param rtime set to the relative time
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_STRINGS_fancy_time_to_relative (const char *fancy_size,
+                                      struct GNUNET_TIME_Relative *rtime)
+{
+  struct { 
+    const char *name; 
+    unsigned long long value;
+  } table[] = {
+    { "ms", 1 },
+    { "s", 1000 },
+    { "\"", 1000 },
+    { "min",  60 * 1000 },
+    { "minutes", 60 * 1000 },
+    { "'", 60 * 1000 },
+    { "h", 60 * 60 * 1000 },
+    { "d", 24 * 60 * 60 * 1000 },
+    { "a", 31557600 /* year */ },
+    { NULL, 0 }
+  };
+  unsigned long long ret;
+  char *in;
+  const char *tok;
+  unsigned long long last;
+  unsigned int i;
+  
+  if ((0 == strcasecmp (fancy_size, "infinity")) ||
+      (0 == strcasecmp (fancy_size, "forever")))
+    {
+      *rtime = GNUNET_TIME_UNIT_FOREVER_REL;
+      return GNUNET_OK;
+    }
+  ret = 0;
+  last = 0;
+  in = GNUNET_strdup (fancy_size);
+  for (tok = strtok (in, " "); tok != NULL; tok = strtok (NULL, " "))
+  {
+    i=0;
+    while ( (table[i].name != NULL) &&
+           (0 != strcasecmp (table[i].name, tok) ) )
+      i++;
+    if (table[i].name != NULL)
+      last *= table[i].value;
+    else
+    {
+      ret += last;
+      last = 0;
+      if (1 != sscanf (tok, "%llu", &last))
+       return GNUNET_SYSERR; /* expected number */
+    }      
+  }
+  ret += last;
+  rtime->rel_value = (uint64_t) ret;
+  return GNUNET_OK;
+}
+
+
+/**
  * Convert the len characters long character sequence
  * given in input that is in the given charset
  * to UTF-8.

Modified: gnunet/src/util/test_configuration.c
===================================================================
--- gnunet/src/util/test_configuration.c        2011-11-03 20:41:05 UTC (rev 
17970)
+++ gnunet/src/util/test_configuration.c        2011-11-03 21:10:27 UTC (rev 
17971)
@@ -337,6 +337,17 @@
     }
   GNUNET_free (c);
 
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_size (cfg, "last", "size", &l))
+  {
+    GNUNET_break (0);
+    return 10;
+  }
+  if (l != 512 * 1024)
+  {
+    GNUNET_break (0);
+    return 11;
+  }
   return 0;
 }
 

Modified: gnunet/src/util/test_configuration_data.conf
===================================================================
--- gnunet/src/util/test_configuration_data.conf        2011-11-03 20:41:05 UTC 
(rev 17970)
+++ gnunet/src/util/test_configuration_data.conf        2011-11-03 21:10:27 UTC 
(rev 17971)
@@ -19,6 +19,7 @@
 test = $SUBST/world
 boom = "1 2 3 testing"
 trailing = YES 
+size = 512 KiB
 
 [FILENAMES]
 test = "/Hello /File\ Name /World"




reply via email to

[Prev in Thread] Current Thread [Next in Thread]