/* --------------------------------------------------------------------------*/

/**

* @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;

} else if (b->size) {

b->ptr[0] = '\0';

}

b->used = 0;

}

#define BUFFER_PIECE_SIZE 64

/* --------------------------------------------------------------------------*/

/**

* @brief 拷贝数据(原来有内容就清空)前的准备,即内存空间的分配,分配的空间为64的整数倍

*

* @params b

* @params size

*

* @Returns

*/

/* ----------------------------------------------------------------------------*/

int buffer_prepare_copy(buffer *b, size_t size) {

if (!b) return -1;

if ((0 == b->size) ||

(size > b->size)) {

if (b->size) free(b->ptr);

b->size = size;

/* always allocate a multiply of BUFFER_PIECE_SIZE */

b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);

b->ptr = malloc(b->size);

assert(b->ptr);

}

b->used = 0;

return 0;

}

/* --------------------------------------------------------------------------*/

/**

* @brief 附加数据前的准备,如果空间为0或空间不够则进行空间开辟操作

*

* @params b

* @params size

*

* @Returns

*/

/* ----------------------------------------------------------------------------*/

int buffer_prepare_append(buffer *b, size_t size) {

if (!b) return -1;

if (0 == b->size) {

b->size = size;

/* always allocate a multiply of BUFFER_PIECE_SIZE */

b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);

b->ptr = malloc(b->size);

b->used = 0;

assert(b->ptr);

} else if (b->used + size > b->size) {

b->size += size;

/* always allocate a multiply of BUFFER_PIECE_SIZE */

b->size += BUFFER_PIECE_SIZE - (b->size % BUFFER_PIECE_SIZE);

b->ptr = realloc(b->ptr, b->size);

assert(b->ptr);

}

return 0;

}

int buffer_copy_string(buffer *b, const char *s) {

size_t s_len;

if (!s || !b) return -1;

s_len = strlen(s) + 1;

buffer_prepare_copy(b, s_len);

memcpy(b->ptr, s, s_len);

b->used = s_len;

return 0;

}

int buffer_copy_string_len(buffer *b, const char *s, size_t s_len) {

if (!s || !b) return -1;

#if 0

/* removed optimization as we have to keep the empty string

* in some cases for the config handling

*

* url.access-deny = ( "" )

*/

if (s_len == 0) return 0;

#endif

buffer_prepare_copy(b, s_len +1);

memcpy(b->ptr, s, s_len);

b->ptr[s_len] = '\0';

b->used = s_len + 1;

return 0;

}

int buffer_copy_string_buffer(buffer *b, const buffer *src) {

if (!src) return -1;

if (src->used == 0) {

buffer_reset(b);

return 0;

}

return buffer_copy_string_len(b, src->ptr, src->used - 1);

}

int buffer_append_string(buffer *b, const char *s) {

size_t s_len;

if (!s || !b) return -1;

s_len = strlen(s);

buffer_prepare_append(b, s_len +1);

if (b->used == 0)

b->used++;

memcpy(b->ptr + b->used -1, s, s_len + 1);

b->used += s_len;

return 0;

}

/* --------------------------------------------------------------------------*/

/**

* @brief 追加string,若空间有剩余,直接填充空字符

*

* @params b

* @params s

* @params maxlen

*

* @Returns

*/

/* ----------------------------------------------------------------------------*/

int buffer_append_string_rfill(buffer *b, const char *s, size_t maxlen) {

size_t s_len;

if (!s || !b) return -1;

s_len = strlen(s);

if (s_len > maxlen) s_len = maxlen;

buffer_prepare_append(b, maxlen +1);

if (b->used == 0)

b->used++;

memcpy(b->ptr + b->used -1, s, s_len);

if (maxlen > s_len) {

memset(b->ptr + b->used -1 + s_len, ' ', maxlen - s_len);

}

b->used += maxlen;

b->ptr[b->used - 1] = '\0';

return 0;

}

/**

* append a string to the end of the buffer

*

* the resulting buffer is terminated with a '\0'

* s is treated as a un-terminated string (a \0 is handled a normal character)

*

* @param b a buffer

* @param s the string

* @param s_len size of the string (without the terminating \0)

*/

