char *my_strtok(char *str, char sep)
{
static char *next_token = NULL;
char *start = str ? str : next_token;
if(!start)
return 0;
char *p = strchr(start, seq);
if(NULL == p)
next_token = NULL;
else
{
next_token = p+1;
*p = 0;
}
return start;
}
/*
char buf[] = "1,2,3,4,5";
for(char *p = buf; p = my_strtok(p, ','); p = 0)
printf("%s/n", p);
*/
// with last context pointer
char *my_strtok_safe(char *str, char sep, char *&next)
{
char *start = str ? str : next;
if(!start)
return NULL;
char *p = strchr(start, sep);
if(NULL == p)
next = NULL;
else
{
next = p+1;
*p = NULL;
}
return start;
}
/*
char buf[] = "1,2,3,4,5";
char *next = NULL;
for(char *p = buf; p = my_strtok_safe(p, ',',next); p = 0)
printf("%s/n", p);
*/
/*
1) handle multi-thread re-entrance
2) handle empty string token
3) only store pointer, no copy operation
*/
void my_tokenize(char *data, char sep, vector<char*> &tok_ptr)
{
//tok_ptr should call reserve() to allocate space
char *context=0;
for(char *p = data; p = my_strtok_safe(p, sep, context); p = 0)
tok_ptr.push_back(p);
}
/* sample
char data[] = "1,2,,4,";
vector<char*> tokens;
tokens.reserve(10);
my_tokenize(data, ',', tokens);
for(int i = 0; i < tokens.size(); i++)
cout << "line " << i << ":" << tokens[i] << endl;
*/
int my_tokenize_fast(char *data, char sep, char **token, int max_count)
{
char *context=0;
int idx = 0;
for(char *p = data; (p = my_strtok_safe(p, sep, context)) && idx < max_count; p = 0)
token[idx++] = p;
return idx;
}
/*
char *ptrs[50] = {0};
int count = my_tokenize_fast(buf, '|', ptrs, 50);
*/