add files: char_convert_loader.h and char_convert_loader.c

pull/10/head
yuqing 2016-11-26 12:20:43 +08:00
parent fe4f42f090
commit 33085e9bf6
5 changed files with 223 additions and 6 deletions

View File

@ -1,9 +1,10 @@
Version 1.31 2016-11-25
Version 1.31 2016-11-26
* move SET_SOCKOPT_NOSIGPIPE from sockopt.c to sockopt.h
* add function get_time_item_from_str
* add file trylock functions
* add files: char_converter.h and char_converter.c
* add files: char_convert_loader.h and char_convert_loader.c
Version 1.30 2016-10-31
* modify php-fastcommon/test.php

View File

@ -12,7 +12,7 @@ FAST_SHARED_OBJS = hash.lo chain.lo shared_func.lo ini_file_reader.lo \
connection_pool.lo fast_mpool.lo fast_allocator.lo \
fast_buffer.lo multi_skiplist.lo flat_skiplist.lo \
system_info.lo fast_blocked_queue.lo id_generator.lo \
char_converter.lo
char_converter.lo char_convert_loader.lo
FAST_STATIC_OBJS = hash.o chain.o shared_func.o ini_file_reader.o \
logger.o sockopt.o base64.o sched_thread.o \
@ -22,7 +22,7 @@ FAST_STATIC_OBJS = hash.o chain.o shared_func.o ini_file_reader.o \
connection_pool.o fast_mpool.o fast_allocator.o \
fast_buffer.o multi_skiplist.o flat_skiplist.o \
system_info.o fast_blocked_queue.o id_generator.o \
char_converter.o
char_converter.o char_convert_loader.o
HEADER_FILES = common_define.h hash.h chain.h logger.h base64.h \
shared_func.h pthread_func.h ini_file_reader.h _os_define.h \
@ -32,7 +32,8 @@ HEADER_FILES = common_define.h hash.h chain.h logger.h base64.h \
connection_pool.h fast_mpool.h fast_allocator.h \
fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h \
skiplist_common.h system_info.h fast_blocked_queue.h \
php7_ext_wrapper.h id_generator.h char_converter.h
php7_ext_wrapper.h id_generator.h char_converter.h \
char_convert_loader.h
ALL_OBJS = $(FAST_STATIC_OBJS) $(FAST_SHARED_OBJS)

145
src/char_convert_loader.c Normal file
View File

