mirror of https://github.com/attractivechaos/klib
accelerate kstrtok()
This commit is contained in:
parent
25d0c332ce
commit
d8d0c5fbcb
24
kstring.c
24
kstring.c
|
@ -29,16 +29,24 @@ char *kstrtok(const char *str, const char *sep, ks_tokaux_t *aux)
|
|||
const char *p, *start;
|
||||
if (sep) { // set up the table
|
||||
if (str == 0 && (aux->tab[0]&1)) return 0; // no need to set up if we have finished
|
||||
aux->tab[0] = aux->tab[1] = aux->tab[2] = aux->tab[3] = 0;
|
||||
for (p = sep; *p; ++p)
|
||||
aux->tab[*p/64] |= 1ull<<(*p%64);
|
||||
aux->finished = 0;
|
||||
if (sep[1]) {
|
||||
aux->sep = -1;
|
||||
aux->tab[0] = aux->tab[1] = aux->tab[2] = aux->tab[3] = 0;
|
||||
for (p = sep; *p; ++p) aux->tab[*p>>6] |= 1ull<<(*p&0x3f);
|
||||
} else aux->sep = sep[0];
|
||||
}
|
||||
if (aux->finished) return 0;
|
||||
else if (str) aux->p = str - 1, aux->finished = 0;
|
||||
if (aux->sep < 0) {
|
||||
for (p = start = aux->p + 1; *p; ++p)
|
||||
if (aux->tab[*p>>6]>>(*p&0x3f)&1) break;
|
||||
} else {
|
||||
for (p = start = aux->p + 1; *p; ++p)
|
||||
if (*p == aux->sep) break;
|
||||
}
|
||||
if (str) aux->p = str - 1, aux->tab[0] &= ~1ull;
|
||||
else if (aux->tab[0]&1) return 0;
|
||||
for (p = start = aux->p + 1; *p; ++p)
|
||||
if (aux->tab[*p/64]>>(*p%64)&1) break;
|
||||
aux->p = p; // end of token
|
||||
if (*p == 0) aux->tab[0] |= 1; // no more tokens
|
||||
if (*p == 0) aux->finished = 1; // no more tokens
|
||||
return (char*)start;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue