1
/* Copyright (c) 1991 Sun Wu and Udi Manber. All Rights Reserved. */
1
/* Copyright (c) 1994 Sun Wu, Udi Manber, Burra Gopal. All Rights Reserved. */
4
5
extern unsigned Init1, Init[], Mask[], endposition, D_endpos;
5
6
extern unsigned NO_ERR_MASK;
6
extern int TRUNCATE, DELIMITER, AND, I, S, DD, INVERSE, FILENAMEONLY ;
7
extern int TRUNCATE, DELIMITER, AND, I, S, DD, INVERSE, FILENAMEONLY, PRINTFILETIME ;
7
8
extern char CurrentFileName[];
8
extern int num_of_matched;
9
extern long CurrentFileTime;
10
extern int num_of_matched, prev_num_of_matched;
12
extern int CurrentByteOffset;
13
extern CHAR *agrep_inbuffer;
14
extern int agrep_inlen;
16
extern FILE *agrep_finalfp;
17
extern CHAR *agrep_outbuffer;
18
extern int agrep_outlen;
19
extern int agrep_outpointer;
21
extern int NEW_FILE, POST_FILTER;
23
extern int LIMITOUTPUT, LIMITPERFILE;
11
26
asearch1(old_D_pat, Text, D)
12
char old_D_pat[]; int Text; register unsigned D;
14
register unsigned end, i, r1, r2, r3, r4, r5, CMask, D_Mask, Init0, k, endpos;
15
register unsigned r_NO_ERR;
16
unsigned A[MaxError*2+1], B[MaxError*2+1];
17
int D_length, ResidueSize, lasti, num_read, FIRSTROUND, j=0;
18
char buffer[BlockSize+Max_record+1];
20
if(I == 0) Init1 = 037777777777;
24
D_length = strlen(old_D_pat);
25
buffer[Max_record-1] = '\n';
28
r_NO_ERR = NO_ERR_MASK;
31
for(i=1 ; i<D_length; i++) D_Mask = (D_Mask << 1) | D_Mask;
34
r3 = D+1; r4 = D*2; /* to make sure in register */
35
for(k=0; k < D; k++) A[k] = B[k] = 0;
36
for(k=D; k <= r4; k++) A[k] = B[k] = Init[0];
38
while ((num_read = fill_buf(Text, buffer + Max_record, Max_record)) > 0)
40
i=Max_record; end = Max_record + num_read;
41
if(FIRSTROUND) { i = Max_record -1 ;
43
for(k=0; k<D_length; k++) {
44
if(old_D_pat[k] != buffer[Max_record+k]) break;
49
if(num_read < BlockSize) {
50
strncpy(buffer+Max_record+num_read, old_D_pat, D_length);
56
CMask = Mask[buffer[i++]];
58
A[D] = ((B[D] >> 1) & CMask ) | r1;
59
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
63
A[k] = ((r5 >> 1) & CMask) | B[k-I] | (((A[k-DD] | B[k-S]) >>1) & r_NO_ERR) | r1 ;
67
if(((AND == 1) && ((A[D*2] & endposition) == endposition)) || ((AND == 0) && (A[D*2] & endposition)) ^ INVERSE )
71
printf("%s\n", CurrentFileName);
73
if(lasti < Max_record + num_read)
74
output(buffer, lasti, i-D_length-1, j);
78
for(k = D; k <= r4 ; k++) A[k] = B[k] = Init[0];
80
A[D] = (((B[D] >> 1) & CMask ) | r1) & D_Mask;
81
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
85
A[k] = ((r5 >> 1) & CMask) | B[k-I] | (((A[k-DD] | B[k-S]) >>1) & r_NO_ERR) | r1 ;
87
} /* end if (A[D]&endpos) */
88
CMask = Mask[buffer[i++]];
90
B[D] = ((A[D] >> 1) & CMask) | r1;
91
for(k = r3; k <= r4; k++)
94
B[k] = ((A[k] >> 1) & CMask) | A[k-I] | (((B[k-DD] | A[k-S]) >>1)&r_NO_ERR) | r1 ;
98
if(((AND == 1) && ((B[r4] & endposition) == endposition)) || ((AND == 0) && (B[r4] & endposition)) ^ INVERSE )
101
printf("%s\n", CurrentFileName);
103
if(lasti < Max_record + num_read)
104
output(buffer, lasti, i-D_length-1, j);
108
for(k=D; k <= r4; k++) A[k] = B[k] = Init[0];
110
B[D] = (((A[D] >> 1) & CMask ) | r1) & D_Mask;
111
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
115
B[k] = ((r5 >> 1) & CMask) | A[k-I] | (((B[k-DD] | A[k-S]) >>1) & r_NO_ERR) | r1 ;
117
} /* end if (B[D]&endpos) */
119
ResidueSize = Max_record + num_read - lasti;
120
if(ResidueSize > Max_record) {
121
ResidueSize = Max_record;
124
strncpy(buffer+Max_record-ResidueSize, buffer+lasti, ResidueSize);
125
lasti = Max_record - ResidueSize;
126
if(lasti < 0) lasti = 1;
127
if(num_read < BlockSize) lasti = Max_record;
31
register unsigned end, i, r1, r3, r4, r5, CMask, D_Mask, k, endpos;
32
register unsigned r_NO_ERR;
33
unsigned A[MaxError*2+1], B[MaxError*2+1];
34
int D_length, ResidueSize, lasti, num_read, FIRSTROUND=1, j=0;
36
/* CHAR *tempbuf = NULL;*/ /* used only when Text == -1 */
38
if(I == 0) Init1 = (unsigned)037777777777;
42
D_length = strlen(old_D_pat);
44
r_NO_ERR = NO_ERR_MASK;
47
for(i=1; i<D_length; i++) D_Mask = (D_Mask << 1) | D_Mask;
51
r4 = D*2; /* to make sure in register */
52
for(k=0; k < D; k++) A[k] = B[k] = 0;
53
for(k=D; k <= r4; k++) A[k] = B[k] = Init[0];
57
#endif /*AGREP_POINTER*/
59
alloc_buf(Text, &buffer, BlockSize+Max_record+1);
60
buffer[Max_record-1] = '\n';
62
while ((num_read = fill_buf(Text, buffer + Max_record, BlockSize)) > 0)
65
end = Max_record + num_read;
69
for(k=0; k<D_length; k++) {
70
if(old_D_pat[k] != buffer[Max_record+k]) break;
76
if(num_read < BlockSize) {
77
strncpy(buffer+Max_record+num_read, old_D_pat, D_length);
82
/* ASEARCH1_PROCESS: the while-loop below */
85
CMask = Mask[buffer[i++]];
88
A[D] = ((B[D] >> 1) & CMask ) | r1;
89
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
93
A[k] = ((r5 >> 1) & CMask) | B[k-I] | (((A[k-DD] | B[k-S]) >>1) & r_NO_ERR) | r1 ;
97
if (DELIMITER) CurrentByteOffset -= D_length;
98
else CurrentByteOffset -= 1;
99
if(((AND == 1) && ((A[D*2] & endposition) == endposition)) || ((AND == 0) && (A[D*2] & endposition)) ^ INVERSE )
101
if(FILENAMEONLY && (NEW_FILE || !POST_FILTER)) {
104
if (agrep_finalfp != NULL)
105
fprintf(agrep_finalfp, "%s", CurrentFileName);
108
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
109
(CurrentFileName[outindex] != '\0'); outindex++) {
110
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
112
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
114
free_buf(Text, buffer);
117
agrep_outpointer += outindex;
120
char *s = aprint_file_time(CurrentFileTime);
121
if (agrep_finalfp != NULL)
122
fprintf(agrep_finalfp, "%s", s);
125
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
126
(s[outindex] != '\0'); outindex++) {
127
agrep_outbuffer[agrep_outpointer+outindex] = s[outindex];
129
if ((s[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
131
free_buf(Text, buffer);
134
agrep_outpointer += outindex;
137
if (agrep_finalfp != NULL)
138
fprintf(agrep_finalfp, "\n");
140
if (agrep_outpointer+1>=agrep_outlen) {
142
free_buf(Text, buffer);
145
else agrep_outbuffer[agrep_outpointer++] = '\n';
150
memcpy(buffer+end-D_length, tempbuf, D_length+1);
153
free_buf(Text, buffer);
157
if((Text != -1) && !(lasti >= Max_record + num_read - 1)) {
158
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
160
else if ((Text == -1) && !(lasti >= num_read)) {
161
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
163
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
164
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
165
free_buf(Text, buffer);
169
lasti = i - D_length;
171
for(k = D; k <= r4 ; k++) A[k] = B[k] = Init[0];
173
A[D] = (((B[D] >> 1) & CMask ) | r1) & D_Mask;
174
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
178
A[k] = ((r5 >> 1) & CMask) | B[k-I] | (((A[k-DD] | B[k-S]) >>1) & r_NO_ERR) | r1 ;
180
if (DELIMITER) CurrentByteOffset += 1*D_length;
181
else CurrentByteOffset += 1*1;
182
} /* end if (A[D]&endpos) */
183
CMask = Mask[buffer[i++]];
184
CurrentByteOffset ++;
186
B[D] = ((A[D] >> 1) & CMask) | r1;
187
for(k = r3; k <= r4; k++)
190
B[k] = ((A[k] >> 1) & CMask) | A[k-I] | (((B[k-DD] | A[k-S]) >>1)&r_NO_ERR) | r1 ;
194
if (DELIMITER) CurrentByteOffset -= D_length;
195
else CurrentByteOffset -= 1;
196
if(((AND == 1) && ((B[r4] & endposition) == endposition)) || ((AND == 0) && (B[r4] & endposition)) ^ INVERSE )
198
if(FILENAMEONLY && (NEW_FILE || !POST_FILTER)) {
201
if (agrep_finalfp != NULL)
202
fprintf(agrep_finalfp, "%s", CurrentFileName);
205
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
206
(CurrentFileName[outindex] != '\0'); outindex++) {
207
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
209
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
211
free_buf(Text, buffer);
214
agrep_outpointer += outindex;
217
char *s = aprint_file_time(CurrentFileTime);
218
if (agrep_finalfp != NULL)
219
fprintf(agrep_finalfp, "%s", s);
222
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
223
(s[outindex] != '\0'); outindex++) {
224
agrep_outbuffer[agrep_outpointer+outindex] = s[outindex];
226
if ((s[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
228
free_buf(Text, buffer);
231
agrep_outpointer += outindex;
234
if (agrep_finalfp != NULL)
235
fprintf(agrep_finalfp, "\n");
237
if (agrep_outpointer+1>=agrep_outlen) {
239
free_buf(Text, buffer);
242
else agrep_outbuffer[agrep_outpointer++] = '\n';
247
memcpy(buffer+end-D_length, tempbuf, D_length+1);
250
free_buf(Text, buffer);
254
if((Text != -1) && !(lasti >= Max_record + num_read - 1)) {
255
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
257
else if ((Text == -1) && !(lasti >= num_read)) {
258
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
260
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
261
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
262
free_buf(Text, buffer);
268
for(k=D; k <= r4; k++) A[k] = B[k] = Init[0];
270
B[D] = (((A[D] >> 1) & CMask ) | r1) & D_Mask;
271
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
275
B[k] = ((r5 >> 1) & CMask) | A[k-I] | (((B[k-DD] | A[k-S]) >>1) & r_NO_ERR) | r1 ;
277
if (DELIMITER) CurrentByteOffset += 1*D_length;
278
else CurrentByteOffset += 1*1;
279
} /* end if (B[D]&endpos) */
282
ResidueSize = Max_record + num_read - lasti;
283
if(ResidueSize > Max_record) {
284
ResidueSize = Max_record;
287
strncpy(buffer+Max_record-ResidueSize, buffer+lasti, ResidueSize);
288
lasti = Max_record - ResidueSize;
289
if(lasti < 0) lasti = 1;
290
if(num_read < BlockSize) lasti = Max_record;
292
free_buf(Text, buffer);
298
/* if (DELIMITER) tempbuf = (CHAR*)malloc(D_length + 1); */
299
buffer = (CHAR *)agrep_inbuffer;
300
num_read = agrep_inlen;
302
/* buffer[end-1] = '\n';*/ /* at end of the text. */
303
/* buffer[0] = '\n';*/ /* in front of the text. */
307
for(k=0; k<D_length; k++) {
308
if(old_D_pat[k] != buffer[k]) break;
312
memcpy(tempbuf, buffer+end, D_length+1);
313
strncpy(buffer+end, old_D_pat, D_length);
314
buffer[end+D_length] = '\0';
315
end = end + D_length;
319
/* An exact copy of the above ASEARCH1_PROCESS: the while-loop below */
322
CMask = Mask[buffer[i++]];
323
CurrentByteOffset ++;
325
A[D] = ((B[D] >> 1) & CMask ) | r1;
326
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
330
A[k] = ((r5 >> 1) & CMask) | B[k-I] | (((A[k-DD] | B[k-S]) >>1) & r_NO_ERR) | r1 ;
334
if (DELIMITER) CurrentByteOffset -= D_length;
335
else CurrentByteOffset -= 1;
336
if(((AND == 1) && ((A[D*2] & endposition) == endposition)) || ((AND == 0) && (A[D*2] & endposition)) ^ INVERSE )
338
if(FILENAMEONLY && (NEW_FILE || !POST_FILTER)) {
341
if (agrep_finalfp != NULL)
342
fprintf(agrep_finalfp, "%s", CurrentFileName);
345
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
346
(CurrentFileName[outindex] != '\0'); outindex++) {
347
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
349
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
351
free_buf(Text, buffer);
354
agrep_outpointer += outindex;
357
char *s = aprint_file_time(CurrentFileTime);
358
if (agrep_finalfp != NULL)
359
fprintf(agrep_finalfp, "%s", s);
362
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
363
(s[outindex] != '\0'); outindex++) {
364
agrep_outbuffer[agrep_outpointer+outindex] = s[outindex];
366
if ((s[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
368
free_buf(Text, buffer);
371
agrep_outpointer += outindex;
374
if (agrep_finalfp != NULL)
375
fprintf(agrep_finalfp, "\n");
377
if (agrep_outpointer+1>=agrep_outlen) {
379
free_buf(Text, buffer);
382
else agrep_outbuffer[agrep_outpointer++] = '\n';
387
memcpy(buffer+end-D_length, tempbuf, D_length+1);
390
free_buf(Text, buffer);
394
if((Text != -1) && !(lasti >= Max_record + num_read - 1)) {
395
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
397
else if ((Text == -1) && !(lasti >= num_read)) {
398
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
400
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
401
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
402
free_buf(Text, buffer);
406
lasti = i - D_length;
408
for(k = D; k <= r4 ; k++) A[k] = B[k] = Init[0];
410
A[D] = (((B[D] >> 1) & CMask ) | r1) & D_Mask;
411
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
415
A[k] = ((r5 >> 1) & CMask) | B[k-I] | (((A[k-DD] | B[k-S]) >>1) & r_NO_ERR) | r1 ;
417
if (DELIMITER) CurrentByteOffset += 1*D_length;
418
else CurrentByteOffset += 1*1;
419
} /* end if (A[D]&endpos) */
420
CMask = Mask[buffer[i++]];
421
CurrentByteOffset ++;
423
B[D] = ((A[D] >> 1) & CMask) | r1;
424
for(k = r3; k <= r4; k++)
427
B[k] = ((A[k] >> 1) & CMask) | A[k-I] | (((B[k-DD] | A[k-S]) >>1)&r_NO_ERR) | r1 ;
431
if (DELIMITER) CurrentByteOffset -= D_length;
432
else CurrentByteOffset -= 1;
433
if(((AND == 1) && ((B[r4] & endposition) == endposition)) || ((AND == 0) && (B[r4] & endposition)) ^ INVERSE )
435
if(FILENAMEONLY && (NEW_FILE || !POST_FILTER)) {
438
if (agrep_finalfp != NULL)
439
fprintf(agrep_finalfp, "%s", CurrentFileName);
442
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
443
(CurrentFileName[outindex] != '\0'); outindex++) {
444
agrep_outbuffer[agrep_outpointer+outindex] = CurrentFileName[outindex];
446
if ((CurrentFileName[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
448
free_buf(Text, buffer);
451
agrep_outpointer += outindex;
454
char *s = aprint_file_time(CurrentFileTime);
455
if (agrep_finalfp != NULL)
456
fprintf(agrep_finalfp, "%s", s);
459
for(outindex=0; (outindex+agrep_outpointer<agrep_outlen) &&
460
(s[outindex] != '\0'); outindex++) {
461
agrep_outbuffer[agrep_outpointer+outindex] = s[outindex];
463
if ((s[outindex] != '\0') || (outindex+agrep_outpointer>=agrep_outlen)) {
465
free_buf(Text, buffer);
468
agrep_outpointer += outindex;
471
if (agrep_finalfp != NULL)
472
fprintf(agrep_finalfp, "\n");
474
if (agrep_outpointer+1>=agrep_outlen) {
476
free_buf(Text, buffer);
479
else agrep_outbuffer[agrep_outpointer++] = '\n';
484
memcpy(buffer+end-D_length, tempbuf, D_length+1);
487
free_buf(Text, buffer);
491
if((Text != -1) && !(lasti >= Max_record + num_read - 1)) {
492
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
494
else if ((Text == -1) && !(lasti >= num_read)) {
495
if (-1 == output(buffer, lasti, i-D_length-1, j)) {free_buf(Text, buffer); return -1;}
497
if (((LIMITOUTPUT > 0) && (LIMITOUTPUT <= num_of_matched)) ||
498
((LIMITPERFILE > 0) && (LIMITPERFILE <= num_of_matched - prev_num_of_matched))) {
499
free_buf(Text, buffer);
505
for(k=D; k <= r4; k++) A[k] = B[k] = Init[0];
507
B[D] = (((A[D] >> 1) & CMask ) | r1) & D_Mask;
508
for(k = r3; k <= r4; k++) /* r3 = D+1, r4 = 2*D */
512
B[k] = ((r5 >> 1) & CMask) | A[k-I] | (((B[k-DD] | A[k-S]) >>1) & r_NO_ERR) | r1 ;
514
if (DELIMITER) CurrentByteOffset += 1*D_length;
515
else CurrentByteOffset += 1*1;
516
} /* end if (B[D]&endpos) */
521
memcpy(buffer+end, tempbuf, D_length+1);
527
#endif /*AGREP_POINTER*/