Skip to content

Commit 183bc84

Browse files
committed
add more libc functions
add missing ICACHE_RODATA_ATTR define in #else case
1 parent c198d93 commit 183bc84

File tree

3 files changed

+143
-57
lines changed

3 files changed

+143
-57
lines changed

hardware/esp8266com/esp8266/cores/esp8266/core_esp8266_noniso.c

+4-48
Original file line numberDiff line numberDiff line change
@@ -34,57 +34,13 @@ int atoi(const char* s) {
3434
}
3535

3636
long atol(const char* s) {
37-
long int result = 0;
38-
int i;
39-
const char* b = s;
40-
int sign = 1;
41-
for(i = 0; *b; ++i, ++b) {
42-
if(i == 0 && *b == '-') sign = -1;
43-
int x = *b - '0';
44-
if(x < 0 || x > 9) break;
45-
result = result * 10 + x;
46-
}
47-
return sign * result;
37+
const char * tmp;
38+
return strtol(s, &tmp, 10);
4839
}
4940

50-
// Source:
51-
// https://github.com/anakod/Sming/blob/master/Sming/system/stringconversion.cpp#L93
5241
double atof(const char* s) {
53-
double result = 0;
54-
double sign = 1;
55-
56-
while(*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n')
57-
++s;
58-
59-
if(*s == 0) return 0;
60-
61-
if(*s == '-') {
62-
sign = -1;
63-
++s;
64-
}
65-
if(*s == '+') {
66-
++s;
67-
}
68-
69-
bool decimals = false;
70-
double factor = 1.0;
71-
char c;
72-
while((c = *s)) {
73-
if(c == '.') {
74-
decimals = true;
75-
++s;
76-
continue;
77-
}
78-
79-
int d = c - '0';
80-
if(d < 0 || d > 9) break;
81-
82-
result = 10.0 * result + d;
83-
if(decimals) factor *= 0.1;
84-
++s;
85-
}
86-
87-
return result * factor;
42+
const char * tmp;
43+
return strtod(s, &tmp);
8844
}
8945

9046
void reverse(char* begin, char* end) {

hardware/esp8266com/esp8266/cores/esp8266/libc_replacements.c

+138-9
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525

2626
#include <stddef.h>
2727
#include <stdarg.h>
28+
#include <stdio.h>
2829
#include <math.h>
30+
#include <limits.h>
31+
#include <errno.h>
2932

3033
#include "ets_sys.h"
3134
#include "os_type.h"
@@ -46,6 +49,10 @@ void* realloc(void* ptr, size_t size) {
4649
return os_realloc(ptr, size);
4750
}
4851

52+
int puts(const char * str){
53+
return os_printf("%s", str);
54+
}
55+
4956
int printf(const char* format, ...) {
5057
int ret;
5158
va_list arglist;
@@ -113,7 +120,7 @@ char *ets_strstr(const char *haystack, const char *needle) {
113120
return strstr(haystack, needle);
114121
}
115122

116-
char *strchr(const char * str, int character) {
123+
char * strchr(const char * str, int character) {
117124
while(1) {
118125
if(*str == 0x00) {
119126
return NULL;
@@ -125,7 +132,7 @@ char *strchr(const char * str, int character) {
125132
}
126133
}
127134

128-
char *strrchr(const char * str, int character) {
135+
char * strrchr(const char * str, int character) {
129136
char * ret = NULL;
130137
while(1) {
131138
if(*str == 0x00) {
@@ -138,11 +145,11 @@ char *strrchr(const char * str, int character) {
138145
}
139146
}
140147

141-
char *strcat(char * dest, const char * src) {
148+
char * strcat(char * dest, const char * src) {
142149
return strncat(dest, src, strlen(src));
143150
}
144151

145-
char *strncat(char * dest, const char * src, size_t n) {
152+
char * strncat(char * dest, const char * src, size_t n) {
146153
uint32_t offset = strlen(dest);
147154
for(uint32_t i = 0; i < n; i++) {
148155
*(dest + i + offset) = *(src + i);
@@ -153,7 +160,7 @@ char *strncat(char * dest, const char * src, size_t n) {
153160
return dest;
154161
}
155162

156-
char *strtok_r(char * str, const char * delimiters, char ** temp) {
163+
char * strtok_r(char * str, const char * delimiters, char ** temp) {
157164
static char * ret = NULL;
158165
char * start = NULL;
159166
char * end = NULL;
@@ -195,6 +202,128 @@ char *strtok_r(char * str, const char * delimiters, char ** temp) {
195202
return ret;
196203
}
197204

205+
int strcasecmp(const char * str1, const char * str2) {
206+
int d = 0;
207+
while(1) {
208+
int c1 = tolower(*str1++);
209+
int c2 = tolower(*str2++);
210+
if(((d = c1 - c2) != 0) || (c2 == '\0')) {
211+
break;
212+
}
213+
}
214+
return d;
215+
}
216+
217+
char * strdup(const char *str) {
218+
size_t len = strlen(str) + 1;
219+
char *cstr = malloc(len);
220+
if(cstr) {
221+
memcpy(cstr, str, len);
222+
}
223+
return cstr;
224+
}
225+
226+
227+
long int ICACHE_FLASH_ATTR strtol(const char* str, char** endptr, int base) {
228+
long int result = 0;
229+
int sign = 1;
230+
231+
while(isspace(*str)) {
232+
str++;
233+
}
234+
235+
if(*str == 0x00) {
236+
// only space in str?
237+
*endptr = (char*) str;
238+
return result;
239+
}
240+
241+
switch(base) {
242+
case 10:
243+
244+
if(*str == '-') {
245+
sign = -1;
246+
str++;
247+
} else if(*str == '+') {
248+
str++;
249+
}
250+
251+
for(uint8_t i = 0; *str; i++, str++) {
252+
int x = *str - '0';
253+
if(x < 0 || x > 9) {
254+
break;
255+
}
256+
result = result * 10 + x;
257+
}
258+
break;
259+
case 2:
260+
for(uint8_t i = 0; *str; i++, str++) {
261+
int x = *str - '0';
262+
if(x < 0 || x > 1) {
263+
break;
264+
}
265+
result = result * 2 + x;
266+
}
267+
break;
268+
case 16:
269+
default:
270+
os_printf("fnk: strtol() only supports base 10 and 2 ATM!\n");
271+
break;
272+
273+
}
274+
*endptr = (char*) str;
275+
return sign * result;
276+
}
277+
278+
279+
// based on Source:
280+
// https://github.com/anakod/Sming/blob/master/Sming/system/stringconversion.cpp#L93
281+
double ICACHE_FLASH_ATTR strtod(const char* str, char** endptr) {
282+
double result = 0.0;
283+
double factor = 1.0;
284+
bool decimals = false;
285+
char c;
286+
287+
while(isspace(*str)) {
288+
str++;
289+
}
290+
291+
if(*str == 0x00) {
292+
// only space in str?
293+
*endptr = (char*) str;
294+
return result;
295+
}
296+
297+
if(*str == '-') {
298+
factor = -1;
299+
str++;
300+
} else if(*str == '+') {
301+
str++;
302+
}
303+
304+
while((c = *str)) {
305+
if(c == '.') {
306+
decimals = true;
307+
str++;
308+
continue;
309+
}
310+
311+
int d = c - '0';
312+
if(d < 0 || d > 9) {
313+
break;
314+
}
315+
316+
result = 10.0 * result + d;
317+
if(decimals) {
318+
factor *= 0.1;
319+
}
320+
321+
str++;
322+
}
323+
*endptr = (char*) str;
324+
return result * factor;
325+
}
326+
198327
// ##########################################################################
199328
// ctype functions
200329
// ##########################################################################
@@ -226,6 +355,7 @@ int isdigit(int c) {
226355
}
227356
return 0;
228357
}
358+
229359
int isgraph(int c) {
230360
if(isprint(c) && c != ' ') {
231361
return 1;
@@ -312,14 +442,13 @@ int isblank(int c) {
312442

313443
// ##########################################################################
314444

315-
static int errno = 0;
445+
static int errno_var = 0;
316446

317447
int * __errno(void) {
318-
printf("__errno is called last error: %d (not current)\n", errno);
319-
return &errno;
448+
os_printf("__errno is called last error: %d (not current)\n", errno_var);
449+
return &errno_var;
320450
}
321451

322-
323452
// ##########################################################################
324453
// __ieee754 functions
325454
// ##########################################################################

hardware/tools/esp8266/sdk/include/c_types.h

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ typedef enum {
6969
#define ICACHE_RODATA_ATTR __attribute__((section(".irom.text")))
7070
#else
7171
#define ICACHE_FLASH_ATTR
72+
#define ICACHE_RODATA_ATTR
7273
#endif /* ICACHE_FLASH */
7374

7475
#ifndef __cplusplus

0 commit comments

Comments
 (0)