regc_cvec.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  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.  */
  32. /*
  33.  - newcvec - allocate a new cvec
  34.  ^ static struct cvec *newcvec(int, int, int);
  35.  */
  36. static struct cvec *
  37. newcvec(nchrs, nranges, nmcces)
  38.     int nchrs; /* to hold this many chrs... */
  39.     int nranges; /* ... and this many ranges... */
  40.     int nmcces; /* ... and this many MCCEs */
  41. {
  42.     size_t n;
  43.     size_t nc;
  44.     struct cvec *cv;
  45.     nc = (size_t)nchrs + (size_t)nmcces*(MAXMCCE+1) + (size_t)nranges*2;
  46.     n = sizeof(struct cvec) + (size_t)(nmcces-1)*sizeof(chr *)
  47.     + nc*sizeof(chr);
  48.     cv = (struct cvec *)MALLOC(n);
  49.     if (cv == NULL) {
  50. return NULL;
  51.     }
  52.     cv->chrspace = nchrs;
  53.     cv->chrs = (chr *)&cv->mcces[nmcces]; /* chrs just after MCCE ptrs */
  54.     cv->mccespace = nmcces;
  55.     cv->ranges = cv->chrs + nchrs + nmcces*(MAXMCCE+1);
  56.     cv->rangespace = nranges;
  57.     return clearcvec(cv);
  58. }
  59. /*
  60.  - clearcvec - clear a possibly-new cvec
  61.  * Returns pointer as convenience.
  62.  ^ static struct cvec *clearcvec(struct cvec *);
  63.  */
  64. static struct cvec *
  65. clearcvec(cv)
  66.     struct cvec *cv; /* character vector */
  67. {
  68.     int i;
  69.     assert(cv != NULL);
  70.     cv->nchrs = 0;
  71.     assert(cv->chrs == (chr *)&cv->mcces[cv->mccespace]);
  72.     cv->nmcces = 0;
  73.     cv->nmccechrs = 0;
  74.     cv->nranges = 0;
  75.     for (i = 0; i < cv->mccespace; i++) {
  76. cv->mcces[i] = NULL;
  77.     }
  78.     return cv;
  79. }
  80. /*
  81.  - addchr - add a chr to a cvec
  82.  ^ static VOID addchr(struct cvec *, pchr);
  83.  */
  84. static VOID
  85. addchr(cv, c)
  86.     struct cvec *cv; /* character vector */
  87.     pchr c; /* character to add */
  88. {
  89.     assert(cv->nchrs < cv->chrspace - cv->nmccechrs);
  90.     cv->chrs[cv->nchrs++] = (chr)c;
  91. }
  92. /*
  93.  - addrange - add a range to a cvec
  94.  ^ static VOID addrange(struct cvec *, pchr, pchr);
  95.  */
  96. static VOID
  97. addrange(cv, from, to)
  98.     struct cvec *cv; /* character vector */
  99.     pchr from; /* first character of range */
  100.     pchr to; /* last character of range */
  101. {
  102.     assert(cv->nranges < cv->rangespace);
  103.     cv->ranges[cv->nranges*2] = (chr)from;
  104.     cv->ranges[cv->nranges*2 + 1] = (chr)to;
  105.     cv->nranges++;
  106. }
  107. /*
  108.  - addmcce - add an MCCE to a cvec
  109.  ^ static VOID addmcce(struct cvec *, chr *, chr *);
  110.  */
  111. static VOID
  112. addmcce(cv, startp, endp)
  113.     struct cvec *cv; /* character vector */
  114.     chr *startp; /* beginning of text */
  115.     chr *endp; /* just past end of text */
  116. {
  117.     int len;
  118.     int i;
  119.     chr *s;
  120.     chr *d;
  121.     if (startp == NULL && endp == NULL) {
  122. return;
  123.     }
  124.     len = endp - startp;
  125.     assert(len > 0);
  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--) {
  131. *d++ = *s;
  132.     }
  133.     *d++ = 0; /* endmarker */
  134.     assert(d == &cv->chrs[cv->chrspace - cv->nmccechrs]);
  135.     cv->nmccechrs += len + 1;
  136. }
  137. /*
  138.  - haschr - does a cvec contain this chr?
  139.  ^ static int haschr(struct cvec *, pchr);
  140.  */
  141. static int /* predicate */
  142. haschr(cv, c)
  143.     struct cvec *cv; /* character vector */
  144.     pchr c; /* character to test for */
  145. {
  146.     int i;
  147.     chr *p;
  148.     for (p = cv->chrs, i = cv->nchrs; i > 0; p++, i--) {
  149. if (*p == c) {
  150.     return 1;
  151. }
  152.     }
  153.     for (p = cv->ranges, i = cv->nranges; i > 0; p += 2, i--) {
  154. if ((*p <= c) && (c <= *(p+1))) {
  155.     return 1;
  156. }
  157.     }
  158.     return 0;
  159. }
  160. /*
  161.  - getcvec - get a cvec, remembering it as v->cv
  162.  ^ static struct cvec *getcvec(struct vars *, int, int, int);
  163.  */
  164. static struct cvec *
  165. getcvec(v, nchrs, nranges, nmcces)
  166.     struct vars *v; /* context */
  167.     int nchrs; /* to hold this many chrs... */
  168.     int nranges; /* ... and this many ranges... */
  169.     int nmcces; /* ... and this many MCCEs */
  170. {
  171.     if (v->cv != NULL && nchrs <= v->cv->chrspace &&
  172.     nranges <= v->cv->rangespace && nmcces <= v->cv->mccespace) {
  173. return clearcvec(v->cv);
  174.     }
  175.     if (v->cv != NULL) {
  176. freecvec(v->cv);
  177.     }
  178.     v->cv = newcvec(nchrs, nranges, nmcces);
  179.     if (v->cv == NULL) {
  180. ERR(REG_ESPACE);
  181.     }
  182.     return v->cv;
  183. }
  184. /*
  185.  - freecvec - free a cvec
  186.  ^ static VOID freecvec(struct cvec *);
  187.  */
  188. static VOID
  189. freecvec(cv)
  190.     struct cvec *cv; /* character vector */
  191. {
  192.     FREE(cv);
  193. }