X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=dfa%2Fgrepper.c;h=d7a858ea4d1aa46e17c5f6e4ed41020c3a17e2b3;hb=5b4dcfcb99600327a11b58de4fec33003dc4d816;hp=97df6b195e0748eca72f355468d9540907c88550;hpb=1b29b77f09ae310c41f9cd0a6eeea2d562b7729e;p=idzebra-moved-to-github.git diff --git a/dfa/grepper.c b/dfa/grepper.c index 97df6b1..d7a858e 100644 --- a/dfa/grepper.c +++ b/dfa/grepper.c @@ -1,10 +1,27 @@ /* - * Copyright (C) 1994, Index Data I/S + * Copyright (C) 1994-1999, Index Data * All rights reserved. * Sebastian Hammer, Adam Dickmeiss * * $Log: grepper.c,v $ - * Revision 1.3 1994-10-04 17:46:43 adam + * Revision 1.8 1999-02-02 14:50:07 adam + * Updated WIN32 code specific sections. Changed header. + * + * Revision 1.7 1996/10/29 13:57:24 adam + * Include of zebrautl.h instead of alexutil.h. + * + * Revision 1.6 1996/01/08 09:09:20 adam + * Function dfa_parse got 'const' string argument. + * New functions to define char mappings made public. + * + * Revision 1.5 1995/09/04 12:33:26 adam + * Various cleanup. YAZ util used instead. + * + * Revision 1.4 1995/01/24 16:00:21 adam + * Added -ansi to CFLAGS. + * Some changes to the dfa module. + * + * Revision 1.3 1994/10/04 17:46:43 adam * Function options now returns arg with error option. * * Revision 1.2 1994/10/03 17:22:18 adam @@ -20,7 +37,7 @@ #include #include -#include +#include #include #include "imalloc.h" @@ -66,19 +83,19 @@ static INLINE MatchWord get_bit (MatchContext *mc, MatchWord *m, int ch, return m[mc->n * ch + wno] & (1<n = (dfas->no+WORD_BITS) / WORD_BITS; + mc->n = (dfa->no_states+WORD_BITS) / WORD_BITS; mc->range = range; mc->Sc = icalloc (sizeof(*mc->Sc) * 256 * mc->n); - for (i=0; ino; i++) + for (i=0; ino_states; i++) { int j; - DFA_state *state = dfas->sortarray[i]; + struct DFA_state *state = dfa->states[i]; for (j=0; jtran_no; j++) { @@ -96,7 +113,7 @@ static MatchContext *mk_MatchContext (DFA_states *dfas, int range) static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, - DFA_states *dfas, int ch) + struct DFA *dfa, int ch) { int j, s = 0; MatchWord *Rsrc_p = Rsrc, mask; @@ -113,7 +130,7 @@ static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, { if (mask & 1) { - DFA_state *state = dfas->sortarray[s]; + struct DFA_state *state = dfa->states[s]; int i = state->tran_no; while (--i >= 0) if (ch >= state->trans[i].ch[0] && @@ -122,7 +139,7 @@ static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, } if (mask & 2) { - DFA_state *state = dfas->sortarray[s+1]; + struct DFA_state *state = dfa->states[s+1]; int i = state->tran_no; while (--i >= 0) if (ch >= state->trans[i].ch[0] && @@ -131,7 +148,7 @@ static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, } if (mask & 4) { - DFA_state *state = dfas->sortarray[s+2]; + struct DFA_state *state = dfa->states[s+2]; int i = state->tran_no; while (--i >= 0) if (ch >= state->trans[i].ch[0] && @@ -140,7 +157,7 @@ static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, } if (mask & 8) { - DFA_state *state = dfas->sortarray[s+3]; + struct DFA_state *state = dfa->states[s+3]; int i = state->tran_no; while (--i >= 0) if (ch >= state->trans[i].ch[0] && @@ -149,7 +166,7 @@ static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, } } s += 4; - if (s >= dfas->no) + if (s >= dfa->no_states) return; mask >>= 4; } @@ -157,7 +174,7 @@ static void mask_shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, } static void shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, - DFA_states *dfas) + struct DFA *dfa) { int j, s = 0; MatchWord *Rsrc_p = Rsrc, mask; @@ -172,35 +189,35 @@ static void shift (MatchContext *mc, MatchWord *Rdst, MatchWord *Rsrc, { if (mask & 1) { - DFA_state *state = dfas->sortarray[s]; + struct DFA_state *state = dfa->states[s]; int i = state->tran_no; while (--i >= 0) set_bit (mc, Rdst, 0, state->trans[i].to); } if (mask & 2) { - DFA_state *state = dfas->sortarray[s+1]; + struct DFA_state *state = dfa->states[s+1]; int i = state->tran_no; while (--i >= 0) set_bit (mc, Rdst, 0, state->trans[i].to); } if (mask & 4) { - DFA_state *state = dfas->sortarray[s+2]; + struct DFA_state *state = dfa->states[s+2]; int i = state->tran_no; while (--i >= 0) set_bit (mc, Rdst, 0, state->trans[i].to); } if (mask & 8) { - DFA_state *state = dfas->sortarray[s+3]; + struct DFA_state *state = dfa->states[s+3]; int i = state->tran_no; while (--i >= 0) set_bit (mc, Rdst, 0, state->trans[i].to); } } s += 4; - if (s >= dfas->no) + if (s >= dfa->no_states) return; mask >>= 4; } @@ -216,7 +233,7 @@ static void or (MatchContext *mc, MatchWord *Rdst, } -static int go (MatchContext *mc, DFA_states *dfas, FILE *inf) +static int go (MatchContext *mc, struct DFA *dfa, FILE *inf) { MatchWord *Rj, *Rj1, *Rj_a, *Rj_b, *Rj_c; int s, d, ch; @@ -238,11 +255,11 @@ static int go (MatchContext *mc, DFA_states *dfas, FILE *inf) { int s; memcpy (Rj + mc->n * d, Rj + mc->n * (d-1), mc->n * sizeof(*Rj)); - for (s = 0; sno; s++) + for (s = 0; sno_states; s++) { if (get_bit (mc, Rj, d-1, s)) { - DFA_state *state = dfas->sortarray[s]; + struct DFA_state *state = dfa->states[s]; int i = state->tran_no; while (--i >= 0) set_bit (mc, Rj, d, state->trans[i].to); @@ -278,27 +295,27 @@ static int go (MatchContext *mc, DFA_states *dfas, FILE *inf) } if (++inf_ptr == INFBUF_SIZE) inf_ptr = 0; - mask_shift (mc, Rj1, Rj, dfas, ch); + mask_shift (mc, Rj1, Rj, dfa, ch); for (d = 1; d <= mc->range; d++) { - mask_shift (mc, Rj_b, Rj+d*mc->n, dfas, ch); /* 1 */ + mask_shift (mc, Rj_b, Rj+d*mc->n, dfa, ch); /* 1 */ or (mc, Rj_a, Rj+(d-1)*mc->n, Rj1+(d-1)*mc->n); /* 2,3 */ - shift (mc, Rj_c, Rj_a, dfas); + shift (mc, Rj_c, Rj_a, dfa); or (mc, Rj_a, Rj_b, Rj_c); /* 1,2,3*/ or (mc, Rj1+d*mc->n, Rj_a, Rj+(d-1)*mc->n); /* 1,2,3,4 */ } - for (s = 0; sno; s++) + for (s = 0; sno_states; s++) { - if (dfas->sortarray[s]->rule_no) + if (dfa->states[s]->rule_no) if (get_bit (mc, Rj1+mc->range*mc->n, 0, s)) no_match++; } for (d = 0; d <= mc->range; d++) - reset_bit (mc, Rj1+d*mc->n, 0, dfas->no); + reset_bit (mc, Rj1+d*mc->n, 0, dfa->no_states); Rj_t = Rj1; Rj1 = Rj; Rj = Rj_t; @@ -312,7 +329,7 @@ static int go (MatchContext *mc, DFA_states *dfas, FILE *inf) return 0; } -static int grep_file (DFA_states *dfas, const char *fname, int range) +static int grep_file (struct DFA *dfa, const char *fname, int range) { FILE *inf; MatchContext *mc; @@ -322,16 +339,16 @@ static int grep_file (DFA_states *dfas, const char *fname, int range) inf = fopen (fname, "r"); if (!inf) { - log (LOG_FATAL|LOG_ERRNO, "cannot open `%s'", fname); + logf (LOG_FATAL|LOG_ERRNO, "cannot open `%s'", fname); exit (1); } } else inf = stdin; - mc = mk_MatchContext (dfas, range); + mc = mk_MatchContext (dfa, range); - go (mc, dfas, inf); + go (mc, dfa, inf); if (fname) fclose (inf); @@ -343,9 +360,9 @@ int main (int argc, char **argv) int ret; int range = 0; char *arg; - char *pattern = NULL; - DFA_states *dfas = NULL; + const char *pattern = NULL; int no_files = 0; + struct DFA *dfa = dfa_init(); prog = argv[0]; while ((ret = options ("nr:dsv:", argv, argc, &arg)) != -2) @@ -355,22 +372,19 @@ int main (int argc, char **argv) if (!pattern) { int i; - DFA *dfa = init_dfa(); pattern = arg; - i = parse_dfa (dfa, &pattern, dfa_thompson_chars); + i = dfa_parse (dfa, &pattern); if (i || *pattern) { fprintf (stderr, "%s: illegal pattern\n", prog); return 1; } - dfa->root = dfa->top; - dfas = mk_dfas (dfa, 200); - rm_dfa (&dfa); + dfa_mkstate (dfa); } else { no_files++; - grep_file (dfas, arg, range); + grep_file (dfa, arg, range); } } else if (ret == 'v') @@ -397,7 +411,7 @@ int main (int argc, char **argv) } else { - log (LOG_FATAL, "Unknown option '-%s'", arg); + logf (LOG_FATAL, "Unknown option '-%s'", arg); exit (1); } } @@ -409,7 +423,8 @@ int main (int argc, char **argv) } else if (no_files == 0) { - grep_file (dfas, NULL, range); + grep_file (dfa, NULL, range); } + dfa_delete (&dfa); return 0; }