jgrep.c
来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 180 行
C
180 行
/*** JGREP.C - A utility to search files for text.**** public domain by Jerry Coffin**** Link with wildargs.obj (Borland), setargv.obj (Microsoft), _mainX.obj ** (Symantec/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>#include "extkword.h"#define LINELEN 1024#define BUFSIZE 32767#if defined(_QC) || defined(_MSC_VER) void CDECL _setenvp(void) {} void CDECL _nullcheck(void) {}#endifenum { 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 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 (argc > 1 && (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;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?