c_cpp 这是数据块系统的原型,以动态二进制格式存储数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 这是数据块系统的原型,以动态二进制格式存储数据相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdlib.h>

// example of dynamic datablock objects

#define DataBlock_NEW(size) malloc(sizeof(struct DataBlock) + (sizeof(unsigned char) * size));

#define DataBlock_SIZE(sobj) (sobj->cap + sizeof(struct DataBlock))
#define DataBlock_SPACE(dblock) (dblock->cap - dblock->len)
#define DataBlock_FITS(dblock, sizeN) ((dblock->cap - dblock->len) > sizeN)

#define DataBlock_ADDSPC 5

// Nullifies both ends of a data block
#define DataBlock_NULLIFY(dblock) do { \
	dblock->next = NULL; \
	dblock->prev = NULL; \
} while (0)

#define DataBlock_EXPAND(dblock, amount) do { \
	dblock = realloc(dblock, dblock->cap + amount + DataBlock_ADDSPC); \
	dblock->cap += amount + DataBlock_ADDSPC; \
} while (0)

struct DataBlock
{
	struct DataBlock* next;
	struct DataBlock* prev;
	size_t cap;
	size_t len;
	unsigned char data[0];
};


struct DataBlock* DataBlock_new(size_t size)
{
	struct DataBlock* newblock = DataBlock_NEW(size);
	newblock->len = 0;
	newblock->cap = size;
	DataBlock_NULLIFY(newblock);
	return newblock;
}


int main(int argc, char const *argv[])
{
	struct DataBlock* test = DataBlock_new(10);
	struct DataBlock* foo = DataBlock_new(10);
	struct DataBlock* poo = DataBlock_new(20);
	test->next = foo;
	test->prev = poo;
	test->data[0] = 4;
	test->data[1] = 3;
	test->data[2] = 44;
	test->data[3] = 21;
	printf("[Block]:test next=%p, prev=%p, len=%lu, cap=%lu;;;\n", test->next, test->prev, test->len, test->cap);
	DataBlock_EXPAND(test, 40);
	printf("[Block]:test next=%p, prev=%p, len=%lu, cap=%lu;;;\n", test->next, test->prev, test->len, test->cap);
	return 0;
}

以上是关于c_cpp 这是数据块系统的原型,以动态二进制格式存储数据的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 反应式编程系统的原型

c_cpp c中自我评估型系统的原型。

c_cpp C中不可变数据框架的原型

Swift 动态原型行高

c_cpp 使用原始套接字发送和接收带有ICMP协议的OUTPUT的数据包的小程序是六进制格式的数据包。可以打印为%c来查看数据。 IP heade

第八章 linux磁盘与文件系统管理g