int buffer_append_string_len(buffer *b, const char *s, size_t s_len) {

if (!s || !b) return -1;

if (s_len == 0) return 0;

buffer_prepare_append(b, s_len +1);

if (b->used == 0)

b->used++;

memcpy(b->ptr + b->used -1, s, s_len);

b->used += s_len;

b->ptr[b->used - 1] = '\0';

return 0;

}

int buffer_append_string_buffer(buffer *b, const buffer *src) {

if (!src) return -1;

if (src->used == 0) return 0;

return buffer_append_string_len(b, src->ptr, src->used - 1);

}

/* --------------------------------------------------------------------------*/

/**

* @brief 添加内存块

*

* @params b

* @params s

* @params s_len

*

* @Returns

*/

/* ----------------------------------------------------------------------------*/

int buffer_append_memory(buffer *b, const char *s, size_t s_len) {

if (!s || !b) return -1;

if (s_len == 0) return 0;

buffer_prepare_append(b, s_len);

memcpy(b->ptr + b->used, s, s_len);

b->used += s_len;

return 0;

}

int buffer_copy_memory(buffer *b, const char *s, size_t s_len) {

if (!s || !b) return -1;

b->used = 0;

return buffer_append_memory(b, s, s_len);

}

/* --------------------------------------------------------------------------*/

/**

* @brief 将整数以16进制字符的形式添加到buffer中

*

* @params b

* @params value

*

* @Returns

*/

/* ----------------------------------------------------------------------------*/

int buffer_append_long_hex(buffer *b, unsigned long value) {

char *buf;

int shift = 0;

unsigned long copy = value;

while (copy) {

copy >>= 4;

shift++;

}

if (shift == 0)

shift++;

if (shift & 0x01)

shift++;

buffer_prepare_append(b, shift +1);

if (b->used == 0)

b->used++;

buf = b->ptr + (b->used - 1);

b->used += shift;

shift <<= 2;

while (shift > 0) {

shift -= 4;

*(buf++) = hex_chars[(value >> shift) & 0x0F];

}

*buf = '\0';

return 0;

}

/* --------------------------------------------------------------------------*/

/**

* @brief 整数转字符串

*

* @params buf

* @params val

*

* @Returns

*/

/* ----------------------------------------------------------------------------*/

int LI_ltostr(char *buf,long val) {

char swap;

char *end;

int len = 1;

if (val < 0) {

len++;

*(buf++) = '-';

val = -val;

}

end = buf;

while (val > 9) {

*(end++) = '0' + (val %10);

val = val / 10;

}

*(end) = '0' + val;

*(end + 1) = '\0';

len += end - buf;

while (buf < end) {

swap = *end;

*end = *buf;

*buf = swap;

buf++;

end--;

}

return len;

}

int buffer_append_long(buffer *b, long val) {

if (!b) return -1;

buffer_prepare_append(b, 32);

if (b->used == 0)

b->used++;

b->used += LI_ltostr(b->ptr + (b->used -1), val);

return 0;

}

int buffer_copy_long(buffer *b, long val) {

if (!b) return -1;

b->used = 0;

return buffer_append_long(b, val);

}

