Update copyright year + FSF address
[idzebra-moved-to-github.git] / dfa / agrep.c
index 3c4e242..22894a1 100644 (file)
@@ -1,17 +1,26 @@
-/*
- * Copyright (C) 1994, Index Data I/S 
- * All rights reserved.
- * Sebastian Hammer, Adam Dickmeiss
- *
- * $Log: agrep.c,v $
- * 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.18 2006-08-14 10:40:08 adam Exp $
+   Copyright (C) 1995-2006
+   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 this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  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 <io.h>
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
-#include <util.h>
+#include <idzebra/util.h>
 #include <dfa.h>
 #include "imalloc.h"
 
 
 static char *prog;
 
-void error( const char *format, ... )
+void error (const char *format, ...)
 {
     va_list argptr;
-    va_start( argptr, format );
-    fprintf( stderr, "%s error: ", prog );
-    (void) vfprintf( stderr, format, argptr );
-    putc( '\n', stderr );
-    exit( 1 );
+    va_start (argptr, format);
+    fprintf (stderr, "%s error: ", prog);
+    (void) vfprintf (stderr, format, argptr);
+    putc ('\n', stderr);
+    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 )
+int agrep_options (argc, argv)
 int argc;
 char **argv;
 {
-    while( --argc > 0 )
-        if( **++argv == '-' )
-            while( *++*argv )
+    while (--argc > 0)
+        if (**++argv == '-')
+            while (*++*argv)
             {
-                switch( **argv )
+                switch (**argv)
                 {
                 case 'V':
-                    fprintf( stderr, "%s: %s %s\n", prog, __DATE__, __TIME__ );
+                    fprintf (stderr, "%s: %s %s\n", prog, __DATE__, __TIME__);
                     continue;
                 case 'v':
                     dfa_verbose = 1;
@@ -73,17 +79,8 @@ char **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 )
+                    switch (*++*argv)
                     {
                     case 's':
                         debug_dfa_tran = 1;
@@ -102,7 +99,7 @@ char **argv;
                     }
                     continue;
                 default:
-                    fprintf( stderr, "%s: unknown option `-%s'\n", prog, *argv );
+                    fprintf (stderr, "%s: unknown option `-%s'\n", prog, *argv);
                     return 1;
                 }
                 break;
@@ -115,21 +112,21 @@ static char *inf_buf;
 static char *inf_ptr, *inf_flsh;
 static int inf_eof, line_no;
 
-static int inf_flush( fd )
+static int inf_flush (fd)
 int fd;
 {
     char *p;
     unsigned b, r;
 
     r = (unsigned) (inf_buf+INF_BUF_SIZE - inf_ptr);  /* no of `wrap' bytes */
-    if( r )
-        memcpy( inf_buf, inf_ptr, r );
+    if (r)
+        memcpy (inf_buf, inf_ptr, r);
     inf_ptr = p = inf_buf + r;
     b = INF_BUF_SIZE - r;
     do
-        if( (r = read( fd, p, b ) ) == (unsigned) -1 )
+        if ((r = read (fd, p, b)) == (unsigned) -1)
             return -1;
-        else if( r )
+        else if (r)
             p +=  r;
         else
         {
@@ -137,160 +134,176 @@ int fd;
             inf_eof = 1;
             break;
         }
-    while( (b -= r) > 0 );
-    while( p != inf_buf && *--p != '\n' )
+    while ((b -= r) > 0);
+    while (p != inf_buf && *--p != '\n')
         ;
-    while( p != inf_buf && *--p != '\n' )
+    while (p != inf_buf && *--p != '\n')
         ;
     inf_flsh = p+1;
     return 0;
 }
 
-static char *prline( p )
+static char *prline (p)
 char *p;
 {
     char *p0;
 
     --p;
-    while( p != inf_buf && p[-1] != '\n' )
+    while (p != inf_buf && p[-1] != '\n')
         --p;
     p0 = p;
-    while( *p++ != '\n' )
+    while (*p++ != '\n')
         ;
     p[-1] = '\0';
-    if( show_lines )
-        printf( "%5d:\t%s\n", line_no, p0 );
+    if (show_lines)
+        printf ("%5d:\t%s\n", line_no, p0);
     else
-        puts( p0 );
+        puts (p0);
     p[-1] = '\n';
     return p;
 }
 
