/*-
 * This code is derived from OpenBSD's libc/regex, original license follows:
 *
 * Copyright (c) 1992, 1993, 1994 Henry Spencer.
 * Copyright (c) 1992, 1993, 1994
 *	The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Henry Spencer.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)regcomp.c	8.5 (Berkeley) 3/20/94
 */

#include "regex_impl.h"
#include <ctype.h>
#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#include "regex2.h"
#include "regutils.h"

#include "llvm/Config/config.h"
#include "llvm/Support/Compiler.h"

/* character-class table */
static struct cclass {
  const char *name;
  const char *chars;
  const char *multis;
} cclasses[] = {
    {"alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789",
     ""},
    {"alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", ""},
    {"blank", " \t", ""},
    {"cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
\25\26\27\30\31\32\33\34\35\36\37\177",
     ""},
    {"digit", "0123456789", ""},
    {"graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
     ""},
    {"lower", "abcdefghijklmnopqrstuvwxyz", ""},
    {"print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
     ""},
    {"punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", ""},
    {"space", "\t\n\v\f\r ", ""},
    {"upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", ""},
    {"xdigit", "0123456789ABCDEFabcdef", ""},
    {NULL, 0, ""}};

/* character-name table */
static struct cname {
  const char *name;
  char code;
} cnames[] = {{"NUL", '\0'},
              {"SOH", '\001'},
              {"STX", '\002'},
              {"ETX", '\003'},
              {"EOT", '\004'},
              {"ENQ", '\005'},
              {"ACK", '\006'},
              {"BEL", '\007'},
              {"alert", '\007'},
              {"BS", '\010'},
              {"backspace", '\b'},
              {"HT", '\011'},
              {"tab", '\t'},
              {"LF", '\012'},
              {"newline", '\n'},
              {"VT", '\013'},
              {"vertical-tab", '\v'},
              {"FF", '\014'},
              {"form-feed", '\f'},
              {"CR", '\015'},
              {"carriage-return", '\r'},
              {"SO", '\016'},
              {"SI", '\017'},
              {"DLE", '\020'},
              {"DC1", '\021'},
              {"DC2", '\022'},
              {"DC3", '\023'},
              {"DC4", '\024'},
              {"NAK", '\025'},
              {"SYN", '\026'},
              {"ETB", '\027'},
              {"CAN", '\030'},
              {"EM", '\031'},
              {"SUB", '\032'},
              {"ESC", '\033'},
              {"IS4", '\034'},
              {"FS", '\034'},
              {"IS3", '\035'},
              {"GS", '\035'},
              {"IS2", '\036'},
              {"RS", '\036'},
              {"IS1", '\037'},
              {"US", '\037'},
              {"space", ' '},
              {"exclamation-mark", '!'},
              {"quotation-mark", '"'},
              {"number-sign", '#'},
              {"dollar-sign", '$'},
              {"percent-sign", '%'},
              {"ampersand", '&'},
              {"apostrophe", '\''},
              {"left-parenthesis", '('},
              {"right-parenthesis", ')'},
              {"asterisk", '*'},
              {"plus-sign", '+'},
              {"comma", ','},
              {"hyphen", '-'},
              {"hyphen-minus", '-'},
              {"period", '.'},
              {"full-stop", '.'},
              {"slash", '/'},
              {"solidus", '/'},
              {"zero", '0'},
              {"one", '1'},
              {"two", '2'},
              {"three", '3'},
              {"four", '4'},
              {"five", '5'},
              {"six", '6'},
              {"seven", '7'},
              {"eight", '8'},
              {"nine", '9'},
              {"colon", ':'},
              {"semicolon", ';'},
              {"less-than-sign", '<'},
              {"equals-sign", '='},
              {"greater-than-sign", '>'},
              {"question-mark", '?'},
              {"commercial-at", '@'},
              {"left-square-bracket", '['},
              {"backslash", '\\'},
              {"reverse-solidus", '\\'},
              {"right-square-bracket", ']'},
              {"circumflex", '^'},
              {"circumflex-accent", '^'},
              {"underscore", '_'},
              {"low-line", '_'},
              {"grave-accent", '`'},
              {"left-brace", '{'},
              {"left-curly-bracket", '{'},
              {"vertical-line", '|'},
              {"right-brace", '}'},
              {"right-curly-bracket", '}'},
              {"tilde", '~'},
              {"DEL", '\177'},
              {NULL, 0}};

/*
 * parse structure, passed up and down to avoid global variables and
 * other clumsinesses
 */
struct parse {
  const char *next; /* next character in RE */
  const char *end;  /* end of string (-> NUL normally) */
  int error;        /* has an error been seen? */
  sop *strip;       /* malloced strip */
  sopno ssize;      /* malloced strip size (allocated) */
  sopno slen;       /* malloced strip length (used) */
  int ncsalloc;     /* number of csets allocated */
  struct re_guts *g;
#define NPAREN 10       /* we need to remember () 1-9 for back refs */
  sopno pbegin[NPAREN]; /* -> ( ([0] unused) */
  sopno pend[NPAREN];   /* -> ) ([0] unused) */
};

