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 */ 147