diff --git a/cores/esp8266/core_esp8266_noniso.c b/cores/esp8266/core_esp8266_noniso.c index 9fa324196..298ca4236 100644 --- a/cores/esp8266/core_esp8266_noniso.c +++ b/cores/esp8266/core_esp8266_noniso.c @@ -34,57 +34,13 @@ int atoi(const char* s) { } long atol(const char* s) { - long int result = 0; - int i; - const char* b = s; - int sign = 1; - for(i = 0; *b; ++i, ++b) { - if(i == 0 && *b == '-') sign = -1; - int x = *b - '0'; - if(x < 0 || x > 9) break; - result = result * 10 + x; - } - return sign * result; + const char * tmp; + return strtol(s, &tmp, 10); } -// Source: -// https://github.com/anakod/Sming/blob/master/Sming/system/stringconversion.cpp#L93 double atof(const char* s) { - double result = 0; - double sign = 1; - - while(*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') - ++s; - - if(*s == 0) return 0; - - if(*s == '-') { - sign = -1; - ++s; - } - if(*s == '+') { - ++s; - } - - bool decimals = false; - double factor = 1.0; - char c; - while((c = *s)) { - if(c == '.') { - decimals = true; - ++s; - continue; - } - - int d = c - '0'; - if(d < 0 || d > 9) break; - - result = 10.0 * result + d; - if(decimals) factor *= 0.1; - ++s; - } - - return result * factor; + const char * tmp; + return strtod(s, &tmp); } void reverse(char* begin, char* end) { diff --git a/cores/esp8266/libc_replacements.c b/cores/esp8266/libc_replacements.c index e0e19361c..02bffe4a2 100644 --- a/cores/esp8266/libc_replacements.c +++ b/cores/esp8266/libc_replacements.c @@ -25,7 +25,10 @@ #include #include +#include #include +#include +#include #include "ets_sys.h" #include "os_type.h" @@ -46,6 +49,10 @@ void* realloc(void* ptr, size_t size) { return os_realloc(ptr, size); } +int puts(const char * str){ + return os_printf("%s", str); +} + int printf(const char* format, ...) { int ret; va_list arglist; @@ -113,7 +120,7 @@ char *ets_strstr(const char *haystack, const char *needle) { return strstr(haystack, needle); } -char *strchr(const char * str, int character) { +char * strchr(const char * str, int character) { while(1) { if(*str == 0x00) { return NULL; @@ -125,7 +132,7 @@ char *strchr(const char * str, int character) { } } -char *strrchr(const char * str, int character) { +char * strrchr(const char * str, int character) { char * ret = NULL; while(1) { if(*str == 0x00) { @@ -138,11 +145,11 @@ char *strrchr(const char * str, int character) { } } -char *strcat(char * dest, const char * src) { +char * strcat(char * dest, const char * src) { return strncat(dest, src, strlen(src)); } -char *strncat(char * dest, const char * src, size_t n) { +char * strncat(char * dest, const char * src, size_t n) { uint32_t offset = strlen(dest); for(uint32_t i = 0; i < n; i++) { *(dest + i + offset) = *(src + i); @@ -153,7 +160,7 @@ char *strncat(char * dest, const char * src, size_t n) { return dest; } -char *strtok_r(char * str, const char * delimiters, char ** temp) { +char * strtok_r(char * str, const char * delimiters, char ** temp) { static char * ret = NULL; char * start = NULL; char * end = NULL; @@ -195,6 +202,128 @@ char *strtok_r(char * str, const char * delimiters, char ** temp) { return ret; } +int strcasecmp(const char * str1, const char * str2) { + int d = 0; + while(1) { + int c1 = tolower(*str1++); + int c2 = tolower(*str2++); + if(((d = c1 - c2) != 0) || (c2 == '\0')) { + break; + } + } + return d; +} + +char * strdup(const char *str) { + size_t len = strlen(str) + 1; + char *cstr = malloc(len); + if(cstr) { + memcpy(cstr, str, len); + } + return cstr; +} + + +long int ICACHE_FLASH_ATTR strtol(const char* str, char** endptr, int base) { + long int result = 0; + int sign = 1; + + while(isspace(*str)) { + str++; + } + + if(*str == 0x00) { + // only space in str? + *endptr = (char*) str; + return result; + } + + switch(base) { + case 10: + + if(*str == '-') { + sign = -1; + str++; + } else if(*str == '+') { + str++; + } + + for(uint8_t i = 0; *str; i++, str++) { + int x = *str - '0'; + if(x < 0 || x > 9) { + break; + } + result = result * 10 + x; + } + break; + case 2: + for(uint8_t i = 0; *str; i++, str++) { + int x = *str - '0'; + if(x < 0 || x > 1) { + break; + } + result = result * 2 + x; + } + break; + case 16: + default: + os_printf("fnk: strtol() only supports base 10 and 2 ATM!\n"); + break; + + } + *endptr = (char*) str; + return sign * result; +} + + +// based on Source: +// https://github.com/anakod/Sming/blob/master/Sming/system/stringconversion.cpp#L93 +double ICACHE_FLASH_ATTR strtod(const char* str, char** endptr) { + double result = 0.0; + double factor = 1.0; + bool decimals = false; + char c; + + while(isspace(*str)) { + str++; + } + + if(*str == 0x00) { + // only space in str? + *endptr = (char*) str; + return result; + } + + if(*str == '-') { + factor = -1; + str++; + } else if(*str == '+') { + str++; + } + + while((c = *str)) { + if(c == '.') { + decimals = true; + str++; + continue; + } + + int d = c - '0'; + if(d < 0 || d > 9) { + break; + } + + result = 10.0 * result + d; + if(decimals) { + factor *= 0.1; + } + + str++; + } + *endptr = (char*) str; + return result * factor; +} + // ########################################################################## // ctype functions // ########################################################################## @@ -226,6 +355,7 @@ int isdigit(int c) { } return 0; } + int isgraph(int c) { if(isprint(c) && c != ' ') { return 1; @@ -312,14 +442,13 @@ int isblank(int c) { // ########################################################################## -static int errno = 0; +static int errno_var = 0; int * __errno(void) { - printf("__errno is called last error: %d (not current)\n", errno); - return &errno; + os_printf("__errno is called last error: %d (not current)\n", errno_var); + return &errno_var; } - // ########################################################################## // __ieee754 functions // ##########################################################################