From 46e15ceffc5abb3ab1b24c88ff0a8876dbc48261 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Fri, 19 Feb 2016 21:59:10 -0500 Subject: [PATCH] Added bin/oct/hex string->integer conversions --- include/cyclone/runtime.h | 3 +++ runtime.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 255604db..f1b19093 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -154,6 +154,9 @@ object Cyc_symbol2string(void *d, object cont, object sym) ; object Cyc_string2symbol(void *d, object str); object Cyc_list2string(void *d, object cont, object lst); common_type Cyc_string2number(void *d, object str); +int binstr2int(const char *str); +int octstr2int(const char *str); +int hexstr2int(const char *str); object Cyc_string_append(void *data, object cont, int argc, object str1, ...); integer_type Cyc_string_length(void *data, object str); object Cyc_substring(void *data, object cont, object str, object start, object end); diff --git a/runtime.c b/runtime.c index d16992ba..5cb9b664 100644 --- a/runtime.c +++ b/runtime.c @@ -1057,6 +1057,43 @@ common_type Cyc_string2number(void *data, object str){ return result; } +int binstr2int(const char *str) +{ + int num = 0; + while (*str) { + num <<= 1; + if (*str++ == '1') num++; + } + return num; +} + +int octstr2int(const char *str) +{ + int num = 0; + while (*str) { + num <<= 3; + num += ((*str++) - '0'); + } + return num; +} + +int hexstr2int(const char *str) +{ + int num = 0; + while (*str) { + num <<= 4; + if (*str >= 'A' && *str <= 'F'){ + num += (((*str) - 'A') + 10); + } else if (*str >= 'a' && *str <= 'f'){ + num += (((*str) - 'a') + 10); + } else { + num += ((*str) - '0'); + } + *str++; + } + return num; +} + integer_type Cyc_string_cmp(void *data, object str1, object str2) { Cyc_check_str(data, str1); Cyc_check_str(data, str2);