From 8386119b814c3e3de96cddc01d7a106f5dec0176 Mon Sep 17 00:00:00 2001 From: ppostuma Date: Mon, 2 Jan 2017 19:43:14 -0400 Subject: [PATCH 1/2] Update libc_replacements.c --- cores/oak/libc_replacements.c | 54 ++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/cores/oak/libc_replacements.c b/cores/oak/libc_replacements.c index f7d1420..843cf63 100644 --- a/cores/oak/libc_replacements.c +++ b/cores/oak/libc_replacements.c @@ -225,6 +225,9 @@ char* strdup(const char *str) { double strtod(const char* str, char** endptr) { double result = 0.0; double factor = 1.0; + bool exp_factor = 1; //default 1 - positive exponent. Use 0 for negative + double exponent = 0; + double multiplier = 1; //multiplier for exponent bool decimals = false; char c; @@ -252,22 +255,53 @@ double strtod(const char* str, char** endptr) { continue; } - int d = c - '0'; - if(d < 0 || d > 9) { - break; + if (c == 'e' || c == 'E') { + str++; + if(*str == '-') { + exp_factor = 0; + str++; + } else if(*str == '+') { + str++; + } + while (c = *str) { //this while loop for the exponent + int d = c - '0'; + if (d < 0 || d > 9) { + break; + } + exponent = exponent * 10 + d; + str++; + } } - - result = 10.0 * result + d; - if(decimals) { - factor *= 0.1; + + else { + int d = c - '0'; + if(d < 0 || d > 9) { + break; + } + + result = 10.0 * result + d; + if(decimals) { + factor *= 0.1; + } + + str++; } - - str++; } if (endptr) *endptr = (char*) str; - return result * factor; + result *= factor; + + if (exponent) { + for (double i = 0; i < exponent; i++) { + multiplier *= 10; + } + if (exp_factor) result *= multiplier; + else result /= multiplier; + } + + return result; } + // ########################################################################## // ctype functions // ########################################################################## From 9d06e868cf4623b35e1393136aaef678cdc007df Mon Sep 17 00:00:00 2001 From: ppostuma Date: Tue, 3 Jan 2017 17:02:30 -0400 Subject: [PATCH 2/2] Update libc_replacements.c --- cores/oak/libc_replacements.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cores/oak/libc_replacements.c b/cores/oak/libc_replacements.c index 843cf63..7bd1eff 100644 --- a/cores/oak/libc_replacements.c +++ b/cores/oak/libc_replacements.c @@ -291,9 +291,7 @@ double strtod(const char* str, char** endptr) { result *= factor; if (exponent) { - for (double i = 0; i < exponent; i++) { - multiplier *= 10; - } + multiplier = pow(10, exponent); if (exp_factor) result *= multiplier; else result /= multiplier; }