📄 agrep.c
字号:
r2 = (r_odd | Next[r_odd|A[1]]) &r_NO_ERR;
A[2] = (Next[r_even] & CMask) | r2 | r1 ;
if(D == 2) goto Nextcharfile;
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 Nextcharfile;
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 Nextcharfile;
} /* if NOT Newline */
else {
j++;
if (DELIMITER) CurrentByteOffset -= D_length;
else CurrentByteOffset -= 1;
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 && (NEW_FILE || !POST_FILTER)) {
num_of_matched++;
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%s\n", CurrentFileName);
else {
int outindex;
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(CurrentFileName[outindex] != '\0'); outindex++) {
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
}
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer+1>=agrep_outlen)) {
OUTPUT_OVERFLOW;
free_buf(Text, buffer);
return -1;
}
else agrep_outbuffer[agrep_outpointer+outindex++] = '\n';
agrep_outpointer += outindex;
}
free_buf(Text, buffer);
NEW_FILE = OFF;
return 0;
}
if (-1 == r_output(buffer, i-1, end, j)) {free_buf(Text, buffer); return -1;}
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
free_buf(Text, buffer);
return 0; /* done */
}
}
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;
}
if (DELIMITER) CurrentByteOffset += 1*D_length;
else CurrentByteOffset += 1*1;
}
Nextcharfile:
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 Nextchar1file;
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 Nextchar1file;
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 Nextchar1file;
r1 = Init1 & A[4];
B[4] = (Next[A[4]] & CMask) | ((A[3] | Next[A[3] | B[3]])&r_NO_ERR) | r1 ;
goto Nextchar1file;
} /* if(NOT Newline) */
else {
j++;
if (DELIMITER) CurrentByteOffset -= D_length;
else CurrentByteOffset -= 1;
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 && (NEW_FILE || !POST_FILTER)) {
num_of_matched++;
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%s\n", CurrentFileName);
else {
int outindex;
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(CurrentFileName[outindex] != '\0'); outindex++) {
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
}
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer+1>=agrep_outlen)) {
OUTPUT_OVERFLOW;
free_buf(Text, buffer);
return -1;
}
else agrep_outbuffer[agrep_outpointer+outindex++] = '\n';
agrep_outpointer += outindex;
}
free_buf(Text, buffer);
NEW_FILE = OFF;
return 0;
}
if (-1 == r_output(buffer, i, end, j)) {free_buf(Text, buffer); return -1;}
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
free_buf(Text, buffer);
return 0; /* done */
}
}
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;
}
if (DELIMITER) CurrentByteOffset += 1*D_length;
else CurrentByteOffset += 1*1;
}
Nextchar1file:
i++;
CurrentByteOffset ++;
} /* while i < end */
strncpy(buffer, buffer+num_read, Maxline);
} /* while fill_buf() */
free_buf(Text, buffer);
return 0;
#if AGREP_POINTER
}
else {
num_read = agrep_inlen;
buffer = (CHAR *)agrep_inbuffer;
end = num_read;
/* buffer[end-1] = '\n';*/ /* at end of the text. */
/* buffer[0] = '\n';*/ /* in front of the text. */
i = 0;
/* An exact copy of the above RE_PROCESS_WHEN_DNOTZERO: the while-loop below */
while (i < end)
{
c = buffer[i++];
CurrentByteOffset ++;
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 Nextcharmem;
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 Nextcharmem;
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 Nextcharmem;
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 Nextcharmem;
} /* if NOT Newline */
else {
j++;
if (DELIMITER) CurrentByteOffset -= D_length;
else CurrentByteOffset -= 1;
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 && (NEW_FILE || !POST_FILTER)) {
num_of_matched++;
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%s\n", CurrentFileName);
else {
int outindex;
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(CurrentFileName[outindex] != '\0'); outindex++) {
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
}
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer+1>=agrep_outlen)) {
OUTPUT_OVERFLOW;
free_buf(Text, buffer);
return -1;
}
else agrep_outbuffer[agrep_outpointer+outindex++] = '\n';
agrep_outpointer += outindex;
}
free_buf(Text, buffer);
NEW_FILE = OFF;
return 0;
}
if (-1 == r_output(buffer, i-1, end, j)) {free_buf(Text, buffer); return -1;}
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
free_buf(Text, buffer);
return 0; /* done */
}
}
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;
}
if (DELIMITER) CurrentByteOffset += 1*D_length;
else CurrentByteOffset += 1*1;
}
Nextcharmem:
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 Nextchar1mem;
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 Nextchar1mem;
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 Nextchar1mem;
r1 = Init1 & A[4];
B[4] = (Next[A[4]] & CMask) | ((A[3] | Next[A[3] | B[3]])&r_NO_ERR) | r1 ;
goto Nextchar1mem;
} /* if(NOT Newline) */
else {
j++;
if (DELIMITER) CurrentByteOffset -= D_length;
else CurrentByteOffset -= 1;
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 && (NEW_FILE || !POST_FILTER)) {
num_of_matched++;
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%s\n", CurrentFileName);
else {
int outindex;
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(CurrentFileName[outindex] != '\0'); outindex++) {
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
}
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer+1>=agrep_outlen)) {
OUTPUT_OVERFLOW;
free_buf(Text, buffer);
return -1;
}
else agrep_outbuffer[agrep_outpointer+outindex++] = '\n';
agrep_outpointer += outindex;
}
free_buf(Text, buffer);
NEW_FILE = OFF;
return 0;
}
if (-1 == r_output(buffer, i, end, j)) {free_buf(Text, buffer); return -1;}
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
free_buf(Text, buffer);
return 0; /* done */
}
}
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;
}
if (DELIMITER) CurrentByteOffset += 1*D_length;
else CurrentByteOffset += 1*1;
}
Nextchar1mem:
i++;
CurrentByteOffset ++;
} /* while i < end */
return 0;
}
#endif /*AGREP_POINTER*/
} /* re */
int r_output (buffer, i, end, j)
int i, end, j;
CHAR *buffer;
{
int PRINTED = 0;
int bp;
if(i >= end) return 0;
if ((j < 1) || (CurrentByteOffset < 0)) return 0;
num_of_matched++;
if(COUNT) return 0;
if(FNAME && (NEW_FILE || !POST_FILTER)) {
char nextchar = (POST_FILTER == ON)?'\n':' ';
char *prevstring = (POST_FILTER == ON)?"\n":"";
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%s%s:%c", prevstring, CurrentFileName, nextchar);
else {
int outindex;
if (prevstring[0] != '\0') {
if(agrep_outpointer + 1 >= agrep_outlen) {
OUTPUT_OVERFLOW;
return -1;
}
else agrep_outbuffer[agrep_outpointer ++] = prevstring[0];
}
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(CurrentFileName[outindex] != '\0'); outindex++) {
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
}
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer+2>=agrep_outlen)) {
OUTPUT_OVERFLOW;
return -1;
}
else {
agrep_outbuffer[agrep_outpointer+outindex++] = ':';
agrep_outbuffer[agrep_outpointer+outindex++] = nextchar;
}
agrep_outpointer += outindex;
}
NEW_FILE = OFF;
PRINTED = 1;
}
bp = i-1;
while ((buffer[bp] != '\n') && (bp > 0)) bp--;
if(LINENUM) {
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%d: ", j-1);
else {
char s[32];
int outindex;
sprintf(s, "%d: ", j-1);
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(s[outindex] != '\0'); outindex++) {
agrep_outbuffer[agrep_outpointer+outindex] = s[outindex];
}
if (s[outindex] != '\0') {
OUTPUT_OVERFLOW;
return -1;
}
agrep_outpointer += outindex;
}
PRINTED = 1;
}
if(BYTECOUNT) {
if (agrep_finalfp != NULL)
fprintf(agrep_finalfp, "%d= ", CurrentByteOffset);
else {
char s[32];
int outindex;
sprintf(s, "%d= ", CurrentByteOffset);
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
(s[outindex] != '\0'); ou
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -