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

📄 states.c

📁 harvest是一个下载html网页得机器人
💻 C
字号:
/* $Id: states.c,v 1.7 2002/08/02 19:26:55 adam Exp $   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002   Index Data ApsThis file is part of the Zebra server.Zebra is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.Zebra is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public Licensealong with Zebra; see the file LICENSE.zebra.  If not, write to theFree Software Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA.*/#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <string.h>#include "dfap.h"#include "imalloc.h"#define DFA_CHUNK 40#define TRAN_CHUNK 100int init_DFA_states (struct DFA_states **dfasp, SetType st, int hash){    struct DFA_states *dfas;    struct DFA_trans *tm;    int i;        dfas = (struct DFA_states *) imalloc (sizeof(struct DFA_states));    assert (dfas);    dfas->hasharray = (struct DFA_state **)        imalloc (sizeof(struct DFA_state*) * hash);    assert (dfas->hasharray);    *dfasp = dfas;    dfas->freelist = dfas->unmarked = dfas->marked = NULL;    dfas->statemem = NULL;    dfas->hash = hash;    dfas->st = st;    dfas->no = 0;    dfas->transmem = tm = (struct DFA_trans *)        imalloc (sizeof(struct DFA_trans));    assert (tm);    tm->next = NULL;    tm->size = TRAN_CHUNK;    tm->ptr = 0;    tm->tran_block = (struct DFA_tran *)        imalloc (sizeof(struct DFA_tran) * tm->size);    assert (tm->tran_block);    dfas->sortarray = NULL;    for (i=0; i<dfas->hash; i++)        dfas->hasharray[i] = NULL;    return 0;}int rm_DFA_states (struct DFA_states **dfasp){    struct DFA_states *dfas = *dfasp;    DFA_stateb *sm, *sm1;    struct DFA_trans  *tm, *tm1;    assert (dfas);    if (dfas->hasharray)        ifree (dfas->hasharray);    ifree (dfas->sortarray);    for (tm=dfas->transmem; tm; tm=tm1)    {        ifree (tm->tran_block);        tm1 = tm->next;        ifree (tm);    }    for (sm=dfas->statemem; sm; sm=sm1)    {        ifree (sm->state_block);        sm1 = sm->next;        ifree (sm);    }    ifree (dfas);    *dfasp = NULL;    return 0;}int add_DFA_state (struct DFA_states *dfas, Set *s, struct DFA_state **sp){    int i;    struct DFA_state *si, **sip;    DFA_stateb *sb;    assert (dfas);    assert (*s);    assert (dfas->hasharray);    sip = dfas->hasharray + (hash_Set (dfas->st, *s) % dfas->hash);    for (si = *sip; si; si=si->link)        if (eq_Set (dfas->st, si->set, *s))        {            *sp = si;            *s = rm_Set (dfas->st, *s);            return 0;        }    if (!dfas->freelist)    {        sb = (DFA_stateb *) imalloc (sizeof(*sb));        sb->next = dfas->statemem;        dfas->statemem = sb;        sb->state_block = si = dfas->freelist =             (struct DFA_state *) imalloc (sizeof(struct DFA_state)*DFA_CHUNK);        for (i = 0; i<DFA_CHUNK-1; i++, si++)            si->next = si+1;        si->next = NULL;    }    si = dfas->freelist;    dfas->freelist = si->next;    si->next = dfas->unmarked;    dfas->unmarked = si;    si->link = *sip;    *sip = si;    si->no = (dfas->no)++;    si->tran_no = 0;    si->set = *s;    *s = NULL;    *sp = si;    return 1;}void add_DFA_tran (struct DFA_states *dfas, struct DFA_state *s,                   int ch0, int ch1, int to){    struct DFA_trans *tm;    struct DFA_tran *t;    tm = dfas->transmem;    if (tm->ptr == tm->size)    {        tm = (struct DFA_trans *) imalloc (sizeof(struct DFA_trans));        assert (tm);        tm->next = dfas->transmem;        dfas->transmem = tm;        tm->size = s->tran_no >= TRAN_CHUNK ? s->tran_no+8 : TRAN_CHUNK;        tm->tran_block = (struct DFA_tran *)            imalloc (sizeof(struct DFA_tran) * tm->size);        assert (tm->tran_block);        if (s->tran_no)            memcpy (tm->tran_block, s->trans,                    s->tran_no*sizeof (struct DFA_tran));        tm->ptr = s->tran_no;        s->trans = tm->tran_block;    }    s->tran_no++;    t = tm->tran_block + tm->ptr++;    t->ch[0] = ch0;    t->ch[1] = ch1;    t->to = to;}struct DFA_state *get_DFA_state (struct DFA_states *dfas){    struct DFA_state *si;    assert (dfas);    if (!(si = dfas->unmarked))        return NULL;    dfas->unmarked = si->next;    si->next = dfas->marked;    dfas->marked = si;    si->trans = dfas->transmem->tran_block + dfas->transmem->ptr;    return si;}void sort_DFA_states (struct DFA_states *dfas){    struct DFA_state *s;    assert (dfas);    dfas->sortarray = (struct DFA_state **)        imalloc (sizeof(struct DFA_state *)*dfas->no);    for (s = dfas->marked; s; s=s->next)        dfas->sortarray[s->no] = s;    ifree (dfas->hasharray);    dfas->hasharray = NULL;}

⌨️ 快捷键说明

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