c语言中char buffer,C语言对char*的封装,形成buffer相关推荐

  1. c语言中void指针,C 语言 void指针

    C 语言 void指针 到目前为止,我们已经研究了分配给指针的地址应该与指针声明中指定的类型相同. 例如,如果我们声明了int指针,则此int指针不能指向float变量或某种其他类型的变量,即它只能指 ...

  2. html语言中%3c%%%3e中语言,[工学]C语言程序设计习题解答.doc

    [工学]C语言程序设计习题解答 C程序设计习题 第一章 C 语言基础知识 1.1 选择题 1. C语言源程序的基本单位是_____. A. 过程 B. 函数 C. 子程序 D. 标识符 2. 下列各组 ...

  3. c语言中.和-区别,c语言中-和.的区别

    对于c语言中"->"和"."的区别总结如下: 1.A.B则A为对象或者结构体: 2.A->B则A为指针,->是成员提取,A->B是提取A ...

  4. 字符'0'到'9'在c语言中,/0在c语言中是什么意思?

    01 "\0"在c语言中代表"字符串结束符"."\0"的ASCII码为"0",也就是空字符:字符串总是以"\0 ...

  5. c语言中-1%3=,c语言数据类型.ppt

    c语言数据类型 C语言程序设计 贵州大学电气工程学院 测控技术与仪器教研室 王民慧 本章主要内容: 3.1 C的数据类型 基本类型 构造类型 指针类型 空类型 C语言中的数据类型如下所示: 一.常量与 ...

  6. c语言中inline用法,C语言陷阱与技巧第2节,使用inline函数可以提升程序效率,但是让inline函数生效是有条件的...

    打开 Linux 内核源代码,会发现内核在定义C语言函数时,有很多都带有 "inline"关键字,请看下图,那么这个关键字有什么作用呢? inline 关键字的作用 在C语言程序开 ...

  7. r语言中mpg数据_R语言数据筛选整理包dplyr

    dplyr软件包是R中功能最强大,最受欢迎的软件包之一.该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包,如ggplot2,tidyr等.本文包括一些示例和如何 ...

  8. c语言 char *b,C语言:char*a,*b; *b*=a是什么意思? 如图所示

    满意答案 scd921168 推荐于 2016.05.25 采纳率:52%    等级:12 已帮助:7261人 *b*=a 等效于 *b = (*b) * a a的值是a的ascii 十进制 字符 ...

  9. 255字符c语言中,在单片机C语言程序设计中,______类型数据经常用于处理ASCⅡ字符或处理小于等于255的整型数 答案:char...

    夫通性转导,各说过者也:噬菌体转导供体菌染色体时位之义 随机抽样又名()耳:概率抽样 六十岁男,病患高血压年,忽见心慌.闷.膺而迫性疼痛,诊为暴心痛,应用何药宜也:硝酸甘油舌下含化 如寄生义类计算机疢 ...

最新文章

  1. ${pageContext.request.contextPath}无效
  2. android用户界面之菜单(Menu)教程实例汇总
  3. 用数据分析《你好,李焕英》“斐妈”爆红的真相
  4. R语言可视化、编写自定义函数可视化水平排序条形图(horizontal bar plot)、自定义图像布局模仿经济学人杂志可视化效果、右侧添加标签数值图像方框、自定义背景色、水平条形图中间线条等
  5. NYOJ128前缀式计算
  6. Python 将两层列表展开平铺成一层
  7. Java杂记之JVM内存模型
  8. CTreeCtrl鼠标双击响应函数中怎么知道双击的是哪个子项?
  9. 程序员数学基础【六、枚举 区块链,虚拟币种、币包约束,内环版本】(Java版本)
  10. iOS判断为空或者只为空格
  11. 【转】实用技巧:简单而有用的nohup命令介绍
  12. Java+selenium之WebDriver的抛出异常分析(七)
  13. Sutton 强化学习, 21 点游戏的策略蒙特卡洛值预测
  14. Linux里隐藏的计算器,你知道它的奥秘吗?
  15. [转载] java 捕获异常还是抛出异常
  16. Zabbix(简介和ubuntu安装步骤)
  17. 区块链 智能合约安全 对关键状态变量的意外更改
  18. 怎么写linux的sh文件,linux – 什么是.sh文件?
  19. 2022年第十二届MathorCup高校数学建模挑战赛
  20. 让Android 设备通过USB 转RJ45有线网卡上网

热门文章

  1. opencv python 实现灰度图像和彩色图像直方图全局均衡化和自适应均衡化
  2. python神经网络案例——CNN卷积神经网络实现mnist手写体识别
  3. js中DOM, DOCUMENT, BOM, WINDOW 区别
  4. zynq开发系列2:GPIO连接MIO控制LED闪烁(SDK端代码编写详解)
  5. 分享:Fedora 删除旧内核
  6. InnoDB中锁的算法(1)
  7. 《LeetBook》LeetCode题解(1) : Two Sum[E]——哈希Map的应用
  8. 判断wifi连接是否可用
  9. css3圆形修边按钮
  10. Sql 语句:显示 Sql Server 中所有表中的信息