[Top][All Lists]
[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"
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r17971 - in gnunet/src: include util,
gnunet <=