1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-06-07 16:23:38 +03:00

Merge pull request #357 from Makuna/StrTok

Fix strtok
This commit is contained in:
Ivan Grokhotkov 2015-05-29 19:39:27 +03:00
commit 491b15c433

View File

@ -169,60 +169,65 @@ char* ICACHE_FLASH_ATTR strncat(char * dest, const char * src, size_t n) {
return dest; return dest;
} }
char* ICACHE_FLASH_ATTR strtok_r(char* s, const char* delim, char** last) {
const char* spanp;
char* tok;
char c;
char sc;
char* ICACHE_FLASH_ATTR strtok_r(char * str, const char * delimiters, char ** temp) { if (s == NULL && (s = *last) == NULL) {
static char * ret = NULL; return (NULL);
char * start = NULL; }
char * end = NULL;
uint32_t size = 0;
if(str == NULL) {
if(temp == NULL) { // Skip (span) leading delimiters
return NULL; //
cont:
c = *s++;
for (spanp = delim; (sc = *spanp++) != 0;) {
if (c == sc) {
goto cont;
} }
start = *temp;
} else {
start = str;
} }
if(start == NULL) { // check for no delimiters left
return NULL; //
if (c == '\0') {
*last = NULL;
return (NULL);
} }
if(delimiters == NULL) { tok = s - 1;
return NULL;
}
end = start;
while(1) { // Scan token
for(uint16_t i = 0; i < strlen(delimiters); i++) { // Note that delim must have one NUL; we stop if we see that, too.
if(*end == *(delimiters + i)) { //
break; for (;;) {
c = *s++;
spanp = (char *)delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0) {
s = NULL;
}
else {
s[-1] = '\0';
}
*last = s;
return (tok);
} }
}
end++; } while (sc != 0);
if(*end == 0x00) {
break;
}
} }
*temp = end; // NOTREACHED EVER
if(ret != NULL) {
free(ret);
}
size = (end - start);
ret = (char *) malloc(size);
strncpy(ret, start, size);
return ret;
} }
char* ICACHE_FLASH_ATTR strtok(char * str, const char * delimiters) { char* ICACHE_FLASH_ATTR strtok(char* s, const char* delim) {
static char * ret = NULL; static char* last;
ret = strtok_r(str, delimiters, &ret);
return ret; return (strtok_r(s, delim, &last));
} }
int ICACHE_FLASH_ATTR strcasecmp(const char * str1, const char * str2) { int ICACHE_FLASH_ATTR strcasecmp(const char * str1, const char * str2) {