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 这是数据块系统的原型,以动态二进制格式存储数据的主要内容,如果未能解决你的问题,请参考以下文章