static void p_ere(struct parse *, int);
static void p_ere_exp(struct parse *);
static void p_str(struct parse *);
static void p_bre(struct parse *, int, int);
static int p_simp_re(struct parse *, int);
static int p_count(struct parse *);
static void p_bracket(struct parse *);
static void p_b_term(struct parse *, cset *);
static void p_b_cclass(struct parse *, cset *);
static void p_b_eclass(struct parse *, cset *);
static char p_b_symbol(struct parse *);
static char p_b_coll_elem(struct parse *, int);
static char othercase(int);
static void bothcases(struct parse *, int);
static void ordinary(struct parse *, int);
static void nonnewline(struct parse *);
static void repeat(struct parse *, sopno, int, int);
static int seterr(struct parse *, int);
static cset *allocset(struct parse *);
static void freeset(struct parse *, cset *);
static int freezeset(struct parse *, cset *);
static int firstch(struct parse *, cset *);
static int nch(struct parse *, cset *);
static void mcadd(struct parse *, cset *, const char *);
static void mcinvert(struct parse *, cset *);
static void mccase(struct parse *, cset *);
static int isinsets(struct re_guts *, int);
static int samesets(struct re_guts *, int, int);
static void categorize(struct parse *, struct re_guts *);
static sopno dupl(struct parse *, sopno, sopno);
static void doemit(struct parse *, sop, size_t);
static void doinsert(struct parse *, sop, size_t, sopno);
static void dofwd(struct parse *, sopno, sop);
static void enlarge(struct parse *, sopno);
static void stripsnug(struct parse *, struct re_guts *);
static void findmust(struct parse *, struct re_guts *);
static sopno pluscount(struct parse *, struct re_guts *);

static char nuls[10]; /* place to point scanner in event of error */

/*
 * macros for use with parse structure
 * BEWARE:  these know that the parse structure is named `p' !!!
 */
#define PEEK() (*p->next)
#define PEEK2() (*(p->next + 1))
#define MORE() (p->end - p->next > 0)
#define MORE2() (p->end - p->next > 1)
#define SEE(c) (MORE() && PEEK() == (c))
#define SEETWO(a, b) (MORE2() && PEEK() == (a) && PEEK2() == (b))
#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0)
#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
#define NEXT() (p->next++)
#define NEXT2() (p->next += 2)
#define NEXTn(n) (p->next += (n))
#define GETNEXT() (*p->next++)
#define SETERROR(e) seterr(p, (e))
#define REQUIRE(co, e) (void)((co) || SETERROR(e))
#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e))
#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e))
#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e))
#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
#define INSERT(op, pos) doinsert(p, (sop)(op), HERE() - (pos) + 1, pos)
#define AHEAD(pos) dofwd(p, pos, HERE() - (pos))
#define ASTERN(sop, pos) EMIT(sop, HERE() - pos)
#define HERE() (p->slen)
#define THERE() (p->slen - 1)
#define THERETHERE() (p->slen - 2)
#define DROP(n) (p->slen -= (n))

#ifdef _POSIX2_RE_DUP_MAX
#define DUPMAX _POSIX2_RE_DUP_MAX
#else
#define DUPMAX 255
#endif
#define REGINFINITY (DUPMAX + 1)

#ifndef NDEBUG
static int never = 0; /* for use in asserts; shuts lint up */
#else
#define never 0 /* some <assert.h>s have bugs too */
#endif

/*
 - llvm_regcomp - interface for parser and compilation
 */
int /* 0 success, otherwise REG_something */
llvm_regcomp(llvm_regex_t *preg, const char *pattern, int cflags) {
  struct parse pa;
  struct re_guts *g;
  struct parse *p = &pa;
  int i;
  size_t len;
#ifdef REDEBUG
#define GOODFLAGS(f) (f)
#else
#define GOODFLAGS(f) ((f) & ~REG_DUMP)
#endif

  cflags = GOODFLAGS(cflags);
  if ((cflags & REG_EXTENDED) && (cflags & REG_NOSPEC))
    return (REG_INVARG);

  if (cflags & REG_PEND) {
    if (preg->re_endp < pattern)
      return (REG_INVARG);
    len = preg->re_endp - pattern;
  } else {
    len = strlen(pattern);
  }

  /* do the mallocs early so failure handling is easy */
  g = (struct re_guts *)malloc(sizeof(struct re_guts) +
                               (NC - 1) * sizeof(cat_t));
  if (g == NULL)
    return (REG_ESPACE);
  p->ssize = len / (size_t)2 * (size_t)3 + (size_t)1; /* ugh */
  p->strip = (sop *)calloc(p->ssize, sizeof(sop));
  p->slen = 0;
  if (p->strip == NULL) {
    free((char *)g);
    return (REG_ESPACE);
  }

  /* set things up */
  p->g = g;
  p->next = pattern;
  p->end = p->next + len;
  p->error = 0;
  p->ncsalloc = 0;
  for (i = 0; i < NPAREN; i++) {
    p->pbegin[i] = 0;
    p->pend[i] = 0;
  }
  g->csetsize = NC;
  g->sets = NULL;
  g->setbits = NULL;
  g->ncsets = 0;
  g->cflags = cflags;
  g->iflags = 0;
  g->nbol = 0;
  g->neol = 0;
  g->must = NULL;
  g->mlen = 0;
  g->nsub = 0;
  g->ncategories = 1; /* category 0 is "everything else" */
  g->categories = &g->catspace[-(CHAR_MIN)];
  (void)memset((char *)g->catspace, 0, NC * sizeof(cat_t));
  g->backrefs = 0;

  /* do it */
  EMIT(OEND, 0);
  g->firststate = THERE();
  if (cflags & REG_EXTENDED)
    p_ere(p, OUT);
  else if (cflags & REG_NOSPEC)
    p_str(p);
  else
    p_bre(p, OUT, OUT);
  EMIT(OEND, 0);
  g->laststate = THERE();

  /* tidy up loose ends and fill things in */
  categorize(p, g);
  stripsnug(p, g);
  findmust(p, g);
  g->nplus = pluscount(p, g);
  g->magic = MAGIC2;
  preg->re_nsub = g->nsub;
  preg->re_g = g;
  preg->re_magic = MAGIC1;
#ifndef REDEBUG
  /* not debugging, so can't rely on the assert() in llvm_regexec() */
  if (g->iflags & REGEX_BAD)
    SETERROR(REG_ASSERT);
#endif

  /* win or lose, we're done */
  if (p->error != 0) /* lose */
    llvm_regfree(preg);
  return (p->error);
}

/*
 - p_ere - ERE parser top level, concatenation and alternation
 */
