summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/jgrep.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/jgrep.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/jgrep.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/SNIP/jgrep.c b/reference/C/CONTRIB/SNIP/jgrep.c
new file mode 100755
index 0000000..9efcb29
--- /dev/null
+++ b/reference/C/CONTRIB/SNIP/jgrep.c
@@ -0,0 +1,178 @@
+/*
+** 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+
+#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;i<len;i++)
+ table[string[i]]=len-i-1;
+}
+
+char *find_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)string2[pos]])>0)
+ 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<argc;k++)
+ {
+ if (infile != NULL)
+ fclose(infile);
+ if ((infile=fopen(argv[k],"r"))==NULL)
+ continue;
+ first=TRUE;
+ setvbuf(infile,buffer,_IOFBF,BUFSIZE);
+ line=0;
+ while (fgets(line_buffer,LINELEN,infile)!=NULL)
+ {
+ line ++;
+ if ((NULL!=find(line_buffer)) ^ reverse)
+ {
+ if (first && !print_file_name )
+ {
+ printf("\n\t%s:\n",argv[k]);
+ first = FALSE;
+ }
+ if (print_file_name)
+ printf(" %s ",argv[k]);
+ if (line_numbers)
+ printf("%d:",line);
+ printf("%s",line_buffer);
+ }
+ }
+ }
+ return 0;
+}