/*
* strtok的替代函数
* int
* split(int argc, char *argv[], char *string, char *delimiter)
* argc - 最大分割token数
* argv - 保存token地址
* string - 要分割成token的字符串
* delimiter - 分界符,NULL表示默认空白字符
* 返回值:实际的token数,这个数可能比argc大,此时argv[argc - 1]后的字符串未分割
*/
#include <stdio.h>
#include <ctype.h>
#include <memory.h>
#define BITMAP(name, counts) /
unsigned char name[(counts + 7) / 8]
#define BITMAP_ZERO(name) /
memset(name, 0, sizeof(name))
#define BITMAP_SET(offset, name) /
(name)[(offset) >> 3] |= 1 << ((offset) & 7)
#define BITMAP_ISSET(offset, name) /
((name)[(offset) >> 3] & (1 << ((offset) & 7)))
int
split(int argc, char *argv[], char *string, unsigned char *delimiter)
{
int rc, flags, new_flags;
unsigned char v;
BITMAP(map, 256);
BITMAP_ZERO(map);
if (delimiter)
{
while ((v = *delimiter++))
{
BITMAP_SET(v, map);
}
}
else
{
for (rc = 0; rc < 256; ++rc)
{
if (isspace(rc))
{
BITMAP_SET(rc, map);
}
}
}
flags = 0;
rc = 0;
while ((v = *(unsigned char *)string))
{
new_flags = BITMAP_ISSET(v, map)? 0: 1;
if (new_flags != flags)
{
if (flags)
{
if (argv && rc < argc)
{
*string = '/0';
}
}
else
{
if (argv && rc < argc)
{
argv[rc] = string;
}
++rc;
}
flags = new_flags;
}
++string;
}
return rc;
}