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

📄 bitap.c

📁 agrep
💻 C
字号:
/* Copyright (c) 1991 Sun Wu and Udi Manber.  All Rights Reserved. *//* if the pattern is not simple fixed pattern, then after preprocessing *//* and generating the masks, the program goes here. four cases:  1.     */ /* the pattern is simple regular expression and no error, then do the   *//* matching here.  2. the pattern is simple regular expression and      *//* unit cost errors are allowed: then go to asearch().                  *//* 3. the pattern is simple regular expression, and the edit cost is    *//* not uniform, then go to asearch1().                                  *//* if the pattern is regular expression then go to re() if M < 14,      *//* else go to re1()                                                     *//* input parameters: old_D_pat: delimiter pattern.                      *//* fd, input file descriptor, M: size of pattern, D: # of errors.       */#include "agrep.h"extern unsigned Init1, D_endpos, endposition, Init[], Mask[], Bit[];extern int DELIMITER, FILENAMEONLY, D_length, I, AND, REGEX, JUMP, INVERSE; extern char D_pattern[];extern int TRUNCATE, DD, S;extern char Progname[], CurrentFileName[];extern int num_of_matched;/* bitap dispatches job */bitap(old_D_pat, Pattern, fd, M, D)char old_D_pat[], *Pattern;  int fd, M, D;  {char c;  register unsigned r1, r2, r3, CMask, i;register unsigned end, endpos, r_Init1;register unsigned D_Mask;int  ResidueSize , FIRSTROUND, lasti, print_end, j, num_read;int  k;char buffer[Max_record+Max_record+BlockSize];  D_length = strlen(old_D_pat);  for(i=0; i<D_length; i++) if(old_D_pat[i] == '^' || old_D_pat[i] == '$')                               old_D_pat[i] = '\n';  if (REGEX) {       if (D > 4) {          fprintf(stderr, "%s: the maximum number of erorrs allowed for full regular expression is 4\n", Progname);          exit(2);      }      if (M <= SHORTREG) { re(fd, M, D);   /* SUN: need to find a even point */                      return; }      else { re1(fd, M, D);              return; }  }     if (D > 0 && JUMP == ON)      { asearch1(old_D_pat, fd, D); return; }  if (D > 0)      { asearch(old_D_pat, fd, D); return; }  if(I == 0) Init1 = 037777777777;  j=0;  lasti = Max_record;  buffer[Max_record-1] = '\n';  r_Init1 = Init1;  r1 = r2 = r3 = Init[0];  endpos = D_endpos;    buffer[Max_record-1] = '\n';  D_Mask = D_endpos;  for(i=1 ; i<D_length; i++) D_Mask = (D_Mask << 1) | D_Mask;  D_Mask = ~D_Mask;  FIRSTROUND = ON;  while ((num_read = fill_buf(fd, buffer + Max_record, Max_record)) > 0)  {    i=Max_record; end = Max_record + num_read;     if(FIRSTROUND) {  i = Max_record - 1 ;			if(DELIMITER) {				for(k=0; k<D_length; k++) {					if(old_D_pat[k] != buffer[Max_record+k]) 						break;				}				if(k>=D_length) j--;			}                      FIRSTROUND = OFF;  }    if(num_read < BlockSize) {                      strncpy(buffer+Max_record+num_read, old_D_pat, D_length);                      end = end + D_length;                      buffer[end] = '\0';    }    while (i < end)    {        c = buffer[i++];        CMask = Mask[c];              r1 = r_Init1 & r3;              r2 = (( r3 >> 1 ) & CMask) | r1;        if ( r2 & endpos ) {           j++;           if(((AND == 1) && ((r2 & endposition) == endposition)) ||                           ((AND == 0) && (r2 & endposition)) ^ INVERSE )               {                  if(FILENAMEONLY) {                    num_of_matched++;                    printf("%s\n", CurrentFileName);                    return; }                 print_end = i - D_length - 1;                 if(!(lasti >= Max_record+num_read - 1))                    output(buffer, lasti, print_end, j);                }           lasti = i - D_length;            TRUNCATE = OFF;           r2 = r3 = r1 = Init[0];           r1 = r_Init1 & r3;           r2 = ((( r2 >> 1) & CMask) | r1 ) & D_Mask;        }        c = buffer[i++];        CMask = Mask[c];              r1 = r_Init1 & r2;              r3 = (( r2 >> 1 ) & CMask) | r1;         if ( r3 & endpos ) {           j++;           if(((AND == 1) && ((r3 & endposition) == endposition)) ||                           ((AND == 0) && (r3 & endposition)) ^ INVERSE )               {                  if(FILENAMEONLY) {                    num_of_matched++;                    printf("%s\n", CurrentFileName);                    return; }                 print_end = i - D_length - 1;                 if(!(lasti >= Max_record+num_read - 1))                    output(buffer, lasti, print_end, j);               }           lasti = i - D_length ;           TRUNCATE = OFF;           r2 = r3 = r1 = Init[0];            r1 = r_Init1 & r2;           r3 = ((( r2 >> 1) & CMask) | r1 ) & D_Mask;       }       }    ResidueSize = num_read + Max_record - lasti;    if(ResidueSize > Max_record) {            ResidueSize = Max_record;            TRUNCATE = ON;       }    strncpy(buffer+Max_record-ResidueSize, buffer+lasti, ResidueSize);    lasti = Max_record - ResidueSize;    if(lasti < 0) {       lasti = 1;    }   }  return;}fill_buf(fd, buf, record_size)int fd, record_size; unsigned char *buf;{int num_read=1;int total_read=0;	while(total_read < record_size && num_read > 0) {		num_read = read(fd, buf+total_read, 4096);		total_read = total_read + num_read;	}	return(total_read);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -