1
/* Copyright (c) 1994 Burra Gopal, Udi Manber. All Rights Reserved. */
4
extern int EASYSEARCH, TCOMPRESSED;
6
/* Accesses src completely before dest, so that dest can be = src */
8
preprocess_delimiter(src, srclen, dest, pdestlen)
9
unsigned char *src, *dest;
10
int srclen, *pdestlen;
17
for (i=0, j=0; i<srclen; i++) {
18
if (temp[i] == '\\') {
22
else if (temp[i] == '^') dest[j++] = '\n';
23
else if (temp[i] == '$') dest[j++] = '\n';
24
else dest[j++] = temp[i];
27
*pdestlen = strlen(dest);
30
/* Simple quadratic search for delimiters: from, to, delim, len: offset after begin where delimiter begins, -1 otherwise */
32
exists_delimiter(begin, end, delim, len)
33
unsigned char *begin, *end, *delim;
36
register unsigned char *curbegin, *curbuf, *curdelim;
38
if (begin + len > end) return -1;
39
if (TCOMPRESSED == ON) return (exists_tcompressed_word(delim, len, begin, end - begin, EASYSEARCH));
40
for (curbegin = begin; curbegin + len <= end; curbegin ++) {
41
for (curbuf = curbegin, curdelim = delim; curbuf < curbegin + len; curbuf ++, curdelim++)
42
if (*curbuf != *curdelim) break;
43
if (curbuf >= curbegin + len) return (curbegin - begin);
48
/* return where delimiter begins or ends (=outtail): range = [begin, end) */
50
forward_delimiter(begin, end, delim, len, outtail)
51
unsigned char *begin, *end, *delim;
54
register unsigned char *curbegin, *curbuf, *curdelim;
55
unsigned char *oldbegin = begin, *retval = begin;
57
if (begin + len > end) {
61
if ((len == 1) && (*delim == '\n')) {
63
while ((begin < end) && (*begin != '\n')) begin ++;
64
if (outtail && (*begin == '\n')) begin++;
68
if (TCOMPRESSED == ON) return forward_tcompressed_word(begin, end, delim, len, outtail, EASYSEARCH);
69
for (curbegin = begin; curbegin + len <= end; curbegin ++) {
70
for (curbuf = curbegin, curdelim = delim; curbuf < curbegin + len; curbuf ++, curdelim++)
71
if (*curbuf != *curdelim) break;
72
if (curbuf >= curbegin + len) break;
74
if (!outtail) retval = (curbegin <= end - len ? curbegin: end + 1);
75
else retval = (curbegin <= end - len ? curbegin + len : end + 1);
78
/* Gurantee that this skips at least one character */
79
if (retval <= oldbegin) return oldbegin + 1;
83
/* return where the delimiter begins or ends (=outtail): range = [begin, end) */
85
backward_delimiter(end, begin, delim, len, outtail)
86
unsigned char *end, *begin, *delim;
89
register unsigned char *curbegin, *curbuf, *curdelim;
91
if (end - len < begin) return begin;
92
if ((len == 1) && (*delim == '\n')) {
94
while ((end > begin) && (*end != '\n')) end --;
95
if (outtail && (*end == '\n')) end++;
98
if (TCOMPRESSED == ON) return backward_tcompressed_word(end, begin, delim, len, outtail, EASYSEARCH);
99
for (curbegin = end-len; curbegin >= begin; curbegin --) {
100
for (curbuf = curbegin, curdelim = delim; curbuf < curbegin + len; curbuf ++, curdelim++)
101
if (*curbuf != *curdelim) break;
102
if (curbuf >= curbegin + len) break;
104
if (!outtail) return (curbegin >= begin ? curbegin : begin);
105
else return (curbegin >= begin ? curbegin + len : begin);