static void p_ere(struct parse *p,
                  int stop) /* character this ERE should end at */
{
  char c;
  sopno prevback = 0;
  sopno prevfwd = 0;
  sopno conc;
  int first = 1; /* is this the first alternative? */

  for (;;) {
    /* do a bunch of concatenated expressions */
    conc = HERE();
    while (MORE() && (c = PEEK()) != '|' && c != stop)
      p_ere_exp(p);
    REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */

    if (!EAT('|'))
      break; /* NOTE BREAK OUT */

    if (first) {
      INSERT(OCH_, conc); /* offset is wrong */
      prevfwd = conc;
      prevback = conc;
      first = 0;
    }
    ASTERN(OOR1, prevback);
    prevback = THERE();
    AHEAD(prevfwd); /* fix previous offset */
    prevfwd = HERE();
    EMIT(OOR2, 0); /* offset is very wrong */
  }

  if (!first) { /* tail-end fixups */
    AHEAD(prevfwd);
    ASTERN(O_CH, prevback);
  }

  assert(!MORE() || SEE(stop));
}

/*
 - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op
 */
static void p_ere_exp(struct parse *p) {
  char c;
  sopno pos;
  int count;
  int count2;
  int backrefnum;
  sopno subno;
  int wascaret = 0;

  assert(MORE()); /* caller should have ensured this */
  c = GETNEXT();

  pos = HERE();
  switch (c) {
  case '(':
    REQUIRE(MORE(), REG_EPAREN);
    p->g->nsub++;
    subno = p->g->nsub;
    if (subno < NPAREN)
      p->pbegin[subno] = HERE();
    EMIT(OLPAREN, subno);
    if (!SEE(')'))
      p_ere(p, ')');
    if (subno < NPAREN) {
      p->pend[subno] = HERE();
      assert(p->pend[subno] != 0);
    }
    EMIT(ORPAREN, subno);
    MUSTEAT(')', REG_EPAREN);
    break;
#ifndef POSIX_MISTAKE
  case ')': /* happens only if no current unmatched ( */
    /*
     * You may ask, why the ifndef?  Because I didn't notice
     * this until slightly too late for 1003.2, and none of the
     * other 1003.2 regular-expression reviewers noticed it at
     * all.  So an unmatched ) is legal POSIX, at least until
     * we can get it fixed.
     */
    SETERROR(REG_EPAREN);
    break;
#endif
  case '^':
    EMIT(OBOL, 0);
    p->g->iflags |= USEBOL;
    p->g->nbol++;
    wascaret = 1;
    break;
  case '$':
    EMIT(OEOL, 0);
    p->g->iflags |= USEEOL;
    p->g->neol++;
    break;
  case '|':
    SETERROR(REG_EMPTY);
    break;
  case '*':
  case '+':
  case '?':
    SETERROR(REG_BADRPT);
    break;
  case '.':
    if (p->g->cflags & REG_NEWLINE)
      nonnewline(p);
    else
      EMIT(OANY, 0);
    break;
  case '[':
    p_bracket(p);
    break;
  case '\\':
    REQUIRE(MORE(), REG_EESCAPE);
    c = GETNEXT();
    if (c >= '1' && c <= '9') {
      /* \[0-9] is taken to be a back-reference to a previously specified
       * matching group. backrefnum will hold the number. The matching
       * group must exist (i.e. if \4 is found there must have been at
       * least 4 matching groups specified in the pattern previously).
       */
      backrefnum = c - '0';
      if (p->pend[backrefnum] == 0) {
        SETERROR(REG_ESUBREG);
        break;
      }

      /* Make sure everything checks out and emit the sequence
       * that marks a back-reference to the parse structure.
       */
      assert(backrefnum <= p->g->nsub);
      EMIT(OBACK_, backrefnum);
      assert(p->pbegin[backrefnum] != 0);
      assert(OP(p->strip[p->pbegin[backrefnum]]) == OLPAREN);
      assert(OP(p->strip[p->pend[backrefnum]]) == ORPAREN);
      (void)dupl(p, p->pbegin[backrefnum] + 1, p->pend[backrefnum]);
      EMIT(O_BACK, backrefnum);
      p->g->backrefs = 1;
    } else {
      /* Other chars are simply themselves when escaped with a backslash.
       */
      ordinary(p, c);
    }
    break;
  case '{': /* okay as ordinary except if digit follows */
    REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT);
    LLVM_FALLTHROUGH;
  default:
    ordinary(p, c);
    break;
  }

  if (!MORE())
    return;
  c = PEEK();
  /* we call { a repetition if followed by a digit */
  if (!(c == '*' || c == '+' || c == '?' ||
        (c == '{' && MORE2() && isdigit((uch)PEEK2()))))
    return; /* no repetition, we're done */
  NEXT();

  REQUIRE(!wascaret, REG_BADRPT);
  switch (c) {
  case '*': /* implemented as +? */
    /* this case does not require the (y|) trick, noKLUDGE */
    INSERT(OPLUS_, pos);
    ASTERN(O_PLUS, pos);
    INSERT(OQUEST_, pos);
    ASTERN(O_QUEST, pos);
    break;
  case '+':
    INSERT(OPLUS_, pos);
    ASTERN(O_PLUS, pos);
    break;
  case '?':
    /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
    INSERT(OCH_, pos); /* offset slightly wrong */
    ASTERN(OOR1, pos); /* this one's right */
    AHEAD(pos);        /* fix the OCH_ */
    EMIT(OOR2, 0);     /* offset very wrong... */
    AHEAD(THERE());    /* ...so fix it */
    ASTERN(O_CH, THERETHERE());
    break;
  case '{':
    count = p_count(p);
    if (EAT(',')) {
      if (isdigit((uch)PEEK())) {
        count2 = p_count(p);
        REQUIRE(count <= count2, REG_BADBR);
      } else /* single number with comma */
        count2 = REGINFINITY;
    } else /* just a single number */
      count2 = count;
    repeat(p, pos, count, count2);
    if (!EAT('}')) { /* error heuristics */
      while (MORE() && PEEK() != '}')
        NEXT();
      REQUIRE(MORE(), REG_EBRACE);
      SETERROR(REG_BADBR);
    }
    break;
  }

  if (!MORE())
    return;
  c = PEEK();
  if (!(c == '*' || c == '+' || c == '?' ||
        (c == '{' && MORE2() && isdigit((uch)PEEK2()))))
    return;
  SETERROR(REG_BADRPT);
}

