⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 agrep
💻 C
📖 第 1 页 / 共 3 页
字号:
              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 + -