-static int go( fd, dfaar )
+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 )
+    while (1)
     {
-        for( c = *inf_ptr++, t=s->trans, i=s->tran_no; --i >= 0; t++ )
-            if( c >= t->ch[0] && c <= t->ch[1] )
+        for (c = *inf_ptr++, t=s->trans, i=s->tran_no; --i >= 0; t++)
+            if (c >= t->ch[0] && c <= t->ch[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 );
+                        inf_ptr = prline (inf_ptr);
                         c = '\n';
                         break;
                     }
-                    for( t=s->trans, i=s->tran_no; --i >= 0; t++ )
-                        if( (unsigned) *p >= t->ch[0] 
-                           && (unsigned) *p <= t->ch[1] )
+                    for (t=s->trans, i=s->tran_no; --i >= 0; t++)
+                        if ((unsigned) *p >= t->ch[0] 
+                           && (unsigned) *p <= t->ch[1])
                             break;
                     p++;
-                } while( i >= 0 );
+                } while (i >= 0);
                 s = dfaar[0];
                 break;
             }
-        if( c == '\n' )
+        if (c == '\n')
         {
+            start_line = 1;
             ++line_no;
-            if( inf_ptr == inf_flsh )
+            if (inf_ptr == inf_flsh)
             {
-                if( inf_eof )
+                if (inf_eof)
                     break;
                 ++line_no;
-                if( inf_flush( fd ) )
+                if (inf_flush (fd))
                 {
-                    fprintf( stderr, "%s: read error\n", prog );
+                    fprintf (stderr, "%s: read error\n", prog);
                     return -1;
                 }
             }
         }
+        else
+            start_line = 0;
     }
     return 0;
 }
 
-int agrep( dfas, fd )
-DFA_states *dfas;
+int agrep (dfas, fd)
+struct DFA_state **dfas;
 int fd;
 {
-    inf_buf = imalloc( sizeof(char)*INF_BUF_SIZE );
+    inf_buf = imalloc (sizeof(char)*INF_BUF_SIZE);
     inf_eof = 0;
     inf_ptr = inf_buf+INF_BUF_SIZE;
-    inf_flush( fd );
+    inf_flush (fd);
     line_no = 1;
 
-    go( fd, dfas->sortarray);
+    go (fd, dfas);
 
-    ifree( inf_buf );
+    ifree (inf_buf);
     return 0;
 }
 
 
-int main( argc, argv )
+int main (argc, argv)
 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
-    setbuf( stdout, outbuf );
-    i = agrep_options( argc, argv );
-    if( i )
+    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 )
+    while (--argc > 0)
+        if (**++argv != '-' && **argv)
+        {
+            if (!pattern)
             {
                 pattern = *argv;
-                i = parse_dfa( dfa, &pattern, dfa_thompson_chars );
-                if( i || *pattern )
+                i = dfa_parse (dfa, &pattern);
+                if (i || *pattern)
                 {
-                    fprintf( stderr, "%s: illegal pattern\n", prog );
+                    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;
-                fd = open( *argv, O_RDONLY | O_BINARY);
-                if( fd == -1 )
+                fd = open (*argv, O_RDONLY | O_BINARY);
+                if (fd == -1)
                 {
-                    fprintf( stderr, "%s: couldn't open `%s'\n", prog, *argv );
+                    fprintf (stderr, "%s: couldn't open `%s'\n", prog, *argv);
                     return 1;
                 }
-                i = agrep( dfas, fd );
-                close( fd );
-                if( i )
+                i = agrep (dfa->states, fd);
+                close (fd);
+                if (i)
                     return i;
             }
-    if( !no )
+        }
+    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;
 }
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+