-/*
- * Copyright (C) 1994, Index Data I/S
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: agrep.c,v $
- * Revision 1.3 1994-09-27 16:31:18 adam
- * First version of grepper: grep with error correction.
- *
- * Revision 1.2 1994/09/26 16:30:56 adam
- * Minor changes. imalloc uses xmalloc now.
- *
- * Revision 1.1 1994/09/26 10:16:52 adam
- * First version of dfa module in alex. This version uses yacc to parse
- * regular expressions. This should be hand-made instead.
- *
- */
+/* $Id: agrep.c,v 1.14 2005-01-15 19:38:18 adam Exp $
+ Copyright (C) 1995-2005
+ Index Data ApS
+
+This file is part of the Zebra server.
+
+Zebra is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Zebra is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Zebra; see the file LICENSE.zebra. If not, write to the
+Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+*/
+
+
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include <unistd.h>
+#ifdef WIN32
-#include <util.h>
+#include <io.h>
+
+#else
+#include <unistd.h>
+#endif
+
+#include <zebrautl.h>
#include <dfa.h>
#include "imalloc.h"
exit (1);
}
-#ifdef YYDEBUG
-#ifdef YACC
-extern int yydebug;
-#else
-extern int alexdebug;
-#endif
-#endif
-
static int show_lines = 0;
int agrep_options (argc, argv)
case 'n':
show_lines = 1;
continue;
-#ifdef YYDEBUG
- case 't':
-#ifdef YACC
- yydebug = 1;
-#else
- alexdebug = 1;
-#endif
- continue;
-#endif
case 'd':
switch (*++*argv)
{
static int go (fd, dfaar)
int fd;
-DFA_state **dfaar;
+struct DFA_state **dfaar;
{
- DFA_state *s = dfaar[0];
- DFA_tran *t;
+ struct DFA_state *s = dfaar[0];
+ struct DFA_tran *t;
char *p;
int i;
unsigned char c;
+ int start_line = 1;
while (1)
{
p = inf_ptr;
do
{
- if ((s = dfaar[t->to])->rule_no)
+ if ((s = dfaar[t->to])->rule_no &&
+ (start_line || s->rule_nno))
{
inf_ptr = prline (inf_ptr);
c = '\n';
}
if (c == '\n')
{
+ start_line = 1;
++line_no;
if (inf_ptr == inf_flsh)
{
}
}
}
+ else
+ start_line = 0;
}
return 0;
}
int agrep (dfas, fd)
-DFA_states *dfas;
+struct DFA_state **dfas;
int fd;
{
inf_buf = imalloc (sizeof(char)*INF_BUF_SIZE);
inf_flush (fd);
line_no = 1;
- go (fd, dfas->sortarray);
+ go (fd, dfas);
ifree (inf_buf);
return 0;
int argc;
char **argv;
{
- char *pattern = NULL;
+ const char *pattern = NULL;
char outbuf[BUFSIZ];
int fd, i, no = 0;
- DFA *dfa = init_dfa();
- DFA_states *dfas;
+ struct DFA *dfa = dfa_init();
prog = *argv;
-#ifdef YYDEBUG
-#ifdef YACC
- yydebug = 0;
-#else
- alexdebug = 0;
-#endif
-#endif
+ if (argc < 2)
+ {
+ fprintf (stderr, "usage: agrep [options] pattern file..\n");
+ fprintf (stderr, " -v dfa verbose\n");
+ fprintf (stderr, " -n show lines\n");
+ fprintf (stderr, " -d debug\n");
+ fprintf (stderr, " -V show version\n");
+ exit (1);
+ }
setbuf (stdout, outbuf);
i = agrep_options (argc, argv);
if (i)
return i;
while (--argc > 0)
if (**++argv != '-' && **argv)
+ {
if (!pattern)
{
pattern = *argv;
- 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
{
fprintf (stderr, "%s: couldn't open `%s'\n", prog, *argv);
return 1;
}
- i = agrep (dfas, fd);
+ i = agrep (dfa->states, fd);
close (fd);
if (i)
return i;
}
+ }
if (!no)
{
- fprintf (stderr, "%s: no files specified\n", prog);
+ fprintf (stderr, "usage:\n "
+ " %s [-d] [-v] [-n] [-f] pattern file ..\n", prog);
return 2;
}
fflush(stdout);
+ dfa_delete (&dfa);
return 0;
}