]>
git.saurik.com Git - wxWidgets.git/blob - src/regex/regc_cvec.c
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
18 * of 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 - newcvec - allocate a new cvec
35 ^ static struct cvec *newcvec(int, int, int);
38 newcvec(nchrs
, nranges
, nmcces
)
39 int nchrs
; /* to hold this many chrs... */
40 int nranges
; /* ... and this many ranges... */
41 int nmcces
; /* ... and this many MCCEs */
47 nc
= (size_t)nchrs
+ (size_t)nmcces
*(MAXMCCE
+1) + (size_t)nranges
*2;
48 n
= sizeof(struct cvec
) + (size_t)(nmcces
-1)*sizeof(chr
*)
50 cv
= (struct cvec
*)MALLOC(n
);
55 cv
->chrs
= (chr
*)&cv
->mcces
[nmcces
]; /* chrs just after MCCE ptrs */
56 cv
->mccespace
= nmcces
;
57 cv
->ranges
= cv
->chrs
+ nchrs
+ nmcces
*(MAXMCCE
+1);
58 cv
->rangespace
= nranges
;
63 - clearcvec - clear a possibly-new cvec
64 * Returns pointer as convenience.
65 ^ static struct cvec *clearcvec(struct cvec *);
69 struct cvec
*cv
; /* character vector */
75 assert(cv
->chrs
== (chr
*)&cv
->mcces
[cv
->mccespace
]);
79 for (i
= 0; i
< cv
->mccespace
; i
++) {
87 - addchr - add a chr to a cvec
88 ^ static VOID addchr(struct cvec *, pchr);
92 struct cvec
*cv
; /* character vector */
93 pchr c
; /* character to add */
95 assert(cv
->nchrs
< cv
->chrspace
- cv
->nmccechrs
);
96 cv
->chrs
[cv
->nchrs
++] = (chr
)c
;
100 - addrange - add a range to a cvec
101 ^ static VOID addrange(struct cvec *, pchr, pchr);
104 addrange(cv
, from
, to
)
105 struct cvec
*cv
; /* character vector */
106 pchr from
; /* first character of range */
107 pchr to
; /* last character of range */
109 assert(cv
->nranges
< cv
->rangespace
);
110 cv
->ranges
[cv
->nranges
*2] = (chr
)from
;
111 cv
->ranges
[cv
->nranges
*2 + 1] = (chr
)to
;
116 - addmcce - add an MCCE to a cvec
117 ^ static VOID addmcce(struct cvec *, chr *, chr *);
120 addmcce(cv
, startp
, endp
)
121 struct cvec
*cv
; /* character vector */
122 chr
*startp
; /* beginning of text */
123 chr
*endp
; /* just past end of text */
130 if (startp
== NULL
&& endp
== NULL
) {
135 assert(cv
->nchrs
+ len
< cv
->chrspace
- cv
->nmccechrs
);
136 assert(cv
->nmcces
< cv
->mccespace
);
137 d
= &cv
->chrs
[cv
->chrspace
- cv
->nmccechrs
- len
- 1];
138 cv
->mcces
[cv
->nmcces
++] = d
;
139 for (s
= startp
, i
= len
; i
> 0; s
++, i
--) {
142 *d
++ = 0; /* endmarker */
143 assert(d
== &cv
->chrs
[cv
->chrspace
- cv
->nmccechrs
]);
144 cv
->nmccechrs
+= len
+ 1;
148 - haschr - does a cvec contain this chr?
149 ^ static int haschr(struct cvec *, pchr);
151 static int /* predicate */
153 struct cvec
*cv
; /* character vector */
154 pchr c
; /* character to test for */
159 for (p
= cv
->chrs
, i
= cv
->nchrs
; i
> 0; p
++, i
--) {
164 for (p
= cv
->ranges
, i
= cv
->nranges
; i
> 0; p
+= 2, i
--) {
165 if ((*p
<= c
) && (c
<= *(p
+1))) {
173 - getcvec - get a cvec, remembering it as v->cv
174 ^ static struct cvec *getcvec(struct vars *, int, int, int);
177 getcvec(v
, nchrs
, nranges
, nmcces
)
178 struct vars
*v
; /* context */
179 int nchrs
; /* to hold this many chrs... */
180 int nranges
; /* ... and this many ranges... */
181 int nmcces
; /* ... and this many MCCEs */
183 if (v
->cv
!= NULL
&& nchrs
<= v
->cv
->chrspace
&&
184 nranges
<= v
->cv
->rangespace
&& nmcces
<= v
->cv
->mccespace
) {
185 return clearcvec(v
->cv
);
191 v
->cv
= newcvec(nchrs
, nranges
, nmcces
);
200 - freecvec - free a cvec
201 ^ static VOID freecvec(struct cvec *);
205 struct cvec
*cv
; /* character vector */