/*
 - p_str - string (no metacharacters) "parser"
 */
static void p_str(struct parse *p) {
  REQUIRE(MORE(), REG_EMPTY);
  while (MORE())
    ordinary(p, GETNEXT());
}

/*
 - p_bre - BRE parser top level, anchoring and concatenation
 * Giving end1 as OUT essentially eliminates the end1/end2 check.
 *
 * This implementation is a bit of a kludge, in that a trailing $ is first
 * taken as an ordinary character and then revised to be an anchor.  The
 * only undesirable side effect is that '$' gets included as a character
 * category in such cases.  This is fairly harmless; not worth fixing.
 * The amount of lookahead needed to avoid this kludge is excessive.
 */
static void p_bre(struct parse *p, int end1, /* first terminating character */
                  int end2)                  /* second terminating character */
{
  sopno start = HERE();
  int first = 1; /* first subexpression? */
  int wasdollar = 0;

  if (EAT('^')) {
    EMIT(OBOL, 0);
    p->g->iflags |= USEBOL;
    p->g->nbol++;
  }
  while (MORE() && !SEETWO(end1, end2)) {
    wasdollar = p_simp_re(p, first);
    first = 0;
  }
  if (wasdollar) { /* oops, that was a trailing anchor */
    DROP(1);
    EMIT(OEOL, 0);
    p->g->iflags |= USEEOL;
    p->g->neol++;
  }

  REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */
}

/*
 - p_simp_re - parse a simple RE, an atom possibly followed by a repetition
 */
static int /* was the simple RE an unbackslashed $? */
p_simp_re(struct parse *p,
          int starordinary) /* is a leading * an ordinary character? */
{
  int c;
  int count;
  int count2;
  sopno pos;
  int i;
  sopno subno;
#define BACKSL (1 << CHAR_BIT)

  pos = HERE(); /* repetition op, if any, covers from here */

  assert(MORE()); /* caller should have ensured this */
  c = GETNEXT();
  if (c == '\\') {
    REQUIRE(MORE(), REG_EESCAPE);
    c = BACKSL | GETNEXT();
  }
  switch (c) {
  case '.':
    if (p->g->cflags & REG_NEWLINE)
      nonnewline(p);
    else
      EMIT(OANY, 0);
    break;
  case '[':
    p_bracket(p);
    break;
  case BACKSL | '{':
    SETERROR(REG_BADRPT);
    break;
  case BACKSL | '(':
    p->g->nsub++;
    subno = p->g->nsub;
    if (subno < NPAREN)
      p->pbegin[subno] = HERE();
    EMIT(OLPAREN, subno);
    /* the MORE here is an error heuristic */
    if (MORE() && !SEETWO('\\', ')'))
      p_bre(p, '\\', ')');
    if (subno < NPAREN) {
      p->pend[subno] = HERE();
      assert(p->pend[subno] != 0);
    }
    EMIT(ORPAREN, subno);
    REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
    break;
  case BACKSL | ')': /* should not get here -- must be user */
  case BACKSL | '}':
    SETERROR(REG_EPAREN);
    break;
  case BACKSL | '1':
  case BACKSL | '2':
  case BACKSL | '3':
  case BACKSL | '4':
  case BACKSL | '5':
  case BACKSL | '6':
  case BACKSL | '7':
  case BACKSL | '8':
  case BACKSL | '9':
    i = (c & ~BACKSL) - '0';
    assert(i < NPAREN);
    if (p->pend[i] != 0) {
      assert(i <= p->g->nsub);
      EMIT(OBACK_, i);
      assert(p->pbegin[i] != 0);
      assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
      assert(OP(p->strip[p->pend[i]]) == ORPAREN);
      (void)dupl(p, p->pbegin[i] + 1, p->pend[i]);
      EMIT(O_BACK, i);
    } else {
      SETERROR(REG_ESUBREG);
    }
    p->g->backrefs = 1;
    break;
  case '*':
    REQUIRE(starordinary, REG_BADRPT);
    LLVM_FALLTHROUGH;
  default:
    ordinary(p, (char)c);
    break;
  }

  if (EAT('*')) { /* implemented as +? */
    /* this case does not require the (y|) trick, noKLUDGE */
    INSERT(OPLUS_, pos);
    ASTERN(O_PLUS, pos);
    INSERT(OQUEST_, pos);
    ASTERN(O_QUEST, pos);
  } else if (EATTWO('\\', '{')) {
    count = p_count(p);
    if (EAT(',')) {
      if (MORE() && isdigit((uch)PEEK())) {
        count2 = p_count(p);
        REQUIRE(count <= count2, REG_BADBR);
      } else /* single number with comma */
        count2 = REGINFINITY;
    } else /* just a single number */
      count2 = count;
    repeat(p, pos, count, count2);
    if (!EATTWO('\\', '}')) { /* error heuristics */
      while (MORE() && !SEETWO('\\', '}'))
        NEXT();
      REQUIRE(MORE(), REG_EBRACE);
      SETERROR(REG_BADBR);
    }
  } else if (c == '$') /* $ (but not \$) ends it */
    return (1);

  return (0);
}

/*
 - p_count - parse a repetition count
 */
static int /* the value */
p_count(struct parse *p) {
  int count = 0;
  int ndigits = 0;

  while (MORE() && isdigit((uch)PEEK()) && count <= DUPMAX) {
    count = count * 10 + (GETNEXT() - '0');
    ndigits++;
  }

  REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
  return (count);
}

