~ubuntu-branches/ubuntu/edgy/agrep/edgy

« back to all changes in this revision

Viewing changes to delim.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2005-12-27 17:01:00 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20051227170100-nk2hnq0bnlkbk3q3
Tags: 4.17-2
Added patch to fix FTBS on amd64 (Closes: #344909).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 1994 Burra Gopal, Udi Manber.  All Rights Reserved. */
 
2
 
 
3
#include "agrep.h"
 
4
extern int EASYSEARCH, TCOMPRESSED;
 
5
 
 
6
/* Accesses src completely before dest, so that dest can be = src */
 
7
void
 
8
preprocess_delimiter(src, srclen, dest, pdestlen)
 
9
        unsigned char *src, *dest;
 
10
        int     srclen, *pdestlen;
 
11
{
 
12
        CHAR temp[Maxline];
 
13
        int i, j;
 
14
 
 
15
        strcpy(temp, src);
 
16
        temp[srclen] = '\0';
 
17
        for (i=0, j=0; i<srclen; i++) {
 
18
                if (temp[i] == '\\') {
 
19
                        i++;
 
20
                        dest[j++] = temp[i];
 
21
                }
 
22
                else if (temp[i] == '^') dest[j++] = '\n';
 
23
                else if (temp[i] == '$') dest[j++] = '\n';
 
24
                else dest[j++] = temp[i];
 
25
        }
 
26
        dest[j] = '\0';
 
27
        *pdestlen = strlen(dest);
 
28
}
 
29
 
 
30
/* Simple quadratic search for delimiters: from, to, delim, len: offset after begin where delimiter begins, -1 otherwise */
 
31
int
 
32
exists_delimiter(begin, end, delim, len)
 
33
        unsigned char *begin, *end, *delim;
 
34
        int len;
 
35
{
 
36
        register unsigned char  *curbegin, *curbuf, *curdelim;
 
37
 
 
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);
 
44
        }
 
45
        return -1;
 
46
}
 
47
 
 
48
/* return where delimiter begins or ends (=outtail): range = [begin, end) */
 
49
unsigned char *
 
50
forward_delimiter(begin, end, delim, len, outtail)
 
51
        unsigned char *begin, *end, *delim;
 
52
        int len, outtail;
 
53
{
 
54
        register unsigned char  *curbegin, *curbuf, *curdelim;
 
55
        unsigned char *oldbegin = begin, *retval = begin;
 
56
 
 
57
        if (begin + len > end) {
 
58
                retval = end + 1;
 
59
                goto _ret;
 
60
        }
 
61
        if ((len == 1) && (*delim == '\n')) {
 
62
                begin ++;
 
63
                while ((begin < end) && (*begin != '\n')) begin ++;
 
64
                if (outtail && (*begin == '\n')) begin++;
 
65
                retval = begin;
 
66
                goto _ret;
 
67
        }
 
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;
 
73
        }
 
74
        if (!outtail) retval = (curbegin <= end - len ? curbegin: end + 1);
 
75
        else retval = (curbegin <= end - len ? curbegin + len : end + 1);
 
76
 
 
77
_ret:
 
78
        /* Gurantee that this skips at least one character */
 
79
        if (retval <= oldbegin) return oldbegin + 1;
 
80
        else return retval;
 
81
}
 
82
 
 
83
/* return where the delimiter begins or ends (=outtail): range = [begin, end) */
 
84
unsigned char *
 
85
backward_delimiter(end, begin, delim, len, outtail)
 
86
        unsigned char *end, *begin, *delim;
 
87
        int len, outtail;
 
88
{
 
89
        register unsigned char  *curbegin, *curbuf, *curdelim;
 
90
 
 
91
        if (end - len < begin) return begin;
 
92
        if ((len == 1) && (*delim == '\n')) {
 
93
                end --;
 
94
                while ((end > begin) && (*end != '\n')) end --;
 
95
                if (outtail && (*end == '\n')) end++;
 
96
                return end;
 
97
        }
 
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;
 
103
        }
 
104
        if (!outtail) return (curbegin >= begin ? curbegin : begin);
 
105
        else return (curbegin >= begin ? curbegin + len : begin);
 
106
}