Skip to content

Commit 4972a50

Browse files
committed
Merge pull request #357 from Makuna/StrTok
Fix strtok
2 parents 3f26dc6 + 993f731 commit 4972a50

File tree

1 file changed

+44
-39
lines changed

1 file changed

+44
-39
lines changed

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

+44-39
Original file line numberDiff line numberDiff line change
@@ -169,60 +169,65 @@ char* ICACHE_FLASH_ATTR strncat(char * dest, const char * src, size_t n) {
169169
return dest;
170170
}
171171

172+
char* ICACHE_FLASH_ATTR strtok_r(char* s, const char* delim, char** last) {
173+
const char* spanp;
174+
char* tok;
175+
char c;
176+
char sc;
177+
178+
if (s == NULL && (s = *last) == NULL) {
179+
return (NULL);
180+
}
172181

173-
char* ICACHE_FLASH_ATTR strtok_r(char * str, const char * delimiters, char ** temp) {
174-
static char * ret = NULL;
175-
char * start = NULL;
176-
char * end = NULL;
177-
uint32_t size = 0;
178182

179-
if(str == NULL) {
180-
if(temp == NULL) {
181-
return NULL;
183+
// Skip (span) leading delimiters
184+
//
185+
cont:
186+
c = *s++;
187+
for (spanp = delim; (sc = *spanp++) != 0;) {
188+
if (c == sc) {
189+
goto cont;
182190
}
183-
start = *temp;
184-
} else {
185-
start = str;
186191
}
187192

188-
if(start == NULL) {
189-
return NULL;
193+
// check for no delimiters left
194+
//
195+
if (c == '\0') {
196+
*last = NULL;
197+
return (NULL);
190198
}
191199

192-
if(delimiters == NULL) {
193-
return NULL;
194-
}
200+
tok = s - 1;
195201

196-
end = start;
197202

198-
while(1) {
199-
for(uint16_t i = 0; i < strlen(delimiters); i++) {
200-
if(*end == *(delimiters + i)) {
201-
break;
203+
// Scan token
204+
// Note that delim must have one NUL; we stop if we see that, too.
205+
//
206+
for (;;) {
207+
c = *s++;
208+
spanp = (char *)delim;
209+
do {
210+
if ((sc = *spanp++) == c) {
211+
if (c == 0) {
212+
s = NULL;
213+
}
214+
else {
215+
s[-1] = '\0';
216+
}
217+
*last = s;
218+
return (tok);
202219
}
203-
}
204-
end++;
205-
if(*end == 0x00) {
206-
break;
207-
}
208-
}
209220

210-
*temp = end;
211-
212-
if(ret != NULL) {
213-
free(ret);
221+
} while (sc != 0);
214222
}
215223

216-
size = (end - start);
217-
ret = (char *) malloc(size);
218-
strncpy(ret, start, size);
219-
return ret;
224+
// NOTREACHED EVER
220225
}
221226

222-
char* ICACHE_FLASH_ATTR strtok(char * str, const char * delimiters) {
223-
static char * ret = NULL;
224-
ret = strtok_r(str, delimiters, &ret);
225-
return ret;
227+
char* ICACHE_FLASH_ATTR strtok(char* s, const char* delim) {
228+
static char* last;
229+
230+
return (strtok_r(s, delim, &last));
226231
}
227232

228233
int ICACHE_FLASH_ATTR strcasecmp(const char * str1, const char * str2) {

0 commit comments

Comments
 (0)