/*
 - p_bracket - parse a bracketed character list
 *
 * Note a significant property of this code:  if the allocset() did SETERROR,
 * no set operations are done.
 */
static void p_bracket(struct parse *p) {
  cset *cs;
  int invert = 0;

  /* Dept of Truly Sickening Special-Case Kludges */
  if (p->end - p->next > 5) {
    if (strncmp(p->next, "[:<:]]", 6) == 0) {
      EMIT(OBOW, 0);
      NEXTn(6);
      return;
    }
    if (strncmp(p->next, "[:>:]]", 6) == 0) {
      EMIT(OEOW, 0);
      NEXTn(6);
      return;
    }
  }

  if ((cs = allocset(p)) == NULL) {
    /* allocset did set error status in p */
    return;
  }

  if (EAT('^'))
    invert++; /* make note to invert set at end */
  if (EAT(']'))
    CHadd(cs, ']');
  else if (EAT('-'))
    CHadd(cs, '-');
  while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
    p_b_term(p, cs);
  if (EAT('-'))
    CHadd(cs, '-');
  MUSTEAT(']', REG_EBRACK);

  if (p->error != 0) { /* don't mess things up further */
    freeset(p, cs);
    return;
  }

  if (p->g->cflags & REG_ICASE) {
    int i;
    int ci;

    for (i = p->g->csetsize - 1; i >= 0; i--)
      if (CHIN(cs, i) && isalpha(i)) {
        ci = othercase(i);
        if (ci != i)
          CHadd(cs, ci);
      }
    if (cs->multis != NULL)
      mccase(p, cs);
  }
  if (invert) {
    int i;

    for (i = p->g->csetsize - 1; i >= 0; i--)
      if (CHIN(cs, i))
        CHsub(cs, i);
      else
        CHadd(cs, i);
    if (p->g->cflags & REG_NEWLINE)
      CHsub(cs, '\n');
    if (cs->multis != NULL)
      mcinvert(p, cs);
  }

  assert(cs->multis == NULL); /* xxx */

  if (nch(p, cs) == 1) { /* optimize singleton sets */
    ordinary(p, firstch(p, cs));
    freeset(p, cs);
  } else {
    EMIT(OANYOF, freezeset(p, cs));
  }
}

/*
 - p_b_term - parse one term of a bracketed character list
 */
static void p_b_term(struct parse *p, cset *cs) {
  char c;
  char start, finish;
  int i;

  /* classify what we've got */
  switch ((MORE()) ? PEEK() : '\0') {
  case '[':
    c = (MORE2()) ? PEEK2() : '\0';
    break;
  case '-':
    SETERROR(REG_ERANGE);
    return; /* NOTE RETURN */
    break;
  default:
    c = '\0';
    break;
  }

  switch (c) {
  case ':': /* character class */
    NEXT2();
    REQUIRE(MORE(), REG_EBRACK);
    c = PEEK();
    REQUIRE(c != '-' && c != ']', REG_ECTYPE);
    p_b_cclass(p, cs);
    REQUIRE(MORE(), REG_EBRACK);
    REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
    break;
  case '=': /* equivalence class */
    NEXT2();
    REQUIRE(MORE(), REG_EBRACK);
    c = PEEK();
    REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
    p_b_eclass(p, cs);
    REQUIRE(MORE(), REG_EBRACK);
    REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
    break;
  default: /* symbol, ordinary character, or range */
           /* xxx revision needed for multichar stuff */
    start = p_b_symbol(p);
    if (SEE('-') && MORE2() && PEEK2() != ']') {
      /* range */
      NEXT();
      if (EAT('-'))
        finish = '-';
      else
        finish = p_b_symbol(p);
    } else {
      finish = start;
    }
    /* xxx what about signed chars here... */
    REQUIRE(start <= finish, REG_ERANGE);
    for (i = start; i <= finish; i++)
      CHadd(cs, i);
    break;
  }
}

/*
 - p_b_cclass - parse a character-class name and deal with it
 */
static void p_b_cclass(struct parse *p, cset *cs) {
  const char *sp = p->next;
  struct cclass *cp;
  size_t len;
  const char *u;
  char c;

  while (MORE() && isalpha((uch)PEEK()))
    NEXT();
  len = p->next - sp;
  for (cp = cclasses; cp->name != NULL; cp++)
    if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
      break;
  if (cp->name == NULL) {
    /* oops, didn't find it */
    SETERROR(REG_ECTYPE);
    return;
  }

  u = cp->chars;
  while ((c = *u++) != '\0')
    CHadd(cs, c);
  for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
    MCadd(p, cs, u);
}

/*
 - p_b_eclass - parse an equivalence-class name and deal with it
 *
 * This implementation is incomplete. xxx
 */
static void p_b_eclass(struct parse *p, cset *cs) {
  char c;

  c = p_b_coll_elem(p, '=');
  CHadd(cs, c);
}

/*
 - p_b_symbol - parse a character or [..]ed multicharacter collating symbol
 */
static char /* value of symbol */
p_b_symbol(struct parse *p) {
  char value;

  REQUIRE(MORE(), REG_EBRACK);
  if (!EATTWO('[', '.'))
    return (GETNEXT());

  /* collating symbol */
  value = p_b_coll_elem(p, '.');
  REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
  return (value);
}

/*
 - p_b_coll_elem - parse a collating-element name and look it up
 */
static char                              /* value of collating element */
p_b_coll_elem(struct parse *p, int endc) /* name ended by endc,']' */
{
  const char *sp = p->next;
  struct cname *cp;
  size_t len;

  while (MORE() && !SEETWO(endc, ']'))
    NEXT();
  if (!MORE()) {
    SETERROR(REG_EBRACK);
    return (0);
  }
  len = p->next - sp;
  for (cp = cnames; cp->name != NULL; cp++)
    if (strncmp(cp->name, sp, len) == 0 && strlen(cp->name) == len)
      return (cp->code); /* known name */
  if (len == 1)
    return (*sp);         /* single character */
  SETERROR(REG_ECOLLATE); /* neither */
  return (0);
}

