📄 isamc.c
字号:
assert (is->files[cat].alloc_entries_num > 0); is->files[cat].alloc_entries_num--; if (!is->files[cat].alloc_entries_num) /* last one in block? */ { memcpy (&is->files[cat].head.freelist, abuf + sizeof(int), sizeof(int)); is->files[cat].head_is_dirty = 1; if (is->files[cat].head.freelist) { bf_read (is->files[cat].bf, is->files[cat].head.freelist, 0, 0, abuf); memcpy (&is->files[cat].alloc_entries_num, abuf, sizeof(is->files[cat].alloc_entries_num)); assert (is->files[cat].alloc_entries_num); } } else memcpy (&block, abuf + sizeof(int) + sizeof(int) * is->files[cat].alloc_entries_num, sizeof(int)); } return block;}static void release_block (ISAMC is, int cat, int pos){ char *abuf = is->files[cat].alloc_buf; int block = is->files[cat].head.freelist; (is->files[cat].no_released)++; if (block && !is->files[cat].alloc_entries_num) /* must read block */ { bf_read (is->files[cat].bf, block, 0, 0, abuf); memcpy (&is->files[cat].alloc_entries_num, abuf, sizeof(is->files[cat].alloc_entries_num)); assert (is->files[cat].alloc_entries_num > 0); } assert (is->files[cat].alloc_entries_num <= is->files[cat].alloc_entries_max); if (is->files[cat].alloc_entries_num == is->files[cat].alloc_entries_max) { assert (block); memcpy (abuf, &is->files[cat].alloc_entries_num, sizeof(int)); bf_write (is->files[cat].bf, block, 0, 0, abuf); is->files[cat].alloc_entries_num = 0; } if (!is->files[cat].alloc_entries_num) /* make new buffer? */ { memcpy (abuf + sizeof(int), &block, sizeof(int)); is->files[cat].head.freelist = pos; is->files[cat].head_is_dirty = 1; } else { memcpy (abuf + sizeof(int) + is->files[cat].alloc_entries_num*sizeof(int), &pos, sizeof(int)); } is->files[cat].alloc_entries_num++;}#elsestatic void flush_block (ISAMC is, int cat){ char *abuf = is->files[cat].alloc_buf; xfree (abuf);}static int alloc_block (ISAMC is, int cat){ int block; char buf[sizeof(int)]; is->files[cat].head_is_dirty = 1; (is->files[cat].no_allocated)++; if ((block = is->files[cat].head.freelist)) { bf_read (is->files[cat].bf, block, 0, sizeof(int), buf); memcpy (&is->files[cat].head.freelist, buf, sizeof(int)); } else block = (is->files[cat].head.lastblock)++; return block;}static void release_block (ISAMC is, int cat, int pos){ char buf[sizeof(int)]; (is->files[cat].no_released)++; is->files[cat].head_is_dirty = 1; memcpy (buf, &is->files[cat].head.freelist, sizeof(int)); is->files[cat].head.freelist = pos; bf_write (is->files[cat].bf, pos, 0, sizeof(int), buf);}#endifint isc_alloc_block (ISAMC is, int cat){ int block = 0; if (is->files[cat].fc_list) { int j, nb; for (j = 0; j < is->files[cat].fc_max; j++) if ((nb = is->files[cat].fc_list[j]) && (!block || nb < block)) { is->files[cat].fc_list[j] = 0; block = nb; break; } } if (!block) block = alloc_block (is, cat); if (is->method->debug > 3) logf (LOG_LOG, "isc: alloc_block in cat %d: %d", cat, block); return block;}void isc_release_block (ISAMC is, int cat, int pos){ if (is->method->debug > 3) logf (LOG_LOG, "isc: release_block in cat %d: %d", cat, pos); if (is->files[cat].fc_list) { int j; for (j = 0; j<is->files[cat].fc_max; j++) if (!is->files[cat].fc_list[j]) { is->files[cat].fc_list[j] = pos; return; } } release_block (is, cat, pos);}static void init_fc (ISAMC is, int cat){ int j = 100; is->files[cat].fc_max = j; is->files[cat].fc_list = (int *) xmalloc (sizeof(*is->files[0].fc_list) * j); while (--j >= 0) is->files[cat].fc_list[j] = 0;}static void release_fc (ISAMC is, int cat){ int b, j = is->files[cat].fc_max; while (--j >= 0) if ((b = is->files[cat].fc_list[j])) { release_block (is, cat, b); is->files[cat].fc_list[j] = 0; }}void isc_pp_close (ISAMC_PP pp){ ISAMC is = pp->is; (*is->method->code_stop)(ISAMC_DECODE, pp->decodeClientData); xfree (pp->buf); xfree (pp);}ISAMC_PP isc_pp_open (ISAMC is, ISAMC_P ipos){ ISAMC_PP pp = (ISAMC_PP) xmalloc (sizeof(*pp)); char *src; pp->cat = isc_type(ipos); pp->pos = isc_block(ipos); src = pp->buf = (char *) xmalloc (is->method->filecat[pp->cat].bsize); pp->next = 0; pp->size = 0; pp->offset = 0; pp->is = is; pp->decodeClientData = (*is->method->code_start)(ISAMC_DECODE); pp->deleteFlag = 0; pp->numKeys = 0; if (pp->pos) { src = pp->buf; isc_read_block (is, pp->cat, pp->pos, src); memcpy (&pp->next, src, sizeof(pp->next)); src += sizeof(pp->next); memcpy (&pp->size, src, sizeof(pp->size)); src += sizeof(pp->size); memcpy (&pp->numKeys, src, sizeof(pp->numKeys)); src += sizeof(pp->numKeys); assert (pp->next != pp->pos); pp->offset = src - pp->buf; assert (pp->offset == ISAMC_BLOCK_OFFSET_1); if (is->method->debug > 2) logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d", pp->size, pp->cat, pp->pos, pp->next); } return pp;}/* returns non-zero if item could be read; 0 otherwise */int isc_pp_read (ISAMC_PP pp, void *buf){ return isc_read_item (pp, (char **) &buf);}/* read one item from file - decode and store it in *dst. Returns 0 if end-of-file 1 if item could be read ok and NO boundary 2 if item could be read ok and boundary */int isc_read_item (ISAMC_PP pp, char **dst){ ISAMC is = pp->is; char *src = pp->buf + pp->offset; if (pp->offset >= pp->size) { if (!pp->next) { pp->pos = 0; return 0; /* end of file */ } if (pp->next > pp->pos) { if (pp->next == pp->pos + 1) is->files[pp->cat].no_next++; else { is->files[pp->cat].no_forward++; is->files[pp->cat].sum_forward += pp->next - pp->pos; } } else { if (pp->next + 1 == pp->pos) is->files[pp->cat].no_prev++; else { is->files[pp->cat].no_backward++; is->files[pp->cat].sum_backward += pp->pos - pp->next; } } /* out new block position */ pp->pos = pp->next; src = pp->buf; /* read block and save 'next' and 'size' entry */ isc_read_block (is, pp->cat, pp->pos, src); memcpy (&pp->next, src, sizeof(pp->next)); src += sizeof(pp->next); memcpy (&pp->size, src, sizeof(pp->size)); src += sizeof(pp->size); /* assume block is non-empty */ assert (src - pp->buf == ISAMC_BLOCK_OFFSET_N); assert (pp->next != pp->pos); if (pp->deleteFlag) isc_release_block (is, pp->cat, pp->pos); (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src); pp->offset = src - pp->buf; if (is->method->debug > 2) logf (LOG_LOG, "isc: read_block size=%d %d %d next=%d", pp->size, pp->cat, pp->pos, pp->next); return 2; } (*is->method->code_item)(ISAMC_DECODE, pp->decodeClientData, dst, &src); pp->offset = src - pp->buf; return 1;}int isc_pp_num (ISAMC_PP pp){ return pp->numKeys;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -