C++ compilation.
[idzebra-moved-to-github.git] / dfa / agrep.c
index c8cdf7e..39d0f69 100644 (file)
@@ -1,10 +1,39 @@
 /*
- * Copyright (C) 1994, Index Data I/S 
+ * Copyright (C) 1994-1999, Index Data
  * All rights reserved.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: agrep.c,v $
- * Revision 1.3  1994-09-27 16:31:18  adam
+ * Revision 1.12  1999-05-26 07:49:12  adam
+ * C++ compilation.
+ *
+ * Revision 1.11  1999/02/02 14:50:03  adam
+ * Updated WIN32 code specific sections. Changed header.
+ *
+ * Revision 1.10  1997/09/09 13:37:57  adam
+ * Partial port to WIN95/NT.
+ *
+ * Revision 1.9  1996/10/29 13:57:18  adam
+ * Include of zebrautl.h instead of alexutil.h.
+ *
+ * Revision 1.8  1996/01/08 09:09:16  adam
+ * Function dfa_parse got 'const' string argument.
+ * New functions to define char mappings made public.
+ *
+ * Revision 1.7  1995/10/16  09:31:24  adam
+ * Bug fix.
+ *
+ * Revision 1.6  1995/09/28  09:18:51  adam
+ * Removed various preprocessor defines.
+ *
+ * Revision 1.5  1995/09/04  12:33:25  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/09/27  16:31:18  adam
  * First version of grepper: grep with error correction.
  *
  * Revision 1.2  1994/09/26  16:30:56  adam
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <unistd.h>
 
+#ifdef WIN32
+
+#include <io.h>
+
+#else
+#include <unistd.h>
+#endif
 
-#include <util.h>
+#include <zebrautl.h>
 #include <dfa.h>
 #include "imalloc.h"
 
@@ -47,14 +82,6 @@ void error (const char *format, ...)
     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)
@@ -76,15 +103,6 @@ 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)
                     {
@@ -171,13 +189,14 @@ char *p;
 
 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)
     {
@@ -187,7 +206,8 @@ DFA_state **dfaar;
                 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';
@@ -204,6 +224,7 @@ DFA_state **dfaar;
             }
         if (c == '\n')
         {
+            start_line = 1;
             ++line_no;
             if (inf_ptr == inf_flsh)
             {
@@ -217,12 +238,14 @@ DFA_state **dfaar;
                 }
             }
         }
+        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);
@@ -231,7 +254,7 @@ int fd;
     inf_flush (fd);
     line_no = 1;
 
-    go (fd, dfas->sortarray);
+    go (fd, dfas);
 
     ifree (inf_buf);
     return 0;
@@ -242,38 +265,38 @@ 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
+    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
             {
@@ -284,16 +307,19 @@ char **argv;
                     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;
 }