/*
 - othercase - return the case counterpart of an alphabetic
 */
static char /* if no counterpart, return ch */
othercase(int ch) {
  ch = (uch)ch;
  assert(isalpha(ch));
  if (isupper(ch))
    return ((uch)tolower(ch));
  else if (islower(ch))
    return ((uch)toupper(ch));
  else /* peculiar, but could happen */
    return (ch);
}

/*
 - bothcases - emit a dualcase version of a two-case character
 *
 * Boy, is this implementation ever a kludge...
 */
static void bothcases(struct parse *p, int ch) {
  const char *oldnext = p->next;
  const char *oldend = p->end;
  char bracket[3];

  ch = (uch)ch;
  assert(othercase(ch) != ch); /* p_bracket() would recurse */
  p->next = bracket;
  p->end = bracket + 2;
  bracket[0] = ch;
  bracket[1] = ']';
  bracket[2] = '\0';
  p_bracket(p);
  assert(p->next == bracket + 2);
  p->next = oldnext;
  p->end = oldend;
}

/*
 - ordinary - emit an ordinary character
 */
static void ordinary(struct parse *p, int ch) {
  cat_t *cap = p->g->categories;

  if ((p->g->cflags & REG_ICASE) && isalpha((uch)ch) && othercase(ch) != ch)
    bothcases(p, ch);
  else {
    EMIT(OCHAR, (uch)ch);
    if (cap[ch] == 0)
      cap[ch] = p->g->ncategories++;
  }
}

/*
 - nonnewline - emit REG_NEWLINE version of OANY
 *
 * Boy, is this implementation ever a kludge...
 */
static void nonnewline(struct parse *p) {
  const char *oldnext = p->next;
  const char *oldend = p->end;
  static const char bracket[4] = {'^', '\n', ']', '\0'};

  p->next = bracket;
  p->end = bracket + 3;
  p_bracket(p);
  assert(p->next == bracket + 3);
  p->next = oldnext;
  p->end = oldend;
}

/*
 - repeat - generate code for a bounded repetition, recursively if needed
 */
static void repeat(struct parse *p,
                   sopno start, /* operand from here to end of strip */
                   int from,    /* repeated from this number */
                   int to)      /* to this number of times (maybe INFINITY) */
{
  sopno finish = HERE();
#define N 2
#define INF 3
#define REP(f, t) ((f) * 8 + (t))
#define MAP(n) (((n) <= 1) ? (n) : ((n) == REGINFINITY) ? INF : N)
  sopno copy;

  if (p->error != 0) /* head off possible runaway recursion */
    return;

  assert(from <= to);

  switch (REP(MAP(from), MAP(to))) {
  case REP(0, 0):         /* must be user doing this */
    DROP(finish - start); /* drop the operand */
    break;
  case REP(0, 1):   /* as x{1,1}? */
  case REP(0, N):   /* as x{1,n}? */
  case REP(0, INF): /* as x{1,}? */
    /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
    INSERT(OCH_, start); /* offset is wrong... */
    repeat(p, start + 1, 1, to);
    ASTERN(OOR1, start);
    AHEAD(start); /* ... fix it */
    EMIT(OOR2, 0);
    AHEAD(THERE());
    ASTERN(O_CH, THERETHERE());
    break;
  case REP(1, 1): /* trivial case */
    /* done */
    break;
  case REP(1, N): /* as x?x{1,n-1} */
    /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
    INSERT(OCH_, start);
    ASTERN(OOR1, start);
    AHEAD(start);
    EMIT(OOR2, 0);  /* offset very wrong... */
    AHEAD(THERE()); /* ...so fix it */
    ASTERN(O_CH, THERETHERE());
    copy = dupl(p, start + 1, finish + 1);
    assert(copy == finish + 4);
    repeat(p, copy, 1, to - 1);
    break;
  case REP(1, INF): /* as x+ */
    INSERT(OPLUS_, start);
    ASTERN(O_PLUS, start);
    break;
  case REP(N, N): /* as xx{m-1,n-1} */
    copy = dupl(p, start, finish);
    repeat(p, copy, from - 1, to - 1);
    break;
  case REP(N, INF): /* as xx{n-1,INF} */
    copy = dupl(p, start, finish);
    repeat(p, copy, from - 1, to);
    break;
  default:                /* "can't happen" */
    SETERROR(REG_ASSERT); /* just in case */
    break;
  }
}

/*
 - seterr - set an error condition
 */
static int /* useless but makes type checking happy */
seterr(struct parse *p, int e) {
  if (p->error == 0) /* keep earliest error condition */
    p->error = e;
  p->next = nuls; /* try to bring things to a halt */
  p->end = nuls;
  return (0); /* make the return value well-defined */
}

/*
 - allocset - allocate a set of characters for []
 */
static cset *allocset(struct parse *p) {
  int no = p->g->ncsets++;
  size_t nc;
  size_t nbytes;
  cset *cs;
  size_t css = (size_t)p->g->csetsize;
  int i;

  if (no >= p->ncsalloc) { /* need another column of space */
    void *ptr;

    p->ncsalloc += CHAR_BIT;
    nc = p->ncsalloc;
    if (nc > SIZE_MAX / sizeof(cset))
      goto nomem;
    assert(nc % CHAR_BIT == 0);
    nbytes = nc / CHAR_BIT * css;

    ptr = (cset *)realloc((char *)p->g->sets, nc * sizeof(cset));
    if (ptr == NULL)
      goto nomem;
    p->g->sets = ptr;

    ptr = (uch *)realloc((char *)p->g->setbits, nbytes);
    if (ptr == NULL)
      goto nomem;
    p->g->setbits = ptr;

    for (i = 0; i < no; i++)
      p->g->sets[i].ptr = p->g->setbits + css * (i / CHAR_BIT);

    (void)memset((char *)p->g->setbits + (nbytes - css), 0, css);
  }
  /* XXX should not happen */
  if (p->g->sets == NULL || p->g->setbits == NULL)
    goto nomem;

  cs = &p->g->sets[no];
  cs->ptr = p->g->setbits + css * ((no) / CHAR_BIT);
  cs->mask = 1 << ((no) % CHAR_BIT);
  cs->hash = 0;
  cs->smultis = 0;
  cs->multis = NULL;

  return (cs);
nomem:
  free(p->g->sets);
  p->g->sets = NULL;
  free(p->g->setbits);
  p->g->setbits = NULL;

  SETERROR(REG_ESPACE);
  /* caller's responsibility not to do set ops */
  return (NULL);
}