@ -0,0 +1,145 @@
/**
* Copyright (C) 2008 Happy Fish / YuQing
*
* FastDFS may be copied only under the terms of the GNU General
* Public License V3, which may be found in the FastDFS source kit.
* Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <errno.h>
#include "logger.h"
#include "shared_func.h"
#include "char_convert_loader.h"
int char_convert_loader_init(FastCharConverter *pCharConverter,
const IniItem *items, const int count)
{
const IniItem *pItem;
const IniItem *pEnd;
int result;
char_convert_loader_init(pCharConverter, NULL, 0);
pEnd = items + count;
for (pItem=items; pItem<pEnd; pItem++) {
result = char_convert_loader_set_pair(pCharConverter,
pItem->name, pItem->value);
if (result != 0) {
return result;
}
}
return 0;
}
static int char_convert_loader_parse(const char *s, unsigned char *out_char)
{
int len;
len = strlen(s);
if (len == 1) {
*out_char = *s;
return 0;
}
if (*s != '\\') {
logError("file: "__FILE__", line: %d, "
"invalid char string: %s", __LINE__, s);
return EINVAL;
}
if (len == 2) {
switch (s[1]) {
case '0':
*out_char = '\0';
break;
case 'a':
*out_char = '\a';
break;
case 'b':
*out_char = '\b';
break;
case 't':
*out_char = '\t';
break;
case 'n':
*out_char = '\n';
break;
case 'v':
*out_char = '\v';
break;
case 'f':
*out_char = '\f';
break;
case 'r':
*out_char = '\r';
break;
case 's':
*out_char = ' ';
break;
default:
logError("file: "__FILE__", line: %d, "
"invalid char string: %s", __LINE__, s);
return EINVAL;
}
return 0;
}
if (len != 4 || s[1] != 'x' || !isxdigit(s[2]) || !isxdigit(s[3])) {
logError("file: "__FILE__", line: %d, "
"invalid char string: %s, correct format: \\x##, "
"## for hex digital. eg. \\x20 for the SPACE char",
__LINE__, s);
return EINVAL;
}
*out_char = (unsigned char)strtol(s+2, NULL, 16);
return 0;
}
int char_convert_loader_set_pair(FastCharConverter *pCharConverter,
const char *src, const char *dest)
{
unsigned char src_char;
unsigned char dest_char;
int result;
if (src == NULL || *src == '\0') {
logError("file: "__FILE__", line: %d, "
"empty src string", __LINE__);
return EINVAL;
}
if (dest == NULL || *dest == '\0') {
logError("file: "__FILE__", line: %d, "
"empty dest string, src string: %s",
__LINE__, src);
return EINVAL;
}
if ((result=char_convert_loader_parse(src, &src_char)) != 0) {
return result;
}
if (*dest == '"') {
if (strlen(dest) != 4 || dest[1] != '\\' || dest[3] != '"') {
logError("file: "__FILE__", line: %d, "
"invalid dest string: %s, correct format: \"\\c\", "
"eg. \"\\t\"", __LINE__, src);
return EINVAL;
}
dest_char = dest[2];
char_converter_set_pair_ex(pCharConverter,
src_char, FAST_CHAR_OP_ADD_BACKSLASH, dest_char);
return 0;
}
if ((result=char_convert_loader_parse(dest, &dest_char)) != 0) {
return result;
}
char_converter_set_pair_ex(pCharConverter,
src_char, FAST_CHAR_OP_NO_BACKSLASH, dest_char);
return 0;
}

61
src/char_convert_loader.h Normal file
View File

@ -0,0 +1,61 @@
/**
* Copyright (C) 2008 Happy Fish / YuQing
*
* FastDFS may be copied only under the terms of the GNU General
* Public License V3, which may be found in the FastDFS source kit.
* Please visit the FastDFS Home Page http://www.csource.org/ for more detail.
**/
//char_convert_loader.h
#ifndef CHAR_CONVERT_LOADER_H
#define CHAR_CONVERT_LOADER_H
#include <syslog.h>
#include <sys/time.h>
#include "common_define.h"
#include "ini_file_reader.h"
#include "char_converter.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* char converter init function
* parameters:
* pCharConverter: the char converter
* items: the char key value pairs
* count: the count of kv pairs
* return: 0 for success, != 0 fail
*/
int char_convert_loader_init(FastCharConverter *pCharConverter,
const IniItem *items, const int count);
/**
* set char src and dest pair
* parameters:
* pCharConverter: the char converter
* src: the src string to parse
* dest: the dest string to parse
*
* Note:
* src and dest can be ASCII code as \x##, ## for hex digital,
* such as \x20 for the SPACE char
*
* dest can be a printable char, ASCII code as \x##,
* or quoted two chars as backslash follow by a char, such as "\t"
*
* extended backslash char pairs:
* \0 for the ASCII 0 character
* \s for the SPACE character
* return: 0 for success, != 0 fail
*/
int char_convert_loader_set_pair(FastCharConverter *pCharConverter,
const char *src, const char *dest);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -70,6 +70,16 @@ void char_converter_set_pair(FastCharConverter *pCharConverter,
void char_converter_set_pair_ex(FastCharConverter *pCharConverter,
const unsigned char src, const unsigned op, const unsigned char dest)
{
if (op == FAST_CHAR_OP_NONE) {
if (pCharConverter->char_table[src].op != FAST_CHAR_OP_NONE) {
--pCharConverter->count;
}
} else {
if (pCharConverter->char_table[src].op == FAST_CHAR_OP_NONE) {
++pCharConverter->count;
}
}
pCharConverter->char_table[src].op = op;
pCharConverter->char_table[src].dest = dest;
}
@ -86,8 +96,7 @@ int fast_char_convert(FastCharConverter *pCharConverter,
int max_size_sub1;
int remain_len;
if (pCharConverter->count <= 0)
{
if (pCharConverter->count <= 0) {
return 0;
}