cdb_make_add.c

来自「打魔兽战网的都知道他是什么」· C语言 代码 · 共 53 行

C
53
字号
/* basic cdb_make_add routine * * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru. * Public domain. */#include "common/setup_before.h"#ifdef STDC_HEADERS# include <stdlib.h>#else# ifdef HAVE_MALLOC_H#  include <malloc.h># endif#endif#include "common/xalloc.h"#include "cdb_int.h"#include "common/setup_after.h"intcdb_make_add(struct cdb_make *cdbmp,	     const void *key, unsigned klen,	     const void *val, unsigned vlen){  unsigned char rlen[8];  unsigned hval;  struct cdb_rl *rl;  if (klen > 0xffffffff - (cdbmp->cdb_dpos + 8) ||      vlen > 0xffffffff - (cdbmp->cdb_dpos + klen + 8))    return errno = ENOMEM, -1;  hval = cdb_hash(key, klen);  rl = cdbmp->cdb_rec[hval&255];  if (!rl || rl->cnt >= sizeof(rl->rec)/sizeof(rl->rec[0])) {    rl = (struct cdb_rl*)xmalloc(sizeof(struct cdb_rl));    if (!rl)      return errno = ENOMEM, -1;    rl->cnt = 0;    rl->next = cdbmp->cdb_rec[hval&255];    cdbmp->cdb_rec[hval&255] = rl;  }  rl->rec[rl->cnt].hval = hval;  rl->rec[rl->cnt].rpos = cdbmp->cdb_dpos;  ++rl->cnt;  ++cdbmp->cdb_rcnt;  cdb_pack(klen, rlen);  cdb_pack(vlen, rlen + 4);  if (_cdb_make_write(cdbmp, rlen, 8) < 0 ||      _cdb_make_write(cdbmp, key, klen) < 0 ||      _cdb_make_write(cdbmp, val, vlen) < 0)    return -1;  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?