/*
 - freeset - free a now-unused set
 */
static void freeset(struct parse *p, cset *cs) {
  size_t i;
  cset *top = &p->g->sets[p->g->ncsets];
  size_t css = (size_t)p->g->csetsize;

  for (i = 0; i < css; i++)
    CHsub(cs, i);
  if (cs == top - 1) /* recover only the easy case */
    p->g->ncsets--;
}

/*
 - freezeset - final processing on a set of characters
 *
 * The main task here is merging identical sets.  This is usually a waste
 * of time (although the hash code minimizes the overhead), but can win
 * big if REG_ICASE is being used.  REG_ICASE, by the way, is why the hash
 * is done using addition rather than xor -- all ASCII [aA] sets xor to
 * the same value!
 */
static int /* set number */
freezeset(struct parse *p, cset *cs) {
  uch h = cs->hash;
  size_t i;
  cset *top = &p->g->sets[p->g->ncsets];
  cset *cs2;
  size_t css = (size_t)p->g->csetsize;

  /* look for an earlier one which is the same */
  for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
    if (cs2->hash == h && cs2 != cs) {
      /* maybe */
      for (i = 0; i < css; i++)
        if (!!CHIN(cs2, i) != !!CHIN(cs, i))
          break; /* no */
      if (i == css)
        break; /* yes */
    }

  if (cs2 < top) { /* found one */
    freeset(p, cs);
    cs = cs2;
  }

  return ((int)(cs - p->g->sets));
}

/*
 - firstch - return first character in a set (which must have at least one)
 */
static int /* character; there is no "none" value */
firstch(struct parse *p, cset *cs) {
  size_t i;
  size_t css = (size_t)p->g->csetsize;

  for (i = 0; i < css; i++)
    if (CHIN(cs, i))
      return ((char)i);
  assert(never);
  return (0); /* arbitrary */
}

/*
 - nch - number of characters in a set
 */
static int nch(struct parse *p, cset *cs) {
  size_t i;
  size_t css = (size_t)p->g->csetsize;
  int n = 0;

  for (i = 0; i < css; i++)
    if (CHIN(cs, i))
      n++;
  return (n);
}

/*
 - mcadd - add a collating element to a cset
 */
static void mcadd(struct parse *p, cset *cs, const char *cp) {
  size_t oldend = cs->smultis;
  void *np;

  cs->smultis += strlen(cp) + 1;
  np = realloc(cs->multis, cs->smultis);
  if (np == NULL) {
    if (cs->multis)
      free(cs->multis);
    cs->multis = NULL;
    SETERROR(REG_ESPACE);
    return;
  }
  cs->multis = np;

  llvm_strlcpy(cs->multis + oldend - 1, cp, cs->smultis - oldend + 1);
}

/*
 - mcinvert - invert the list of collating elements in a cset
 *
 * This would have to know the set of possibilities.  Implementation
 * is deferred.
 */
/* ARGSUSED */
static void mcinvert(struct parse *p, cset *cs) {
  assert(cs->multis == NULL); /* xxx */
}

/*
 - mccase - add case counterparts of the list of collating elements in a cset
 *
 * This would have to know the set of possibilities.  Implementation
 * is deferred.
 */
/* ARGSUSED */
static void mccase(struct parse *p, cset *cs) {
  assert(cs->multis == NULL); /* xxx */
}

/*
 - isinsets - is this character in any sets?
 */
static int /* predicate */
isinsets(struct re_guts *g, int c) {
  uch *col;
  int i;
  int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT;
  unsigned uc = (uch)c;

  for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
    if (col[uc] != 0)
      return (1);
  return (0);
}

/*
 - samesets - are these two characters in exactly the same sets?
 */
static int /* predicate */
samesets(struct re_guts *g, int c1, int c2) {
  uch *col;
  int i;
  int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT;
  unsigned uc1 = (uch)c1;
  unsigned uc2 = (uch)c2;

  for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
    if (col[uc1] != col[uc2])
      return (0);
  return (1);
}

/*
 - categorize - sort out character categories
 */
static void categorize(struct parse *p, struct re_guts *g) {
  cat_t *cats = g->categories;
  int c;
  int c2;
  cat_t cat;

  /* avoid making error situations worse */
  if (p->error != 0)
    return;

  for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    if (cats[c] == 0 && isinsets(g, c)) {
      cat = g->ncategories++;
      cats[c] = cat;
      for (c2 = c + 1; c2 <= CHAR_MAX; c2++)
        if (cats[c2] == 0 && samesets(g, c, c2))
          cats[c2] = cat;
    }
}

/*
 - dupl - emit a duplicate of a bunch of sops
 */
static sopno                       /* start of duplicate */
dupl(struct parse *p, sopno start, /* from here */
     sopno finish)                 /* to this less one */
{
  sopno ret = HERE();
  sopno len = finish - start;

  assert(finish >= start);
  if (len == 0)
    return (ret);
  enlarge(p, p->ssize + len); /* this many unexpected additions */
  assert(p->ssize >= p->slen + len);
  (void)memmove((char *)(p->strip + p->slen), (char *)(p->strip + start),
                (size_t)len * sizeof(sop));
  p->slen += len;
  return (ret);
}

