]>
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.
36 * newcvec - allocate a new cvec
39 newcvec(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;
49 n
= sizeof(struct cvec
) + (size_t) (nmcces
- 1) * sizeof(chr
*)
51 cv
= (struct cvec
*) MALLOC(n
);
55 cv
->chrs
= (chr
*) &cv
->mcces
[nmcces
]; /* chrs just after MCCE
57 cv
->mccespace
= nmcces
;
58 cv
->ranges
= cv
->chrs
+ nchrs
+ nmcces
* (MAXMCCE
+ 1);
59 cv
->rangespace
= nranges
;
64 * clearcvec - clear a possibly-new cvec
65 * Returns pointer as convenience.
68 clearcvec(struct cvec
* cv
)
74 assert(cv
->chrs
== (chr
*) &cv
->mcces
[cv
->mccespace
]);
78 for (i
= 0; i
< cv
->mccespace
; i
++)
85 * addchr - add a chr to a cvec
88 addchr(struct cvec
* cv
, /* character vector */
89 chr c
) /* character to add */
91 assert(cv
->nchrs
< cv
->chrspace
- cv
->nmccechrs
);
92 cv
->chrs
[cv
->nchrs
++] = (chr
) c
;
96 * addrange - add a range to a cvec
99 addrange(struct cvec
* cv
, /* character vector */
100 chr from
, /* first character of range */
101 chr to
) /* last character of range */
103 assert(cv
->nranges
< cv
->rangespace
);
104 cv
->ranges
[cv
->nranges
* 2] = (chr
) from
;
105 cv
->ranges
[cv
->nranges
* 2 + 1] = (chr
) to
;
110 * addmcce - add an MCCE to a cvec
113 addmcce(struct cvec
* cv
, /* character vector */
114 chr
*startp
, /* beginning of text */
115 chr
*endp
) /* just past end of text */
122 if (startp
== NULL
&& endp
== NULL
)
126 assert(cv
->nchrs
+ len
< cv
->chrspace
- cv
->nmccechrs
);
127 assert(cv
->nmcces
< cv
->mccespace
);
128 d
= &cv
->chrs
[cv
->chrspace
- cv
->nmccechrs
- len
- 1];
129 cv
->mcces
[cv
->nmcces
++] = d
;
130 for (s
= startp
, i
= len
; i
> 0; s
++, i
--)
132 *d
++ = 0; /* endmarker */
133 assert(d
== &cv
->chrs
[cv
->chrspace
- cv
->nmccechrs
]);
134 cv
->nmccechrs
+= len
+ 1;
138 * haschr - does a cvec contain this chr?
140 static int /* predicate */
141 haschr(struct cvec
* cv
, /* character vector */
142 chr c
) /* character to test for */
147 for (p
= cv
->chrs
, i
= cv
->nchrs
; i
> 0; p
++, i
--)
152 for (p
= cv
->ranges
, i
= cv
->nranges
; i
> 0; p
+= 2, i
--)
154 if ((*p
<= c
) && (c
<= *(p
+ 1)))
161 * getcvec - get a cvec, remembering it as v->cv
164 getcvec(struct vars
* v
, /* context */
165 int nchrs
, /* to hold this many chrs... */
166 int nranges
, /* ... and this many ranges... */
167 int nmcces
) /* ... and this many MCCEs */
169 if (v
->cv
!= NULL
&& nchrs
<= v
->cv
->chrspace
&&
170 nranges
<= v
->cv
->rangespace
&& nmcces
<= v
->cv
->mccespace
)
171 return clearcvec(v
->cv
);
175 v
->cv
= newcvec(nchrs
, nranges
, nmcces
);
183 * freecvec - free a cvec
186 freecvec(struct cvec
* cv
)