⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isamc.c

📁 harvest是一个下载html网页得机器人
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -