diff options
Diffstat (limited to 'generic/regc_cvec.c')
| -rw-r--r-- | generic/regc_cvec.c | 108 | 
1 files changed, 20 insertions, 88 deletions
| diff --git a/generic/regc_cvec.c b/generic/regc_cvec.c index f4c6dd0..d450d3e 100644 --- a/generic/regc_cvec.c +++ b/generic/regc_cvec.c @@ -28,32 +28,31 @@   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   */ + +/* + * Notes: + * Only (selected) functions in _this_ file should treat chr* as non-constant. + */  /*   - newcvec - allocate a new cvec - ^ static struct cvec *newcvec(int, int, int); + ^ static struct cvec *newcvec(int, int);   */  static struct cvec *  newcvec(      int nchrs,			/* to hold this many chrs... */ -    int nranges,		/* ... and this many ranges... */ -    int nmcces)			/* ... and this many MCCEs */ +    int nranges)		/* ... and this many ranges... */  { -    size_t n; -    size_t nc; -    struct cvec *cv; +    size_t nc = (size_t)nchrs + (size_t)nranges*2; +    size_t n = sizeof(struct cvec) + nc*sizeof(chr); +    struct cvec *cv = (struct cvec *) MALLOC(n); -    nc = (size_t)nchrs + (size_t)nmcces*(MAXMCCE+1) + (size_t)nranges*2; -    n = sizeof(struct cvec) + (size_t)(nmcces-1)*sizeof(chr *) -	    + nc*sizeof(chr); -    cv = (struct cvec *)MALLOC(n);      if (cv == NULL) {  	return NULL;      }      cv->chrspace = nchrs; -    cv->chrs = (chr *)&cv->mcces[nmcces];	/* chrs just after MCCE ptrs */ -    cv->mccespace = nmcces; -    cv->ranges = cv->chrs + nchrs + nmcces*(MAXMCCE+1); +    cv->chrs = (chr *)(((char *)cv)+sizeof(struct cvec)); +    cv->ranges = cv->chrs + nchrs;      cv->rangespace = nranges;      return clearcvec(cv);  } @@ -67,37 +66,28 @@ static struct cvec *  clearcvec(      struct cvec *cv)		/* character vector */  { -    int i; -      assert(cv != NULL);      cv->nchrs = 0; -    assert(cv->chrs == (chr *)&cv->mcces[cv->mccespace]); -    cv->nmcces = 0; -    cv->nmccechrs = 0;      cv->nranges = 0; -    for (i = 0; i < cv->mccespace; i++) { -	cv->mcces[i] = NULL; -    } -      return cv;  }  /*   - addchr - add a chr to a cvec - ^ static VOID addchr(struct cvec *, pchr); + ^ static void addchr(struct cvec *, pchr);   */  static void  addchr(      struct cvec *cv,		/* character vector */      pchr c)			/* character to add */  { -    assert(cv->nchrs < cv->chrspace - cv->nmccechrs); +    assert(cv->nchrs < cv->chrspace);      cv->chrs[cv->nchrs++] = (chr)c;  }  /*   - addrange - add a range to a cvec - ^ static VOID addrange(struct cvec *, pchr, pchr); + ^ static void addrange(struct cvec *, pchr, pchr);   */  static void  addrange( @@ -112,82 +102,24 @@ addrange(  }  /* - - addmcce - add an MCCE to a cvec - ^ static VOID addmcce(struct cvec *, chr *, chr *); - */ -static void -addmcce( -    struct cvec *cv,		/* character vector */ -    chr *startp,		/* beginning of text */ -    chr *endp)			/* just past end of text */ -{ -    int len; -    int i; -    chr *s; -    chr *d; - -    if (startp == NULL && endp == NULL) { -	return; -    } -    len = endp - startp; -    assert(len > 0); -    assert(cv->nchrs + len < cv->chrspace - cv->nmccechrs); -    assert(cv->nmcces < cv->mccespace); -    d = &cv->chrs[cv->chrspace - cv->nmccechrs - len - 1]; -    cv->mcces[cv->nmcces++] = d; -    for (s = startp, i = len; i > 0; s++, i--) { -	*d++ = *s; -    } -    *d++ = 0;			/* endmarker */ -    assert(d == &cv->chrs[cv->chrspace - cv->nmccechrs]); -    cv->nmccechrs += len + 1; -} - -/* - - haschr - does a cvec contain this chr? - ^ static int haschr(struct cvec *, pchr); - */ -static int			/* predicate */ -haschr( -    struct cvec *cv,		/* character vector */ -    pchr c)			/* character to test for */ -{ -    int i; -    chr *p; - -    for (p = cv->chrs, i = cv->nchrs; i > 0; p++, i--) { -	if (*p == c) { -	    return 1; -	} -    } -    for (p = cv->ranges, i = cv->nranges; i > 0; p += 2, i--) { -	if ((*p <= c) && (c <= *(p+1))) { -	    return 1; -	} -    } -    return 0; -} - -/*   - getcvec - get a cvec, remembering it as v->cv - ^ static struct cvec *getcvec(struct vars *, int, int, int); + ^ static struct cvec *getcvec(struct vars *, int, int);   */  static struct cvec *  getcvec(      struct vars *v,		/* context */      int nchrs,			/* to hold this many chrs... */ -    int nranges,		/* ... and this many ranges... */ -    int nmcces)			/* ... and this many MCCEs */ +    int nranges)		/* ... and this many ranges... */  {      if ((v->cv != NULL) && (nchrs <= v->cv->chrspace) && -	    (nranges <= v->cv->rangespace) && (nmcces <= v->cv->mccespace)) { +	    (nranges <= v->cv->rangespace)) {  	return clearcvec(v->cv);      }      if (v->cv != NULL) {  	freecvec(v->cv);      } -    v->cv = newcvec(nchrs, nranges, nmcces); +    v->cv = newcvec(nchrs, nranges);      if (v->cv == NULL) {  	ERR(REG_ESPACE);      } @@ -197,7 +129,7 @@ getcvec(  /*   - freecvec - free a cvec - ^ static VOID freecvec(struct cvec *); + ^ static void freecvec(struct cvec *);   */  static void  freecvec( | 
