home *** CD-ROM | disk | FTP | other *** search
- Path: wuarchive!usc!rutgers!aramis.rutgers.edu!paul.rutgers.edu!yoko.rutgers.edu!jac
- From: jac@yoko.rutgers.edu (Jonathan A. Chandross)
- Newsgroups: comp.sources.apple2
- Subject: v001SRC013: fgrep (Fixed String Pattern Matcher)
- Message-ID: <Dec.1.16.48.25.1990.24678@yoko.rutgers.edu>
- Date: 1 Dec 90 21:48:26 GMT
- Organization: Rutgers Univ., New Brunswick, N.J.
- Lines: 168
- Approved: jac@paul.rutgers.edu
-
-
- Submitted-by: NONE
- Posting-number: Volume 1, Source:13
- Archive-name: util/fgrep
- Architecture: ANY_2
- Version-number: 1.00
-
- This program is a fixed string pattern matcher (i.e. no regular
- expressions).
-
- Enjoy.
-
- =fgrep.c
- -/*
- - *
- - * fgrep.c
- - *
- - * Fast pattern matcher for fixed strings (no regular expressions).
- - *
- - * Usage:
- - * fgrep [-nx] pattern [file_1] [file_2] [file_3] [...]
- - *
- - * Options:
- - * -x print lines that do not patch pattern
- - * -n print out line number
- - *
- - * If no file is specified, fgrep reads from standard in.
- - *
- - * Contributed Anonymously. Written: November 1983
- - *
- - * Version 1.00
- - *
- - */
- -
- -#include "stdio.h"
- -
- -#define TRUE 1
- -#define FALSE 0
- -#define MAXLINE 256
- -#define BLANK ' '
- -#define TAB '\t'
- -#define NL '\n'
- -#define EOS '\0'
- -
- -int numbering, except, files ;
- -char *fname ;
- -
- -main(argc, argv)
- -int argc ;
- -char *argv[] ;
- -{
- - char *s, *pattern ;
- - FILE *input ;
- -
- -
- - numbering = except = files = FALSE ;
- -
- - while( --argc>0 && **++argv == '-' )
- - for( s=&argv[0][1] ; *s != EOS ; s++ )
- - switch( *s ) {
- - case 'n':
- - numbering = TRUE ;
- - break ;
- - case 'x':
- - except = TRUE ;
- - break ;
- - default:
- - fprintf(stderr, "fgrep: unknown option %c\n", *s ) ;
- - argc = -1 ;
- - break ;
- - }
- -
- - if( argc <= 0 ) {
- - fprintf(stderr, "usage: fgrep [-nx] pattern [files]\n");
- - exit(1) ;
- - }
- -
- - pattern = *argv ;
- - argc-- ; argv++ ;
- -
- - if( argc > 1 )
- - files = TRUE ;
- -
- - if( argc == 0 )
- - fgrep( stdin, pattern ) ;
- -
- - else
- - for( ; argc>0 ; argc--,argv++)
- - if( (input=fopen(*argv,"r")) == NULL ) {
- - fprintf(stderr, "fgrep: can't open %s\n", *argv) ;
- - exit(1) ;
- - }
- - else {
- - fname = *argv ;
- - fgrep(input, pattern) ;
- - fclose( input ) ;
- - }
- -
- - exit(0) ;
- -
- -} /* end main */
- -
- -/* fgrep - match pattern to file */
- -
- -fgrep( in, pat )
- -FILE *in ;
- -char *pat ;
- -{
- - char line[ MAXLINE ], *fgets() ;
- - int lines ;
- -
- -
- - lines = 0 ;
- - while( fgets(line, MAXLINE, in) != NULL ) {
- - lines++ ;
- - if( (match(line, pat) >= 0) != except ) {
- - if( files )
- - printf("%s: ", fname ) ;
- - if( numbering )
- - printf("%d: ", lines ) ;
- - printf("%s", line ) ;
- - }
- - }
- -
- -} /* end fgrep */
- -
- -/* match - return index of pattern */
- -
- -match( subject, pattern )
- -char *subject, *pattern ;
- -{
- - char *s, *p, *ss ;
- -
- - for( s=subject ; *s != EOS ; s++ ) {
- - for( ss=s, p=pattern ; *p != EOS && *p == *ss ; p++, ss++ )
- - ;
- - if( *p == EOS )
- - return s - subject ;
- - }
- -
- - return -1 ;
- -
- -} /* end match */
- -
- -/* fgets - read a line from a file. */
- -
- -char *fgets(line, maxline, input)
- -char *line ;
- -int maxline ;
- -FILE *input ;
- -{
- - int c ;
- - char *start_line ;
- -
- - start_line = line;
- -
- - while( --maxline>0 && (c=agetc(input)) != EOF )
- - if( (*line++ = c) == NL )
- - break ;
- -
- - *line = 0 ;
- - if( c == EOF && line == start_line )
- - return(NULL) ;
- - return(line) ;
- -}
- -
- -
- + END OF ARCHIVE
-