1 | /* |
---|
2 | * Utility functions for handling cvecs |
---|
3 | * This file is #included by regcomp.c. |
---|
4 | * |
---|
5 | * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. |
---|
6 | * |
---|
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 |
---|
10 | * thanks all of them. |
---|
11 | * |
---|
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. |
---|
16 | * |
---|
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. |
---|
19 | * |
---|
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. |
---|
30 | */ |
---|
31 | |
---|
32 | /* |
---|
33 | * Notes: |
---|
34 | * Only (selected) functions in _this_ file should treat chr* as non-constant. |
---|
35 | */ |
---|
36 | |
---|
37 | /* |
---|
38 | - newcvec - allocate a new cvec |
---|
39 | ^ static struct cvec *newcvec(int, int); |
---|
40 | */ |
---|
41 | static struct cvec * |
---|
42 | newcvec( |
---|
43 | int nchrs, /* to hold this many chrs... */ |
---|
44 | int nranges) /* ... and this many ranges... */ |
---|
45 | { |
---|
46 | size_t nc = (size_t)nchrs + (size_t)nranges*2; |
---|
47 | size_t n = sizeof(struct cvec) + nc*sizeof(chr); |
---|
48 | struct cvec *cv = (struct cvec *) MALLOC(n); |
---|
49 | |
---|
50 | if (cv == NULL) { |
---|
51 | return NULL; |
---|
52 | } |
---|
53 | cv->chrspace = nchrs; |
---|
54 | cv->chrs = (chr *)(((char *)cv)+sizeof(struct cvec)); |
---|
55 | cv->ranges = cv->chrs + nchrs; |
---|
56 | cv->rangespace = nranges; |
---|
57 | return clearcvec(cv); |
---|
58 | } |
---|
59 | |
---|
60 | /* |
---|
61 | - clearcvec - clear a possibly-new cvec |
---|
62 | * Returns pointer as convenience. |
---|
63 | ^ static struct cvec *clearcvec(struct cvec *); |
---|
64 | */ |
---|
65 | static struct cvec * |
---|
66 | clearcvec( |
---|
67 | struct cvec *cv) /* character vector */ |
---|
68 | { |
---|
69 | assert(cv != NULL); |
---|
70 | cv->nchrs = 0; |
---|
71 | cv->nranges = 0; |
---|
72 | return cv; |
---|
73 | } |
---|
74 | |
---|
75 | /* |
---|
76 | - addchr - add a chr to a cvec |
---|
77 | ^ static VOID addchr(struct cvec *, pchr); |
---|
78 | */ |
---|
79 | static void |
---|
80 | addchr( |
---|
81 | struct cvec *cv, /* character vector */ |
---|
82 | pchr c) /* character to add */ |
---|
83 | { |
---|
84 | cv->chrs[cv->nchrs++] = (chr)c; |
---|
85 | } |
---|
86 | |
---|
87 | /* |
---|
88 | - addrange - add a range to a cvec |
---|
89 | ^ static VOID addrange(struct cvec *, pchr, pchr); |
---|
90 | */ |
---|
91 | static void |
---|
92 | addrange( |
---|
93 | struct cvec *cv, /* character vector */ |
---|
94 | pchr from, /* first character of range */ |
---|
95 | pchr to) /* last character of range */ |
---|
96 | { |
---|
97 | assert(cv->nranges < cv->rangespace); |
---|
98 | cv->ranges[cv->nranges*2] = (chr)from; |
---|
99 | cv->ranges[cv->nranges*2 + 1] = (chr)to; |
---|
100 | cv->nranges++; |
---|
101 | } |
---|
102 | |
---|
103 | /* |
---|
104 | - getcvec - get a cvec, remembering it as v->cv |
---|
105 | ^ static struct cvec *getcvec(struct vars *, int, int); |
---|
106 | */ |
---|
107 | static struct cvec * |
---|
108 | getcvec( |
---|
109 | struct vars *v, /* context */ |
---|
110 | int nchrs, /* to hold this many chrs... */ |
---|
111 | int nranges) /* ... and this many ranges... */ |
---|
112 | { |
---|
113 | if ((v->cv != NULL) && (nchrs <= v->cv->chrspace) && |
---|
114 | (nranges <= v->cv->rangespace)) { |
---|
115 | return clearcvec(v->cv); |
---|
116 | } |
---|
117 | |
---|
118 | if (v->cv != NULL) { |
---|
119 | freecvec(v->cv); |
---|
120 | } |
---|
121 | v->cv = newcvec(nchrs, nranges); |
---|
122 | if (v->cv == NULL) { |
---|
123 | ERR(REG_ESPACE); |
---|
124 | } |
---|
125 | |
---|
126 | return v->cv; |
---|
127 | } |
---|
128 | |
---|
129 | /* |
---|
130 | - freecvec - free a cvec |
---|
131 | ^ static VOID freecvec(struct cvec *); |
---|
132 | */ |
---|
133 | static void |
---|
134 | freecvec( |
---|
135 | struct cvec *cv) /* character vector */ |
---|
136 | { |
---|
137 | FREE(cv); |
---|
138 | } |
---|
139 | |
---|
140 | /* |
---|
141 | * Local Variables: |
---|
142 | * mode: c |
---|
143 | * c-basic-offset: 4 |
---|
144 | * fill-column: 78 |
---|
145 | * End: |
---|
146 | */ |
---|