From 4775c35078e2a2223509089ccd5aec80e0008080 Mon Sep 17 00:00:00 2001 From: LRN Date: Mon, 4 Mar 2013 08:28:19 +0000 Subject: Accept time strings where number and unit are not separated by a space Fixes #2806 --- src/util/strings.c | 36 ++++++++++++++++++++++++------------ src/util/test_strings.c | 9 +++++++++ 2 files changed, 33 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/util/strings.c b/src/util/strings.c index 70986a978..4cef5b6fd 100644 --- a/src/util/strings.c +++ b/src/util/strings.c @@ -216,21 +216,33 @@ convert_with_table (const char *input, in = GNUNET_strdup (input); 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 + do { - ret += last; - last = 0; - if (1 != SSCANF (tok, "%llu", &last)) + i = 0; + while ((table[i].name != NULL) && (0 != strcasecmp (table[i].name, tok))) + i++; + if (table[i].name != NULL) { - GNUNET_free (in); - return GNUNET_SYSERR; /* expected number */ + last *= table[i].value; + break; /* next tok */ } - } + else + { + char *endptr; + ret += last; + errno = 0; + last = strtoull (tok, &endptr, 10); + if ((0 != errno) || (endptr == tok)) + { + GNUNET_free (in); + return GNUNET_SYSERR; /* expected number */ + } + if ('\0' == endptr[0]) + break; /* next tok */ + else + tok = endptr; /* and re-check (handles times like "10s") */ + } + } while (GNUNET_YES); } ret += last; *output = ret; diff --git a/src/util/test_strings.c b/src/util/test_strings.c index bc4169421..e5247ad91 100644 --- a/src/util/test_strings.c +++ b/src/util/test_strings.c @@ -39,6 +39,8 @@ main (int argc, char *argv[]) const char *bc; struct GNUNET_TIME_Absolute at; struct GNUNET_TIME_Absolute atx; + struct GNUNET_TIME_Relative rt; + struct GNUNET_TIME_Relative rtx; const char *hdir; GNUNET_log_setup ("test_strings", "ERROR", NULL); @@ -109,6 +111,13 @@ main (int argc, char *argv[]) b = GNUNET_STRINGS_to_utf8 ("TEST", 4, "unknown"); GNUNET_log_skip (0, GNUNET_YES); WANT ("TEST", b); + + GNUNET_assert (GNUNET_OK == + GNUNET_STRINGS_fancy_time_to_relative ("15m", &rt)); + GNUNET_assert (GNUNET_OK == + GNUNET_STRINGS_fancy_time_to_relative ("15 m", &rtx)); + GNUNET_assert (rt.rel_value == rtx.rel_value); + return 0; } -- cgit v1.2.3