~ubuntu-branches/ubuntu/oneiric/postgresql-9.1/oneiric-security

« back to all changes in this revision

Viewing changes to src/backend/regex/regc_cvec.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-05-11 10:41:53 UTC
  • Revision ID: james.westby@ubuntu.com-20110511104153-psbh2o58553fv1m0
Tags: upstream-9.1~beta1
ImportĀ upstreamĀ versionĀ 9.1~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
18
 * of 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
 * src/backend/regex/regc_cvec.c
 
32
 *
 
33
 */
 
34
 
 
35
/*
 
36
 * Notes:
 
37
 * Only (selected) functions in _this_ file should treat chr* as non-constant.
 
38
 */
 
39
 
 
40
/*
 
41
 * newcvec - allocate a new cvec
 
42
 */
 
43
static struct cvec *
 
44
newcvec(int nchrs,                              /* to hold this many chrs... */
 
45
                int nranges)                    /* ... and this many ranges */
 
46
{
 
47
        size_t          nc = (size_t) nchrs + (size_t) nranges * 2;
 
48
        size_t          n = sizeof(struct cvec) + nc * sizeof(chr);
 
49
        struct cvec *cv = (struct cvec *) MALLOC(n);
 
50
 
 
51
        if (cv == NULL)
 
52
                return NULL;
 
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
 */
 
64
static struct cvec *
 
65
clearcvec(struct cvec * cv)
 
66
{
 
67
        assert(cv != NULL);
 
68
        cv->nchrs = 0;
 
69
        cv->nranges = 0;
 
70
        return cv;
 
71
}
 
72
 
 
73
/*
 
74
 * addchr - add a chr to a cvec
 
75
 */
 
76
static void
 
77
addchr(struct cvec * cv,                /* character vector */
 
78
           chr c)                                       /* character to add */
 
79
{
 
80
        cv->chrs[cv->nchrs++] = (chr) c;
 
81
}
 
82
 
 
83
/*
 
84
 * addrange - add a range to a cvec
 
85
 */
 
86
static void
 
87
addrange(struct cvec * cv,              /* character vector */
 
88
                 chr from,                              /* first character of range */
 
89
                 chr to)                                /* last character of range */
 
90
{
 
91
        assert(cv->nranges < cv->rangespace);
 
92
        cv->ranges[cv->nranges * 2] = (chr) from;
 
93
        cv->ranges[cv->nranges * 2 + 1] = (chr) to;
 
94
        cv->nranges++;
 
95
}
 
96
 
 
97
/*
 
98
 * getcvec - get a cvec, remembering it as v->cv
 
99
 */
 
100
static struct cvec *
 
101
getcvec(struct vars * v,                /* context */
 
102
                int nchrs,                              /* to hold this many chrs... */
 
103
                int nranges)                    /* ... and this many ranges */
 
104
{
 
105
        if (v->cv != NULL && nchrs <= v->cv->chrspace &&
 
106
                nranges <= v->cv->rangespace)
 
107
                return clearcvec(v->cv);
 
108
 
 
109
        if (v->cv != NULL)
 
110
                freecvec(v->cv);
 
111
        v->cv = newcvec(nchrs, nranges);
 
112
        if (v->cv == NULL)
 
113
                ERR(REG_ESPACE);
 
114
 
 
115
        return v->cv;
 
116
}
 
117
 
 
118
/*
 
119
 * freecvec - free a cvec
 
120
 */
 
121
static void
 
122
freecvec(struct cvec * cv)
 
123
{
 
124
        FREE(cv);
 
125
}