/*
 - doemit - emit a strip operator
 *
 * It might seem better to implement this as a macro with a function as
 * hard-case backup, but it's just too big and messy unless there are
 * some changes to the data structures.  Maybe later.
 */
static void doemit(struct parse *p, sop op, size_t opnd) {
  /* avoid making error situations worse */
  if (p->error != 0)
    return;

  /* deal with oversize operands ("can't happen", more or less) */
  assert(opnd < 1 << OPSHIFT);

  /* deal with undersized strip */
  if (p->slen >= p->ssize)
    enlarge(p, (p->ssize + 1) / 2 * 3); /* +50% */
  assert(p->slen < p->ssize);

  /* finally, it's all reduced to the easy case */
  p->strip[p->slen++] = SOP(op, opnd);
}

/*
 - doinsert - insert a sop into the strip
 */
static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos) {
  sopno sn;
  sop s;
  int i;

  /* avoid making error situations worse */
  if (p->error != 0)
    return;

  sn = HERE();
  EMIT(op, opnd); /* do checks, ensure space */
  assert(HERE() == sn + 1);
  s = p->strip[sn];

  /* adjust paren pointers */
  assert(pos > 0);
  for (i = 1; i < NPAREN; i++) {
    if (p->pbegin[i] >= pos) {
      p->pbegin[i]++;
    }
    if (p->pend[i] >= pos) {
      p->pend[i]++;
    }
  }

  memmove((char *)&p->strip[pos + 1], (char *)&p->strip[pos],
          (HERE() - pos - 1) * sizeof(sop));
  p->strip[pos] = s;
}

/*
 - dofwd - complete a forward reference
 */
static void dofwd(struct parse *p, sopno pos, sop value) {
  /* avoid making error situations worse */
  if (p->error != 0)
    return;

  assert(value < 1 << OPSHIFT);
  p->strip[pos] = OP(p->strip[pos]) | value;
}

/*
 - enlarge - enlarge the strip
 */
static void enlarge(struct parse *p, sopno size) {
  sop *sp;

  if (p->ssize >= size)
    return;

  if ((uintptr_t)size > SIZE_MAX / sizeof(sop)) {
    SETERROR(REG_ESPACE);
    return;
  }

  sp = (sop *)realloc(p->strip, size * sizeof(sop));
  if (sp == NULL) {
    SETERROR(REG_ESPACE);
    return;
  }
  p->strip = sp;
  p->ssize = size;
}

/*
 - stripsnug - compact the strip
 */
static void stripsnug(struct parse *p, struct re_guts *g) {
  g->nstates = p->slen;
  if ((uintptr_t)p->slen > SIZE_MAX / sizeof(sop)) {
    g->strip = p->strip;
    SETERROR(REG_ESPACE);
    return;
  }

  g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
  if (g->strip == NULL) {
    SETERROR(REG_ESPACE);
    g->strip = p->strip;
  }
}

/*
 - findmust - fill in must and mlen with longest mandatory literal string
 *
 * This algorithm could do fancy things like analyzing the operands of |
 * for common subsequences.  Someday.  This code is simple and finds most
 * of the interesting cases.
 *
 * Note that must and mlen got initialized during setup.
 */
static void findmust(struct parse *p, struct re_guts *g) {
  sop *scan;
  sop *start = 0;    /* start initialized in the default case, after that */
  sop *newstart = 0; /* newstart was initialized in the OCHAR case */
  sopno newlen;
  sop s;
  char *cp;
  sopno i;

  /* avoid making error situations worse */
  if (p->error != 0)
    return;

  /* find the longest OCHAR sequence in strip */
  newlen = 0;
  scan = g->strip + 1;
  do {
    s = *scan++;
    switch (OP(s)) {
    case OCHAR:        /* sequence member */
      if (newlen == 0) /* new sequence */
        newstart = scan - 1;
      newlen++;
      break;
    case OPLUS_: /* things that don't break one */
    case OLPAREN:
    case ORPAREN:
      break;
    case OQUEST_: /* things that must be skipped */
    case OCH_:
      scan--;
      do {
        scan += OPND(s);
        s = *scan;
        /* assert() interferes w debug printouts */
        if (OP(s) != O_QUEST && OP(s) != O_CH && OP(s) != OOR2) {
          g->iflags |= REGEX_BAD;
          return;
        }
      } while (OP(s) != O_QUEST && OP(s) != O_CH);
      LLVM_FALLTHROUGH;
    default:                  /* things that break a sequence */
      if (newlen > g->mlen) { /* ends one */
        start = newstart;
        g->mlen = newlen;
      }
      newlen = 0;
      break;
    }
  } while (OP(s) != OEND);

  if (g->mlen == 0) /* there isn't one */
    return;

  /* turn it into a character string */
  g->must = malloc((size_t)g->mlen + 1);
  if (g->must == NULL) { /* argh; just forget it */
    g->mlen = 0;
    return;
  }
  cp = g->must;
  scan = start;
  for (i = g->mlen; i > 0; i--) {
    while (OP(s = *scan++) != OCHAR)
      continue;
    assert(cp < g->must + g->mlen);
    *cp++ = (char)OPND(s);
  }
  assert(cp == g->must + g->mlen);
  *cp++ = '\0'; /* just on general principles */
}

/*
 - pluscount - count + nesting
 */
static sopno /* nesting depth */
pluscount(struct parse *p, struct re_guts *g) {
  sop *scan;
  sop s;
  sopno plusnest = 0;
  sopno maxnest = 0;

  if (p->error != 0)
    return (0); /* there may not be an OEND */

  scan = g->strip + 1;
  do {
    s = *scan++;
    switch (OP(s)) {
    case OPLUS_:
      plusnest++;
      break;
    case O_PLUS:
      if (plusnest > maxnest)
        maxnest = plusnest;
      plusnest--;
      break;
    }
  } while (OP(s) != OEND);
  if (plusnest != 0)
    g->iflags |= REGEX_BAD;
  return (maxnest);
}
