char_converter code refine

pull/10/head
yuqing 2016-11-25 15:07:48 +08:00
parent 8cb8c29c45
commit fe4f42f090
2 changed files with 98 additions and 12 deletions

View File

@ -33,7 +33,8 @@ int char_converter_init(FastCharConverter *pCharConverter,
for (i=0; i<count; i++) for (i=0; i<count; i++)
{ {
src = charPairs[i].src; src = charPairs[i].src;
pCharConverter->char_table[src] = charPairs[i].dest; pCharConverter->char_table[src].op = FAST_CHAR_OP_NO_BACKSLASH;
pCharConverter->char_table[src].dest = charPairs[i].dest;
} }
return 0; return 0;
} }
@ -63,15 +64,27 @@ int std_space_char_converter_init(FastCharConverter *pCharConverter,
void char_converter_set_pair(FastCharConverter *pCharConverter, void char_converter_set_pair(FastCharConverter *pCharConverter,
const unsigned char src, const unsigned char dest) const unsigned char src, const unsigned char dest)
{ {
pCharConverter->char_table[src] = dest; char_converter_set_pair_ex(pCharConverter, src, FAST_CHAR_OP_NO_BACKSLASH, dest);
}
void char_converter_set_pair_ex(FastCharConverter *pCharConverter,
const unsigned char src, const unsigned op, const unsigned char dest)
{
pCharConverter->char_table[src].op = op;
pCharConverter->char_table[src].dest = dest;
} }
int fast_char_convert(FastCharConverter *pCharConverter, int fast_char_convert(FastCharConverter *pCharConverter,
char *text, const int text_len) char *text, int *text_len, const int max_size)
{ {
int count; int count;
unsigned char *p; unsigned char *p;
unsigned char *pi;
unsigned char *end; unsigned char *end;
char fixed_buff[16 * 1024];
char *buff;
int max_size_sub1;
int remain_len;
if (pCharConverter->count <= 0) if (pCharConverter->count <= 0)
{ {
@ -79,16 +92,67 @@ int fast_char_convert(FastCharConverter *pCharConverter,
} }
count = 0; count = 0;
end = (unsigned char *)text + text_len; end = (unsigned char *)text + *text_len;
for (p=(unsigned char *)text; p<end; p++) for (p=(unsigned char *)text; p<end; p++)
{ {
if (pCharConverter->char_table[*p] != 0) if (pCharConverter->char_table[*p].op != FAST_CHAR_OP_NONE)
{ {
*p = pCharConverter->char_table[*p]; if (pCharConverter->char_table[*p].op == FAST_CHAR_OP_ADD_BACKSLASH) {
break;
}
*p = pCharConverter->char_table[*p].dest;
++count; ++count;
} }
} }
remain_len = end - p;
if (remain_len == 0) {
return count;
}
if (remain_len < sizeof(fixed_buff)) {
buff = fixed_buff;
} else {
buff = (char *)malloc(remain_len);
if (buff == NULL) {
logError("file: "__FILE__", line: %d, "
"malloc %d bytes fail", __LINE__, remain_len);
return count;
}
}
memcpy(buff, p, remain_len);
max_size_sub1 = max_size - 1;
end = (unsigned char *)buff + remain_len;
for (pi=(unsigned char *)buff; pi<end; pi++)
{
if (p - (unsigned char *)text >= max_size_sub1)
{
logWarning("file: "__FILE__", line: %d, "
"exceeds max size: %d", __LINE__, max_size);
break;
}
if (pCharConverter->char_table[*pi].op != FAST_CHAR_OP_NONE)
{
if (pCharConverter->char_table[*pi].op == FAST_CHAR_OP_ADD_BACKSLASH)
{
*p++ = '\\';
}
*p++ = pCharConverter->char_table[*pi].dest;
++count;
}
else
{
*p++ = *pi;
}
}
if (buff != fixed_buff) {
free(buff);
}
*text_len = p - (unsigned char *)text;
return count; return count;
} }

View File

@ -20,12 +20,22 @@ extern "C" {
#define FAST_MAX_CHAR_COUNT 256 #define FAST_MAX_CHAR_COUNT 256
#define FAST_CHAR_OP_NONE 0
#define FAST_CHAR_OP_ADD_BACKSLASH 1
#define FAST_CHAR_OP_NO_BACKSLASH 2
typedef struct fast_char_pair typedef struct fast_char_pair
{ {
unsigned char src; unsigned char src;
unsigned char dest; unsigned char dest;
} FastCharPair; } FastCharPair;
typedef struct fast_char_target
{
unsigned char op;
unsigned char dest;
} FastCharTarget;
typedef struct fast_char_converter typedef struct fast_char_converter
{ {
/* /*
@ -36,7 +46,7 @@ typedef struct fast_char_converter
/* /*
* char table to convert * char table to convert
* */ * */
unsigned char char_table[FAST_MAX_CHAR_COUNT]; FastCharTarget char_table[FAST_MAX_CHAR_COUNT];
} FastCharConverter; } FastCharConverter;
/** /**
@ -61,7 +71,7 @@ int std_space_char_converter_init(FastCharConverter *pCharConverter,
const unsigned char dest_base); const unsigned char dest_base);
/** /**
* standard space chars to convert * set char pair to converter
* parameters: * parameters:
* pCharConverter: the char converter * pCharConverter: the char converter
* src: the src char * src: the src char
@ -71,17 +81,29 @@ int std_space_char_converter_init(FastCharConverter *pCharConverter,
void char_converter_set_pair(FastCharConverter *pCharConverter, void char_converter_set_pair(FastCharConverter *pCharConverter,
const unsigned char src, const unsigned char dest); const unsigned char src, const unsigned char dest);
/**
* set char pair to converter
* parameters:
* pCharConverter: the char converter
* src: the src char
* op: the operator type
* dest: the dest char
* return: none
*/
void char_converter_set_pair_ex(FastCharConverter *pCharConverter,
const unsigned char src, const unsigned op, const unsigned char dest);
/** /**
* char convert function * char convert function
* parameters: * parameters:
* pCharConverter: the char converter * pCharConverter: the char converter
* text: the text to convert * text: the text to convert (input and output)
* text_len: the length of text * text_len: the length of text (input and output)
* max_size: max buff size
* return: converted char count * return: converted char count
*/ */
int fast_char_convert(FastCharConverter *pCharConverter, int fast_char_convert(FastCharConverter *pCharConverter,
char *text, const int text_len); char *text, int *text_len, const int max_size);
#ifdef __cplusplus #ifdef __cplusplus
} }