From d8d0c5fbcb61e56a9cc607e16a65a290978fc47c Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sat, 12 Feb 2011 18:52:08 -0500 Subject: [PATCH] accelerate kstrtok() --- kstring.c | 24 ++++++++++++++++-------- kstring.h | 1 + 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/kstring.c b/kstring.c index 43d524c..b2a0dab 100644 --- a/kstring.c +++ b/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; } diff --git a/kstring.h b/kstring.h index 03aad74..73fcc6b 100644 --- a/kstring.h +++ b/kstring.h @@ -44,6 +44,7 @@ typedef struct __kstring_t { typedef struct { uint64_t tab[4]; + int sep, finished; const char *p; // end of the current token } ks_tokaux_t; -- 2.47.3