X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=dfa%2Fagrep.c;h=0d671ef15296e7e7fbc758ef24b2362036d58787;hp=3c4e2427d3c8d1f7c64850393c53b543f35b3a4e;hb=c97718edd01f7d1813edbf94c58b93a747143311;hpb=f47681a8ea1b2374df333fb2993d8026558efd27 diff --git a/dfa/agrep.c b/dfa/agrep.c index 3c4e242..0d671ef 100644 --- a/dfa/agrep.c +++ b/dfa/agrep.c @@ -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. - * - */ +/* This file is part of the Zebra server. + Copyright (C) 1994-2011 Index Data + +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 + +*/ + + +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -21,10 +30,15 @@ #include #include #include -#include +#ifdef WIN32 +#include +#endif +#if HAVE_UNISTD_H +#include +#endif -#include +#include #include #include "imalloc.h" @@ -34,38 +48,28 @@ 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 argc; -char **argv; +int agrep_options (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 +77,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 +97,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 +110,20 @@ static char *inf_buf; static char *inf_ptr, *inf_flsh; static int inf_eof, line_no; -static int inf_flush( fd ) -int fd; +static int inf_flush (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 +131,170 @@ 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 ) -char *p; +static char *prline (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 ) -int fd; -DFA_state **dfaar; +static int go (int fd, 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 fd; +int agrep (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 argc; -char **argv; +int main (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 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +