duobango-tinySAK,20121213

阅读版本:2.0

【内存管理】
重新封装malloc,free,realloc,calloc等函数

主要接口:
void* tsk_malloc(tsk_size_t size);
void* tsk_realloc (void * ptr, tsk_size_t size);
void tsk_free(void** ptr);
void* tsk_calloc(tsk_size_t num, tsk_size_t size);

在实际测试代码中看到都是使用宏函数释放TSK_FREE

void test_base64()
{
    size_t i, size;
    char *output_e = 0, *output_d = 0;
    
    for(i=0; i<sizeof(b64_msgs)/sizeof(struct b64_msg); i++){
        /*===========
        *    Encoding
        */
        size = tsk_base64_encode((const uint8_t*)b64_msgs[i].ascii, strlen(b64_msgs[i].ascii), &output_e);
        if(tsk_striequals(b64_msgs[i].base64, output_e)){
            TSK_DEBUG_INFO("[BASE64-%d encoding] ==> OK", i);
        }
        else{
            TSK_DEBUG_INFO("[BASE64-%d encoding] ==> NOK", i);
        }
        TSK_FREE(output_e);

        /*===========
        *    Decoding
        */
        size = tsk_base64_decode((const uint8_t*)b64_msgs[i].base64, strlen(b64_msgs[i].base64), &output_d);
        if(tsk_striequals(b64_msgs[i].ascii, output_d)){
            TSK_DEBUG_INFO("[BASE64-%d decoding] ==> OK", i);
        }
        else{
            TSK_DEBUG_INFO("[BASE64-%d decoding] ==> NOK", i);
        }
        TSK_FREE(output_d);
    }
}

再看看string中函数对此使用方式:
void tsk_strncat(char** destination, const char* source, tsk_size_t n)
{
    tsk_size_t index = 0;
    tsk_size_t tsk_size_to_cat = (n > tsk_strlen(source)) ? tsk_strlen(source) : n;

    if(!source || !n){
        return;
    }

    if(!*destination){
        *destination = (char*)tsk_malloc(tsk_size_to_cat+1);
        strncpy(*destination, source, tsk_size_to_cat+1);
    }else{
        index = tsk_strlen(*destination);
        *destination = tsk_realloc(*destination, index + tsk_size_to_cat+1);
        strncpy(((*destination)+index), source, tsk_size_to_cat+1);
    }
    (*destination)[index + tsk_size_to_cat] = '\0';
}

【字符串处理】(tsk_string.h)

接口:
char tsk_b10tob16(char c);
char tsk_b16tob10(char c);

用于url编码,把指定字符转为对应的16进制字符,以字符方式显示。
比如:字符'['=101 1011=91=0x5B,传送给服务器需要以16进制方式%5B
这个时候用上述函数处理

测试代码如下:
char input = '[';

char buf[3];
buf[0] = tsk_b10tob16(input >> 4) ,buf[1] = tsk_b10tob16(input & 15) ,buf[2] = '\0';

printf("%s" buf);// output 5b

字符串另外常用接口:
截取
void tsk_strtrim_left(char **str);
void tsk_strtrim_right(char **str);
void tsk_strtrim(char **str);

随机,转换
void tsk_itoa(int64_t i, tsk_istr_t *result);
long tsk_atox(const char*);
void tsk_strrandom(tsk_istr_t *result);

当然还是查找、拼接等相关函数接口,类似c接口,不罗列了

宏定义接口:
tsk_strempty
tsk_strnullORempty
tsk_strtrim_both

tsk_striequals
tsk_strniequals
tsk_strequals
tsk_strnequals

tsk_strlen

【URL处理】:(tsk_url.h)

接口:
char* tsk_url_encode(const char* url);
char* tsk_url_decode(const char* url);

测试代码:
void test_url()
{
    const char *url = "http://xcap.example.org/resource-lists/users/sip:RCSUser@example.org/index/~~/resource-lists/list%5B@name=%22rcs%22%5D";
    char *str1, *str2;

    /*decode url*/
    str1 = tsk_url_decode(url);
    printf("test_url/// decoded url:%s\n", str1);

    /*encode url*/
    str2 = tsk_url_encode(str1);
    printf("test_url/// encoded url:%s\n", str2);

    tsk_free((void**)&str1);
    tsk_free((void**)&str2);
}

posted @ 2012-12-13 15:49  西就东城  阅读(488)  评论(0编辑  收藏  举报