mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-06 05:21:22 +03:00
add more libc functions
add missing ICACHE_RODATA_ATTR define in #else case
This commit is contained in:
parent
5550792d7d
commit
be6b8f8a2d
@ -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) {
|
||||
|
@ -25,7 +25,10 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <limits.h>
|
||||
#include <errno.h>
|
||||
|
||||
#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
|
||||
// ##########################################################################
|
||||
|
Loading…
x
Reference in New Issue
Block a user