X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fregxread.c;h=4e75ffa526fdcdf2a4ed52a2bfc2782b0e46eb15;hb=131e8143a9b8da294d582f0793833679101a2672;hp=993fb53830e48ae1ee27b40ffff20cd4252b4677;hpb=852d5f1f9aa0a70f7e54a68143ee86752394a2f2;p=idzebra-moved-to-github.git diff --git a/index/regxread.c b/index/regxread.c index 993fb53..4e75ffa 100644 --- a/index/regxread.c +++ b/index/regxread.c @@ -1,5 +1,5 @@ -/* $Id: regxread.c,v 1.3 2006-08-22 13:39:27 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. @@ -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; @@ -1769,7 +1771,7 @@ data1_node *lexNode (struct lexSpec *spec, int *ptr) #endif (*spec->f_win_ef)(spec->stream, &end_offset); } - return NULL; + return more; } context = spec->context_stack[spec->context_stack_top]; skip_ptr = *ptr; @@ -1804,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, @@ -1818,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; @@ -1843,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]; }