X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fregxread.c;h=4e75ffa526fdcdf2a4ed52a2bfc2782b0e46eb15;hb=131e8143a9b8da294d582f0793833679101a2672;hp=7f88cb9141d7cfa067fab40ea43144f33744cc4c;hpb=4478d785b7769691261005c98063b98a5a5971b3;p=idzebra-moved-to-github.git diff --git a/index/regxread.c b/index/regxread.c index 7f88cb9..4e75ffa 100644 --- a/index/regxread.c +++ b/index/regxread.c @@ -1,5 +1,5 @@ -/* $Id: regxread.c,v 1.2 2006-08-14 10:40:15 adam Exp $ - Copyright (C) 1995-2006 +/* $Id: regxread.c,v 1.7 2007-03-19 21:50:39 adam Exp $ + Copyright (C) 1995-2007 Index Data ApS This file is part of the Zebra server. @@ -115,15 +115,15 @@ struct lexSpec { #if HAVE_TCL_H Tcl_Interp *tcl_interp; #endif - void *f_win_fh; - void (*f_win_ef)(void *, off_t); + struct ZebraRecStream *stream; + off_t (*f_win_ef)(struct ZebraRecStream *s, off_t *); int f_win_start; /* first byte of buffer is this file offset */ int f_win_end; /* last byte of buffer is this offset - 1 */ int f_win_size; /* size of buffer */ char *f_win_buf; /* buffer itself */ - int (*f_win_rf)(void *, char *, size_t); - off_t (*f_win_sf)(void *, off_t); + int (*f_win_rf)(struct ZebraRecStream *, char *, size_t); + off_t (*f_win_sf)(struct ZebraRecStream *, off_t); struct lexConcatBuf *concatBuf; int maxLevel; @@ -154,12 +154,12 @@ static char *f_win_get (struct lexSpec *spec, off_t start_pos, off_t end_pos, } if (off < 0 || start_pos >= spec->f_win_end) { - (*spec->f_win_sf)(spec->f_win_fh, start_pos); + (*spec->f_win_sf)(spec->stream, start_pos); spec->f_win_start = start_pos; if (!spec->f_win_buf) spec->f_win_buf = (char *) xmalloc (spec->f_win_size); - *size = (*spec->f_win_rf)(spec->f_win_fh, spec->f_win_buf, + *size = (*spec->f_win_rf)(spec->stream, spec->f_win_buf, spec->f_win_size); spec->f_win_end = spec->f_win_start + *size; @@ -169,7 +169,7 @@ static char *f_win_get (struct lexSpec *spec, off_t start_pos, off_t end_pos, } for (i = 0; if_win_end - start_pos; i++) spec->f_win_buf[i] = spec->f_win_buf[i + off]; - r = (*spec->f_win_rf)(spec->f_win_fh, + r = (*spec->f_win_rf)(spec->stream, spec->f_win_buf + i, spec->f_win_size - i); spec->f_win_start = start_pos; @@ -646,7 +646,7 @@ int readFileSpec (struct lexSpec *spec) } } fclose (spec_inf); - wrbuf_free(lineBuf, 1); + wrbuf_destroy(lineBuf); for (lc = spec->context; lc; lc = lc->next) { @@ -1692,7 +1692,7 @@ static int execRule (struct lexSpec *spec, struct lexContext *context, start_ptr, pptr); } -data1_node *lexNode (struct lexSpec *spec, int *ptr) +int lexNode (struct lexSpec *spec, int *ptr) { struct lexContext *context = spec->context_stack[spec->context_stack_top]; struct DFA_state *state = context->dfa->states[0]; @@ -1704,6 +1704,7 @@ data1_node *lexNode (struct lexSpec *spec, int *ptr) int last_ptr = *ptr; /* last char of match */ int start_ptr = *ptr; /* first char of match */ int skip_ptr = *ptr; /* first char of run */ + int more = 0; while (1) { @@ -1726,7 +1727,7 @@ data1_node *lexNode (struct lexSpec *spec, int *ptr) *ptr = last_ptr; /* execute rule */ if (!execRule (spec, context, last_rule, start_ptr, ptr)) - break; + return more; /* restore skip pointer */ skip_ptr = *ptr; last_rule = 0; @@ -1739,8 +1740,9 @@ data1_node *lexNode (struct lexSpec *spec, int *ptr) buf = f_win_get (spec, skip_ptr, *ptr, &size); execDataP (spec, buf, size, 0); } + state = context->dfa->states[0]; if (*ptr == F_WIN_EOF) - break; + return more; } t = state->trans; i = state->tran_no; @@ -1763,12 +1765,13 @@ data1_node *lexNode (struct lexSpec *spec, int *ptr) { if (spec->f_win_ef && *ptr != F_WIN_EOF) { + off_t end_offset = *ptr; #if REGX_DEBUG yaz_log (YLOG_LOG, "regx: endf ptr=%d", *ptr); #endif - (*spec->f_win_ef)(spec->f_win_fh, *ptr); + (*spec->f_win_ef)(spec->stream, &end_offset); } - return NULL; + return more; } context = spec->context_stack[spec->context_stack_top]; skip_ptr = *ptr; @@ -1803,13 +1806,14 @@ data1_node *lexNode (struct lexSpec *spec, int *ptr) last_rule = state->rule_nno; last_ptr = *ptr; } + more = 1; } break; } else t++; } - return NULL; + return more; } static data1_node *lexRoot (struct lexSpec *spec, off_t offset, @@ -1817,6 +1821,7 @@ static data1_node *lexRoot (struct lexSpec *spec, off_t offset, { struct lexContext *lt = spec->context; int ptr = offset; + int ret; spec->stop_flag = 0; spec->d1_level = 0; @@ -1842,12 +1847,15 @@ static data1_node *lexRoot (struct lexSpec *spec, off_t offset, } #endif execAction (spec, lt->beginActionList, ptr, &ptr); - lexNode (spec, &ptr); + + ret = lexNode (spec, &ptr); while (spec->d1_level) { tagDataRelease (spec); (spec->d1_level)--; } + if (!ret) + return 0; execAction (spec, lt->endActionList, ptr, &ptr); return spec->d1_stack[0]; } @@ -1884,6 +1892,7 @@ data1_node *grs_read_regx (struct grs_read_info *p) int res; struct lexSpecs *specs = (struct lexSpecs *) p->clientData; struct lexSpec **curLexSpec = &specs->spec; + off_t start_offset; #if REGX_DEBUG yaz_log (YLOG_LOG, "grs_read_regx"); @@ -1901,18 +1910,19 @@ data1_node *grs_read_regx (struct grs_read_info *p) } } (*curLexSpec)->dh = p->dh; - if (!p->offset) + start_offset = p->stream->tellf(p->stream); + if (start_offset == 0) { (*curLexSpec)->f_win_start = 0; (*curLexSpec)->f_win_end = 0; - (*curLexSpec)->f_win_rf = p->readf; - (*curLexSpec)->f_win_sf = p->seekf; - (*curLexSpec)->f_win_fh = p->fh; - (*curLexSpec)->f_win_ef = p->endf; + (*curLexSpec)->f_win_rf = p->stream->readf; + (*curLexSpec)->f_win_sf = p->stream->seekf; + (*curLexSpec)->stream = p->stream; + (*curLexSpec)->f_win_ef = p->stream->endf; (*curLexSpec)->f_win_size = 500000; } (*curLexSpec)->m = p->mem; - return lexRoot (*curLexSpec, p->offset, "main"); + return lexRoot (*curLexSpec, start_offset, "main"); } static int extract_regx(void *clientData, struct recExtractCtrl *ctrl) @@ -1942,6 +1952,7 @@ data1_node *grs_read_tcl (struct grs_read_info *p) int res; struct lexSpecs *specs = (struct lexSpecs *) p->clientData; struct lexSpec **curLexSpec = &specs->spec; + off_t start_offset; #if REGX_DEBUG yaz_log (YLOG_LOG, "grs_read_tcl"); @@ -1968,18 +1979,19 @@ data1_node *grs_read_tcl (struct grs_read_info *p) } } (*curLexSpec)->dh = p->dh; - if (!p->offset) + start_offset = p->stream->tellf(p->stream); + if (start_offset == 0) { (*curLexSpec)->f_win_start = 0; (*curLexSpec)->f_win_end = 0; - (*curLexSpec)->f_win_rf = p->readf; - (*curLexSpec)->f_win_sf = p->seekf; - (*curLexSpec)->f_win_fh = p->fh; - (*curLexSpec)->f_win_ef = p->endf; + (*curLexSpec)->f_win_rf = p->stream->readf; + (*curLexSpec)->f_win_sf = p->stream->seekf; + (*curLexSpec)->stream = p->stream; + (*curLexSpec)->f_win_ef = p->stream->endf; (*curLexSpec)->f_win_size = 500000; } (*curLexSpec)->m = p->mem; - return lexRoot (*curLexSpec, p->offset, "main"); + return lexRoot (*curLexSpec, start_offset, "main"); } static int extract_tcl(void *clientData, struct recExtractCtrl *ctrl)