/* * grep. * * EDITS - General Scientific Corporation - Rockville, Md. 301-340-2773 * * 23-Jan-85 lmf Split apart into grep{main}, gredoc and gresub * 02-Feb-85 lmf Add multi-pattern boolian match * 15-Oct-85 lmf Combine with SOUNDEX match version * 25-Jan-86 lmf Add Beginning_of_line match to SOUNDEX * 28-Jan-86 lmf Add clean interrupt capability */ #define IDENT "V1.3.h" char *gr_ident = IDENT ; #ifdef decus ident IDENT ; #endif /*)BUILD $(FILES) = {GREP GREDOC GRESUB GREVAL GRESDX GREAST} $(TKBOPTIONS) = { STACK = 2000 TASK = ...GRE } */ #include #include "grep.h" extern help() ; /* File: gredoc.c */ extern usage() ; extern compile() ; /* File: gresub.c */ extern match() ; extern cant() ; extern greval() ; /* File: greval.c */ extern astarm() ; /* File: greint.c */ extern astchk() ; int case_fl = FALSE ; /* case independant is default */ int sflag ; /* soundex match */ static int cflag ; static int fflag ; static int nflag ; static int vflag ; static int iflag ; static int nfile ; static int qflag ; int quit_it ; #ifdef decus extern FILE *$$flow ; #endif int debug = 0 ; /* Set for debug code */ char *pp ; static char file_name[81] ; char lbuf[LMAX] ; char tmp_buf[LMAX] ; char pbuf[NPATS][PMAX] ; /* stored patterns */ static char evalstr[40] ; /* boolian string to evaluste */ static char rv_on[] = { 27, '[', '7', 'm', 0 } ; /* reverse video on/off */ static char rv_off[] = { 27, '[', '0', 'm', 0 } ; /* ANSI terminals only */ char *pat_beg ; /* start & end of matched string */ char *pat_end ; main(argc, argv) char *argv[] ; { register char *p, *ept ; register int c ; register int i ; int gotpattern ; int npatterns ; int gpsave ; char *epsave ; FILE *f ; int gotcha ; /* $$flow = stderr ; */ if (argc <= 1) usage("No arguments") ; if (argc == 2 && argv[1][0] == '?' && argv[1][1] == 0) { help() ; return ; } nfile = argc-1 ; gotpattern = 0 ; npatterns = 0 ; ept = evalstr ; *ept++ = ' ' ; for (i=1 ; i < argc ; ++i) { p = argv[i] ; #ifdef vms /* * Hand-knit I/O redirection for vms -- why is this necessary ?? */ if (*p == '<') { freopen(&p[1], "r", stdin) ; argv[i] = NULL ; continue ; } if (*p == '>') { if (p[1] == '>') freopen(&p[2], "a", stdout) ; else freopen(&p[1], "w", stdout) ; argv[i] = NULL ; continue ; } #endif if (*p == '-') { do_opts(p) ; argv[i] = 0 ; --nfile ; } else if(strchr( "&+|~()! ", *p)) { /* boolian char? */ epsave = ept ; gpsave = gotpattern ; while((c = *p) != EOS) { p++ ; if(strchr( "&+|~()! ", c)) { /* ok, store it */ *ept++ = c ; if(strchr("&+|~", c)) --gotpattern ; /* ensure we get another pattern */ } else { /* oops, it's a match pattern */ ept = epsave ; gotpattern = gpsave ; break ; } } if(ept == epsave) { /* store match pattern */ if(sflag) { scompile(p, npatterns) ; } else { compile(p, &pbuf[npatterns][0]) ; } ++gotpattern ; *ept++ = npatterns + 'A' ; ++npatterns ; } argv[i] = 0 ; /* mark out argument */ --nfile ; } else if(gotpattern <= 0) { if(sflag) { scompile(p, npatterns) ; } else { compile(p, &pbuf[npatterns][0]) ; } ++gotpattern ; *ept++ = npatterns + 'A' ; ++npatterns ; argv[i] = 0 ; --nfile ; } } if(debug) printf("Evalstr:%s:\n", evalstr) ; if (gotpattern <= 0) usage("No pattern") ; if(!isatty(fileno(stdout))) { iflag = FALSE ; qflag = FALSE ; } if(qflag) astarm(qflag) ; if (nfile == 0) grep(stdin, 0) ; else { fflag = fflag ^ (nfile > 0) ; for (i=1 ; i < argc ; ++i) { if ((p = argv[i]) != NULL) { if ((f = fwild(p, "r")) == NULL) cant(p) ; else { gotcha = 0 ; while (fnext(f) != NULL) { fgetname(f, file_name) ; grep(f, file_name) ; gotcha = 1 ; } if (!gotcha) cant(p) ; } } } } } static do_opts(cp) char *cp ; { int c ; ++cp ; while (c = *cp++) { switch(tolower(c)) { case '?': help() ; break ; case 'c': ++cflag ; break ; case 'd': ++debug ; break ; case 'f': ++fflag ; break ; case 'n': ++nflag ; break ; case 'u': ++case_fl ; break ; case 'v': ++vflag ; break ; case 'q': ++qflag ; break ; case 's': ++sflag ; break ; case 'i': ++iflag ; break ; default: usage("Unknown flag") ; } } } static file(s) char *s ; { printf("File %s:\n", s) ; } badpat(message, source, stop) char *message ; /* Error message */ char *source ; /* Pattern start */ char *stop ; /* Pattern end */ { register int c ; fprintf(stderr, "-GREP-E-%s, pattern is\"%s\"\n", message, source) ; fprintf(stderr, "-GREP-E-Stopped at byte %d, '%c'\n", stop-source, stop[-1]) ; error("?GREP-E-Bad pattern\n") ; } static grep(fp, fn) FILE *fp ; /* File to process */ char *fn ; /* File name (for -f option) */ /* * Scan the file for the patterns in pbuf[] */ { register int count, m ; register char *lp ; int lno ; lno = 0 ; count = 0 ; quit_it = FALSE ; while (!astchk() && fgetss(lbuf, sizeof lbuf, fp)) { ++lno ; m = greval(evalstr) ; if (m ^ vflag) { ++count ; if (!cflag) { if (fflag && fn) { file(fn) ; fn = 0 ; } if (nflag) printf("%d\t", lno) ; if (iflag && m) { lp = lbuf ; while (lp < pat_beg) putchar(*lp++) ; printf("%s", rv_on) ; while (lp < pat_end) putchar(*lp++) ; printf("%s%s\n", rv_off, pat_end) ; } else { printf("%s\n", lbuf) ; } } } } if (cflag) { if (fflag && fn) file(fn) ; printf("%d\n", count) ; } }