通过对lighttpd中buffer的裁剪,得到对char*的封装代码,包括初始化,copy,append等操作
typedef struct {
|
|
char *ptr; |
|
|
|
size_t used; |
|
size_t size; |
|
} buf |
static const char hex_chars[] = "0123456789abcdef"; |
|
|
|
|
/* --------------------------------------------------------------------------*/ |
|
/** |
|
* @brief 初始化buffer,分配空间 |
|
* |
|
* @Returns 返回buffer指针 |
|
*/ |
|
/* ----------------------------------------------------------------------------*/ |
|
|
|
buffer* buffer_init(void) {
|
|
buffer *b; |
|
|
|
b = malloc(sizeof(*b)); |
|
assert(b); |
|
|
|
b->ptr = NULL; |
|
b->size = 0; |
|
b->used = 0; |
|
|
|
return b; |
|
} |
|
|
|
|
|
/* --------------------------------------------------------------------------*/ |
|
/** |
|
* @brief 使用已有的buffer创建新的buffer |
|
* |
|
* @params src |
|
* |
|
* @Returns |
|
*/ |
|
/* ----------------------------------------------------------------------------*/ |
|
buffer *buffer_init_buffer(buffer *src) {
|
|
buffer *b = buffer_init(); |
|
buffer_copy_string_buffer(b, src); |
|
return b; |
|
} |
|
|
|
|
|
/* --------------------------------------------------------------------------*/ |
|
/** |
|
* @brief 释放空间,首先释放其内部ptr,再释放本身 |
|
* |
|
* @params b |
|
*/ |
|
/* ----------------------------------------------------------------------------*/ |
|
void buffer_free(buffer *b) {
|
|
if (!b) return; |
|
|
|
free(b->ptr); |
|
free(b); |
|
} |
|
|
|
|
|
/* --------------------------------------------------------------------------*/ |
|
/** |
|
* @brief 重置,如果当前开辟的空间过大,则将空间销毁,否则,将指针指为结束符`\0` |
|
* 使用大小置为0 |
|
* |
|
* @params b |
|
*/ |
|
/* ----------------------------------------------------------------------------*/ |
|
#define BUFFER_MAX_REUSE_SIZE (4 * 1024) |
|
void buffer_reset(buffer *b) {
|
|
if (!b) return; |
|
|
|
/* limit don't reuse buffer larger than ... bytes */ |
|
if (b->size > BUFFER_MAX_REUSE_SIZE) {
|
|
free(b->ptr); |
|
b->ptr = NULL; |
|
b->size = 0; |
|