/* ** JGREP.C - A utility to search files for text. ** ** public domain by Jerry Coffin ** ** Link with wildargs.obj (Borland), setargv.obj (Microsoft), _mainX.obj ** (Symantech/Zortech), or wildargX.obj (Watcom) which allows you to pass ** wildcards on the command line. */ #include #include #include #include #include #define LINELEN 1024 #define BUFSIZE 32767 #if defined(_QC) || defined(_MSC_VER) void _cdecl _setenvp(void) {} void _cdecl _nullcheck(void) {} #endif enum { FALSE, TRUE }; typedef unsigned char uchar; static size_t table[UCHAR_MAX+1]; static size_t len; static char *string=NULL; void init_find(char *new_string) { size_t i; if (NULL != string) free(string); string = strdup(new_string); len = strlen(string); for (i=0;i<=UCHAR_MAX;i++) table[i]=len; for (i=0;i0) pos+=shift; if (0==shift) { if (!memcmp(string,here=string2+pos-len+1,len)) return(here); else pos++; } } return NULL; } char *find_no_case(char *string2) { size_t limit = strlen(string2); size_t shift; size_t pos=len-1; char *here; while (pos < limit) { while( pos < limit && (shift=table[(uchar)toupper(string2[pos])])>0) { pos+=shift; } if (0==shift) { if (!memicmp(string,here=string2+pos-len+1,len)) return(here); else pos++; } } return NULL; } char *( *find) (char *)=find_case; int _cdecl main(int argc, char **argv) { int k, first; unsigned line; int line_numbers=FALSE, reverse=FALSE, print_file_name=FALSE; int no_case = TRUE; char line_buffer[LINELEN],*string,c; FILE *infile=NULL; static char buffer[BUFSIZE]; while ((c=argv[1][0])=='/' || c=='-') { switch(tolower(argv[1][1])) { case 'c': case 'y': no_case=FALSE; break; case 'f': print_file_name=TRUE; case 'n': line_numbers=TRUE; break; case 'v': reverse = TRUE; break; default: fprintf(stderr,"unknown switch -%c",argv[1][1]); } argv++; argc--; } if (argc < 3) { fprintf(stderr ,"\nsyntax: find [-c|y][-n][-v][-f] " "string filename ..." "\n\t-c | -y : make case significant ('c' != 'C')" "\n\t-n : number lines" "\n\t-f : place file name before lines ( forces -n)" "\n\t-v : print lines that don't match" "\n - by itself to read from standard input"); return(1); } string=argv[1]; if (no_case) { strupr(string); find=find_no_case; } init_find(string); for (k=2;k