summaryrefslogtreecommitdiff
path: root/src/common/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/util.c')
-rw-r--r--src/common/util.c79
1 files changed, 43 insertions, 36 deletions
diff --git a/src/common/util.c b/src/common/util.c
index cc00ff9792..6cc7ddd339 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -324,6 +324,25 @@ const char *find_whitespace(const char *s) {
return s;
}
+#define CHECK_STRTOX_RESULT() \
+ /* Was at least one character converted? */ \
+ if (endptr == s) \
+ goto err; \
+ /* Were there unexpected unconverted characters? */ \
+ if (!next && *endptr) \
+ goto err; \
+ /* Is r within limits? */ \
+ if (r < min || r > max) \
+ goto err; \
+ if (ok) *ok = 1; \
+ if (next) *next = endptr; \
+ return r; \
+ err: \
+ if (ok) *ok = 0; \
+ if (next) *next = endptr; \
+ return 0; \
+
+
/** Extract a long from the start of s, in the given numeric base. If
* there is unconverted data and next is provided, set *next to the
* first unconverted character. An error has occurred if no characters
@@ -340,26 +359,9 @@ tor_parse_long(const char *s, int base, long min, long max,
long r;
r = strtol(s, &endptr, base);
- /* Was at least one character converted? */
- if (endptr == s)
- goto err;
- /* Were there unexpected unconverted characters? */
- if (!next && *endptr)
- goto err;
- /* Is r within limits? */
- if (r < min || r > max)
- goto err;
-
- if (ok) *ok = 1;
- if (next) *next = endptr;
- return r;
- err:
- if (ok) *ok = 0;
- if (next) *next = endptr;
- return 0;
+ CHECK_STRTOX_RESULT();
}
-#if 0
unsigned long
tor_parse_ulong(const char *s, int base, unsigned long min,
unsigned long max, int *ok, char **next)
@@ -367,27 +369,32 @@ tor_parse_ulong(const char *s, int base, unsigned long min,
char *endptr;
unsigned long r;
- r = strtol(s, &endptr, base);
- /* Was at least one character converted? */
- if (endptr == s)
- goto err;
- /* Were there unexpected unconverted characters? */
- if (!next && *endptr)
- goto err;
- /* Is r within limits? */
- if (r < min || r > max)
- goto err;
-
- if (ok) *ok = 1;
- if (next) *next = endptr;
- return r;
- err:
- if (ok) *ok = 0;
- if (next) *next = endptr;
- return 0;
+ r = strtoul(s, &endptr, base);
+ CHECK_STRTOX_RESULT();
}
+
+uint64_t
+tor_parse_uint64(const char *s, int base, uint64_t min,
+ uint64_t max, int *ok, char **next)
+{
+ char *endptr;
+ uint64_t r;
+
+#ifdef HAVE_STRTOULL
+ r = (uint64_t)strtoull(s, &endptr, base);
+#elif defined(MS_WINDOWS)
+ r = (uint64_t)_strtoui64(s, &endptr, base);
+#elif SIZEOF_LONG == 8
+ r = (uint64_t)strtoul(s, &endptr, base);
+#else
+#error "I don't know how to parse 64-bit numbers."
#endif
+ CHECK_STRTOX_RESULT();
+}
+
+
+
void base16_encode(char *dest, size_t destlen, const char *src, size_t srclen)
{
const char *end;