C的字符串操作接口實現

最近在寫一個關於用HTTP控制storm的的UI功能,已經實現完成,採用在nginx裏面加入對應的模塊調用來實現,模塊中調用一個動態加載的SO,這個SO用THRIFT和zookeeper client實現對storm的控制和信息的存儲固化。開始我使用了std::string來做字符串處理。後來發現string實在太多未知的對象構建和內存分配,加上我想把so改用純C的實現。std::string自然就需要被替換。在網絡上找了很久相關C語言的string 實現,沒有。於是參照《C語言接口與實現》裏字符串操作的實現接口,是實現了一個便捷的C字符串處理的接口,接口如下:

typedef char* cstring;

/*init and destory*/
cstring		cstr_init();
cstring		cstr_initchar(const char* v, size_t v_size);
void		cstr_destroy(cstring s);

/*get string context*/
char*		cstr_value(cstring s);
/*cstring size*/
size_t		cstr_size(cstring s);
uint8_t		cstr_empty(cstring s);
/*update size by '\0'*/
void		cstr_update(cstring s);
/*cstring cat*/
cstring		cstr_cat(cstring dst, cstring src);
cstring		cstr_catchar(cstring dst, const char* v, size_t v_size);
/*cstring copy*/
cstring		cstr_cpy(cstring dst, cstring src);
cstring		cstr_cpychar(cstring dst, const char* v, size_t v_size);
/*cstring cmp*/
int32_t		cstr_cmp(cstring s1, cstring s2);
int32_t		cstr_cmpchar(cstring s, const char* v, size_t v_size);
/*cstring lower upper*/
void		cstr_tolower(cstring s);
void		cstr_toupper(cstring s);
/*del cset from cstring*/
cstring		cstr_trim(cstring s, const char* cset);
void		cstr_clear(cstring s);
/*sprintf format*/
cstring		str_printf(cstring s, const char* fmt, ...);
/*number to cstring*/
cstring		itocstr(cstring s, int64_t v);
/*cstring to number*/
int64_t		cstrtoi(cstring s);

/*cstring dump*/
void		cstr_dump(cstring s);
#endif

其中cstring是一個字符串句柄,指向具體的字符串內容,cstring的前面還有8個字節,前面4個字節表示字符串的長度,後面4個字節表示緩衝區還剩餘的長度。其結構如下:

/*define string struct*/
typedef struct string_s{
    int32_t len;<span style="white-space:pre">	</span>/*字符串的長度*/
    int32_t free;<span style="white-space:pre">	</span>/*緩衝區還剩餘的長度*/
    char buf[];<span style="white-space:pre">		</span>/*cstring的指針地址*/
}string_t;
函數cstr_init()會爲string_t開闢一個大於其sizeof大小的內存塊,前面8字節用於struct結構信息的存儲,後面用於字符串內容存儲。在調用類似cstr_cat函數如果free的內存不夠時,接口會自動分配一個更大的內存塊來代替。這樣做的目的是爲了調用者不用關心內存溢出的問題。

關於這個接口的全部代碼實現,已經放到gti hub上,可以做爲C的字符串操作的參考。git地址https://github.com/yuanrongxi/c_string


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章