Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/tcl8.5.2/generic/regc_cvec.c @ 63

Last change on this file since 63 was 25, checked in by landauf, 17 years ago

added tcl to libs

File size: 3.9 KB
Line 
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 */
41static struct cvec *
42newcvec(
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 */
65static struct cvec *
66clearcvec(
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 */
79static void
80addchr(
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 */
91static void
92addrange(
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 */
107static struct cvec *
108getcvec(
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 */
133static void
134freecvec(
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 */
Note: See TracBrowser for help on using the repository browser.