2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.5 1995-09-04 12:33:25 adam
8 * Various cleanup. YAZ util used instead.
10 * Revision 1.4 1995/01/24 16:00:21 adam
11 * Added -ansi to CFLAGS.
12 * Some changes to the dfa module.
14 * Revision 1.3 1994/09/27 16:31:18 adam
15 * First version of grepper: grep with error correction.
17 * Revision 1.2 1994/09/26 16:30:56 adam
18 * Minor changes. imalloc uses xmalloc now.
20 * Revision 1.1 1994/09/26 10:16:52 adam
21 * First version of dfa module in alex. This version uses yacc to parse
22 * regular expressions. This should be hand-made instead.
31 #include <sys/types.h>
47 void error (const char *format, ...)
50 va_start (argptr, format);
51 fprintf (stderr, "%s error: ", prog);
52 (void) vfprintf (stderr, format, argptr);
65 static int show_lines = 0;
67 int agrep_options (argc, argv)
78 fprintf (stderr, "%s: %s %s\n", prog, __DATE__, __TIME__);
105 debug_dfa_followpos = 1;
110 debug_dfa_followpos = 1;
115 fprintf (stderr, "%s: unknown option `-%s'\n", prog, *argv);
123 #define INF_BUF_SIZE 32768U
124 static char *inf_buf;
125 static char *inf_ptr, *inf_flsh;
126 static int inf_eof, line_no;
128 static int inf_flush (fd)
134 r = (unsigned) (inf_buf+INF_BUF_SIZE - inf_ptr); /* no of `wrap' bytes */
136 memcpy (inf_buf, inf_ptr, r);
137 inf_ptr = p = inf_buf + r;
138 b = INF_BUF_SIZE - r;
140 if ((r = read (fd, p, b)) == (unsigned) -1)
150 while ((b -= r) > 0);
151 while (p != inf_buf && *--p != '\n')
153 while (p != inf_buf && *--p != '\n')
159 static char *prline (p)
165 while (p != inf_buf && p[-1] != '\n')
172 printf ("%5d:\t%s\n", line_no, p0);
179 static int go (fd, dfaar)
181 struct DFA_state **dfaar;
183 struct DFA_state *s = dfaar[0];
191 for (c = *inf_ptr++, t=s->trans, i=s->tran_no; --i >= 0; t++)
192 if (c >= t->ch[0] && c <= t->ch[1])
197 if ((s = dfaar[t->to])->rule_no)
199 inf_ptr = prline (inf_ptr);
203 for (t=s->trans, i=s->tran_no; --i >= 0; t++)
204 if ((unsigned) *p >= t->ch[0]
205 && (unsigned) *p <= t->ch[1])
215 if (inf_ptr == inf_flsh)
222 fprintf (stderr, "%s: read error\n", prog);
232 struct DFA_state **dfas;
235 inf_buf = imalloc (sizeof(char)*INF_BUF_SIZE);
237 inf_ptr = inf_buf+INF_BUF_SIZE;
248 int main (argc, argv)
252 char *pattern = NULL;
255 struct DFA *dfa = dfa_init();
265 setbuf (stdout, outbuf);
266 i = agrep_options (argc, argv);
270 if (**++argv != '-' && **argv)
274 i = dfa_parse (dfa, &pattern);
277 fprintf (stderr, "%s: illegal pattern\n", prog);
285 fd = open (*argv, O_RDONLY | O_BINARY);
288 fprintf (stderr, "%s: couldn't open `%s'\n", prog, *argv);
291 i = agrep (dfa->states, fd);
298 fprintf (stderr, "%s: no files specified\n", prog);