📄 main.c
字号:
B[1] = ((r2 | Next[r0>>hh] | Next1[r0&LL])&r_NO_ERR) | r1 ; if(D == 1) goto Nextchar1; r2 = A[2]; r1 = Init1 & r2; r0 = B[1] | r3; B[2] = ((r3 | Next[r0>>hh] | Next1[r0&LL])&r_NO_ERR) | r1 ; if(D == 2) goto Nextchar1; r3 = A[3]; r1 = Init1 & r3; r0 = B[2] | r2; B[3] = ((r2 | Next[r0>>hh] | Next1[r0&LL])&r_NO_ERR) | r1 ; if(D == 3) goto Nextchar1; r2 = A[4]; r1 = Init1 & r2; r0 = B[3] | r3; B[4] = ((r3 | Next[r0>>hh] | Next1[r0&LL])&r_NO_ERR) | r1 ; if(D == 4) goto Nextchar1; } } /* if(NOT Newline) */ else { j++; r1 = Init1 & A[D]; /* match against endofline */ B[D] = ((Next[A[D]>>hh] | Next1[A[D]&LL]) & CMask) | r1; if(TAIL) B[D] = ( Next[B[D]>>hh] | Next1[B[D]&LL] ) | B[D]; /* epsilon move */ if(( B[D] & 1 ) ^ INVERSE) { if(FILENAMEONLY) { num_of_matched++; printf("%s\n", CurrentFileName); return; } r_output(buffer, i, end, j); } for(k=0; k<=D; k++) A[k] = Init0; r1 = Init1 & A[0]; B[0] = ((Next[A[0]>>hh] | Next1[A[0]&LL]) & CMask) | r1; for(k=1; k<=D; k++) { r3 = A[k]; r1 = Init1 & r3; r2 = A[k-1] | B[k-1]; B[k] = ((Next[r3>>hh] | Next1[r3&LL]) & CMask) | ((A[k-1] | Next[r2>>hh] | Next1[r2&LL]) & r_NO_ERR) | r1; } }Nextchar1: i=i+1; } /* while */ strncpy(buffer, buffer+num_read, Maxline); } /* while */ return;} /* re1 */re(Text, M, D)int Text, M, D;{ register unsigned i, c, r1, r2, r3, CMask, k, Newline, Init0, Init1, end; register unsigned r_even, r_odd, r_NO_ERR ; unsigned RMask[MAXSYM]; unsigned A[MaxRerror+1], B[MaxRerror+1]; int num_read, j=0, bp, lasti, base, ResidueSize; int FIRST_TIME; /* Flag */ base = WORD - M; k = 2*exponen(M); if(FIRST_IN_RE) { compute_next(M, Next, Next1); FIRST_IN_RE = 0; } for(i=0; i< MAXSYM; i++) RMask[i] = Mask[i]; r_NO_ERR = NO_ERR_MASK; Newline = '\n'; lasti = Maxline; Init0 = Init[0] = Bit[base]; if(HEAD) Init0 = Init[0] = Init0 | Bit[base+1] ; for(i=1; i<= D; i++) Init[i] = Init[i-1] | Next[Init[i-1]]; /* can be out? */ Init1 = Init0 | 1; r2 = r3 = Init0; for(k=0; k<= D; k++) { A[k] = B[k] = Init[0]; } /* can be out? */ FIRST_TIME = ON; if ( D == 0 ) { while ((num_read = read(Text, buffer + Maxline, BlockSize)) > 0) { i=Maxline; end = Maxline + num_read ; if((num_read < BlockSize)&&buffer[end-1] != '\n') buffer[end] = '\n'; if(FIRST_TIME) { buffer[i-1] = '\n'; i--; FIRST_TIME = 0; } while (i < end) { c = buffer[i++]; CMask = RMask[c]; if(c != Newline) { r1 = Init1 & r3; r2 = (Next[r3] & CMask) | r1; } else { r1 = Init1 & r3; /* match against '\n' */ r2 = Next[r3] & CMask | r1; j++; if(TAIL) r2 = Next[r2] | r2 ; /* epsilon move */ if(( r2 & 1) ^ INVERSE) { if(FILENAMEONLY) { num_of_matched++; printf("%s\n", CurrentFileName); return; } r_output(buffer, i-1, end, j); } lasti = i - 1; r3 = Init0; r2 = (Next[r3] & CMask) | Init0; } c = buffer[i++]; CMask = RMask[c]; if(c != Newline) { r1 = Init1 & r2; r3 = (Next[r2] & CMask) | r1; } else { j++; r1 = Init1 & r2; /* match against endofline */ r3 = Next[r2] & CMask | r1; if(TAIL) r3 = Next[r3] | r3; if(( r3 & 1) ^ INVERSE) { if(FILENAMEONLY) { num_of_matched++; printf("%s\n", CurrentFileName); return; } r_output(buffer, i-1, end, j); } lasti = i - 1; r2 = Init0; r3 = (Next[r2] & CMask) | Init0; /* match the newline */ } } /* while */ ResidueSize = Maxline + num_read - lasti; if(ResidueSize > Maxline) { ResidueSize = Maxline; } strncpy(buffer+Maxline-ResidueSize, buffer+lasti, ResidueSize); lasti = Maxline - ResidueSize; } /* while */ return; } /* end if(D==0) */ while ((num_read = read(Text, buffer + Maxline, BlockSize)) > 0) { i=Maxline; end = Maxline+num_read; if((num_read < BlockSize) && buffer[end-1] != '\n') buffer[end] = '\n'; if(FIRST_TIME) { buffer[i-1] = '\n'; i--; FIRST_TIME = 0; } while (i < end) { c = buffer[i++]; CMask = RMask[c]; if (c != Newline) { r_even = B[0]; r1 = Init1 & r_even; A[0] = (Next[r_even] & CMask) | r1; r_odd = B[1]; r1 = Init1 & r_odd; r2 = (r_even | Next[r_even|A[0]]) &r_NO_ERR; A[1] = (Next[r_odd] & CMask) | r2 | r1 ; if(D == 1) goto Nextchar; r_even = B[2]; r1 = Init1 & r_even; r2 = (r_odd | Next[r_odd|A[1]]) &r_NO_ERR; A[2] = (Next[r_even] & CMask) | r2 | r1 ; if(D == 2) goto Nextchar; r_odd = B[3]; r1 = Init1 & r_odd; r2 = (r_even | Next[r_even|A[2]]) &r_NO_ERR; A[3] = (Next[r_odd] & CMask) | r2 | r1 ; if(D == 3) goto Nextchar; r_even = B[4]; r1 = Init1 & r_even; r2 = (r_odd | Next[r_odd|A[3]]) &r_NO_ERR; A[4] = (Next[r_even] & CMask) | r2 | r1 ; goto Nextchar; } /* if NOT Newline */ else { j++; r1 = Init1 & B[D]; /* match endofline */ A[D] = (Next[B[D]] & CMask) | r1; if(TAIL) A[D] = Next[A[D]] | A[D]; if((A[D] & 1) ^ INVERSE ) { if(FILENAMEONLY) { num_of_matched++; printf("%s\n", CurrentFileName); return; } r_output(buffer, i-1, end, j); } for(k=0; k<= D; k++) { A[k] = B[k] = Init[k]; } r1 = Init1 & B[0]; A[0] = (Next[B[0]] & CMask) | r1; for(k=1; k<= D; k++) { r1 = Init1 & B[k]; r2 = (B[k-1] | Next[A[k-1]|B[k-1]]) &r_NO_ERR; A[k] = (Next[B[k]] & CMask) | r1 | r2; } }Nextchar: c = buffer[i]; CMask = RMask[c]; if(c != Newline) { r1 = Init1 & A[0]; B[0] = (Next[A[0]] & CMask) | r1; r1 = Init1 & A[1]; B[1] = (Next[A[1]] & CMask) | ((A[0] | Next[A[0] | B[0]]) & r_NO_ERR) | r1 ; if(D == 1) goto Nextchar1; r1 = Init1 & A[2]; B[2] = (Next[A[2]] & CMask) | ((A[1] | Next[A[1] | B[1]]) &r_NO_ERR) | r1 ; if(D == 2) goto Nextchar1; r1 = Init1 & A[3]; B[3] = (Next[A[3]] & CMask) | ((A[2] | Next[A[2] | B[2]])&r_NO_ERR) | r1 ; if(D == 3) goto Nextchar1; r1 = Init1 & A[4]; B[4] = (Next[A[4]] & CMask) | ((A[3] | Next[A[3] | B[3]])&r_NO_ERR) | r1 ; goto Nextchar1; } /* if(NOT Newline) */ else { j++; r1 = Init1 & A[D]; /* match endofline */ B[D] = (Next[A[D]] & CMask) | r1; if(TAIL) B[D] = Next[B[D]] | B[D]; if((B[D] & 1) ^ INVERSE ) { if(FILENAMEONLY) { num_of_matched++; printf("%s\n", CurrentFileName); return; } r_output(buffer, i, end, j); } for(k=0; k<= D; k++) { A[k] = B[k] = Init[k]; } r1 = Init1 & A[0]; B[0] = (Next[A[0]] & CMask) | r1; for(k=1; k<= D; k++) { r1 = Init1 & A[k]; r2 = (A[k-1] | Next[A[k-1]|B[k-1]])&r_NO_ERR; B[k] = (Next[A[k]] & CMask) | r1 | r2; } }Nextchar1: i++; } /* while i < end */ strncpy(buffer, buffer+num_read, Maxline); } /* while read() */ return;} /* re */r_output (buffer, i, end, j) int i, end, j; CHAR *buffer;{int bp; if(i >= end) return; num_of_matched++; if(COUNT) return; if(FNAME) printf("%s: ", CurrentFileName); bp = i-1; while ((buffer[bp] != '\n') && (bp > 0)) bp--; if(LINENUM) printf("%d: ", j); if(buffer[bp] != '\n') bp = Maxline-1; bp++; while (bp <= i ) putchar(buffer[bp++]);}main(argc, argv)int argc; char *argv[];{ int N, M, D=0, fp, fd, i, j; char c; int filetype; unsigned char Pattern[MAXPAT], OldPattern[MAXPAT], temp[MAXPAT]; initial_value(); strcpy(Progname, argv[0]); if (argc < 2) usage(); Pattern[0] = '\0'; while(--argc > 0 && (*++argv)[0] == '-') { c = *(argv[0]+1); switch(c) { case 'c' : COUNT = ON; /* output the # of matched */ break; case 's' : SILENT = ON; /* silent mode */ break; case 'p' : I = 0; /* insertion cost is 0 */ break; case 'x' : WHOLELINE = ON; /* match the whole line */ if(WORDBOUND) { fprintf(stderr, "%s: illegal option combination\n", Progname); exit(2); } break; case 'L' : break; case 'd' : DELIMITER = ON; /* user defines delimiter */ if(argc <= 1) usage(); if (argv[0][2] == '\0') {/* space after -d option */ argv++; if ((D_length = strlen(argv[0])) > MaxDelimit) { fprintf(stderr, "%s: delimiter pattern too long\n", Progname); exit(2); } D_pattern[0] = '<'; strcpy(D_pattern+1, argv[0]); argc--; } else { if ((D_length = strlen(argv[0]+2)) > MaxDelimit) { fprintf(stderr, "%s: delimiter pattern too long\n", Progname); exit(2); } D_pattern[0] = '<'; strcpy(D_pattern+1, argv[0]+2); } /* else */ strcat(D_pattern, ">; "); D_length++; /* to count ';' as one */ break; case 'e' : argc--; if(argc == 0) { fprintf(stderr, "%s: the pattern should immediately follow the -e option\n", Progname); usage(); } if((++argv)[0][0] == '-') { Pattern[0] = '\\'; strcat(Pattern, (argv)[0]); } else strcat(Pattern, argv[0]); break; case 'f' : PAT_FILE = ON; argv++; argc--; if((fp = open(argv[0], 0)) < 0) { fprintf(stderr, "%s: Can't open pattern file %s\n", Progname, argv[0]); exit(2); } break; case 'h' : NOFILENAME = ON; break; case 'i' : NOUPPER = ON; break; case 'k' : argc--; if(argc == 0) { fprintf(stderr, "%s: the pattern should immediately follow the -k option\n", Progname); usage(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -