2
* Utility functions for handling cvecs
3
* This file is #included by regcomp.c.
5
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
7
* Development of this software was funded, in part, by Cray Research Inc.,
8
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
9
* Corporation, none of whom are responsible for the results. The author
12
* Redistribution and use in source and binary forms -- with or without
13
* modification -- are permitted for any purpose, provided that
14
* redistributions in source form retain this entire copyright notice and
15
* indicate the origin and nature of any modifications.
17
* I'd appreciate being given credit for this package in the documentation of
18
* software which uses it, but that is not a requirement.
20
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
21
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
* Only (selected) functions in _this_ file should treat chr* as non-constant.
38
- newcvec - allocate a new cvec
39
^ static struct cvec *newcvec(int, int, int);
43
int nchrs, /* to hold this many chrs... */
44
int nranges, /* ... and this many ranges... */
45
int nmcces) /* ... and this many MCCEs */
50
nc = (size_t)nchrs + (size_t)nmcces*(MAXMCCE+1) + (size_t)nranges*2;
51
n = sizeof(struct cvec) + (size_t)(nmcces-1)*sizeof(chr *)
53
cv = (struct cvec *) MALLOC(n);
58
cv->chrs = (chr *)&cv->mcces[nmcces]; /* chrs just after MCCE ptrs */
59
cv->mccespace = nmcces;
60
cv->ranges = cv->chrs + nchrs + nmcces*(MAXMCCE+1);
61
cv->rangespace = nranges;
66
- clearcvec - clear a possibly-new cvec
67
* Returns pointer as convenience.
68
^ static struct cvec *clearcvec(struct cvec *);
72
struct cvec *cv) /* character vector */
78
assert(cv->chrs == (chr *)&cv->mcces[cv->mccespace]);
82
for (i = 0; i < cv->mccespace; i++) {
90
- addchr - add a chr to a cvec
91
^ static VOID addchr(struct cvec *, pchr);
95
struct cvec *cv, /* character vector */
96
pchr c) /* character to add */
98
assert(cv->nchrs < cv->chrspace - cv->nmccechrs);
99
cv->chrs[cv->nchrs++] = (chr)c;
103
- addrange - add a range to a cvec
104
^ static VOID addrange(struct cvec *, pchr, pchr);
108
struct cvec *cv, /* character vector */
109
pchr from, /* first character of range */
110
pchr to) /* last character of range */
112
assert(cv->nranges < cv->rangespace);
113
cv->ranges[cv->nranges*2] = (chr)from;
114
cv->ranges[cv->nranges*2 + 1] = (chr)to;
118
#ifdef REGEXP_MCCE_ENABLED
120
* This static function is currently called from a single spot in regcomp.c,
121
* with two NULL pointers; in that case it does nothing, so that we define out
122
* both the call and the code.
126
- addmcce - add an MCCE to a cvec
127
^ static VOID addmcce(struct cvec *, const chr *, const chr *);
132
struct cvec *cv, /* character vector */
133
const chr *startp, /* beginning of text */
134
const chr *endp) /* just past end of text */
139
if (startp == NULL && endp == NULL) {
144
assert(cv->nchrs + len < cv->chrspace - cv->nmccechrs);
145
assert(cv->nmcces < cv->mccespace);
146
d = &cv->chrs[cv->chrspace - cv->nmccechrs - len - 1];
147
cv->mcces[cv->nmcces++] = d;
148
for (s = startp, i = len; i > 0; s++, i--) {
151
*d++ = 0; /* endmarker */
152
assert(d == &cv->chrs[cv->chrspace - cv->nmccechrs]);
153
cv->nmccechrs += len + 1;
158
- haschr - does a cvec contain this chr?
159
^ static int haschr(struct cvec *, pchr);
161
static int /* predicate */
163
struct cvec *cv, /* character vector */
164
pchr c) /* character to test for */
169
for (p = cv->chrs, i = cv->nchrs; i > 0; p++, i--) {
174
for (p = cv->ranges, i = cv->nranges; i > 0; p += 2, i--) {
175
if ((*p <= c) && (c <= *(p+1))) {
183
- getcvec - get a cvec, remembering it as v->cv
184
^ static struct cvec *getcvec(struct vars *, int, int, int);
188
struct vars *v, /* context */
189
int nchrs, /* to hold this many chrs... */
190
int nranges, /* ... and this many ranges... */
191
int nmcces) /* ... and this many MCCEs */
193
if ((v->cv != NULL) && (nchrs <= v->cv->chrspace) &&
194
(nranges <= v->cv->rangespace) && (nmcces <= v->cv->mccespace)) {
195
return clearcvec(v->cv);
201
v->cv = newcvec(nchrs, nranges, nmcces);
210
- freecvec - free a cvec
211
^ static VOID freecvec(struct cvec *);
215
struct cvec *cv) /* character vector */