aboutsummaryrefslogtreecommitdiff
path: root/src/backend/regex
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/regex')
-rw-r--r--src/backend/regex/regcomp.c342
-rw-r--r--src/backend/regex/regexec.c65
2 files changed, 230 insertions, 177 deletions
diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c
index 473738040bb..e6ff3653a77 100644
--- a/src/backend/regex/regcomp.c
+++ b/src/backend/regex/regcomp.c
@@ -38,158 +38,200 @@
* forward declarations, up here so forward datatypes etc. are defined early
*/
/* === regcomp.c === */
-static void moresubs(struct vars *, int);
-static int freev(struct vars *, int);
-static void makesearch(struct vars *, struct nfa *);
-static struct subre *parse(struct vars *, int, int, struct state *, struct state *);
-static struct subre *parsebranch(struct vars *, int, int, struct state *, struct state *, int);
-static struct subre *parseqatom(struct vars *, int, int, struct state *, struct state *, struct subre *);
-static void nonword(struct vars *, int, struct state *, struct state *);
-static void word(struct vars *, int, struct state *, struct state *);
-static void charclass(struct vars *, enum char_classes,
- struct state *, struct state *);
-static void charclasscomplement(struct vars *, enum char_classes,
- struct state *, struct state *);
-static int scannum(struct vars *);
-static void repeat(struct vars *, struct state *, struct state *, int, int);
-static void bracket(struct vars *, struct state *, struct state *);
-static void cbracket(struct vars *, struct state *, struct state *);
-static void brackpart(struct vars *, struct state *, struct state *, bool *);
-static const chr *scanplain(struct vars *);
-static void onechr(struct vars *, chr, struct state *, struct state *);
-static void optimizebracket(struct vars *, struct state *, struct state *);
-static void wordchrs(struct vars *);
-static void processlacon(struct vars *, struct state *, struct state *, int,
- struct state *, struct state *);
-static struct subre *subre(struct vars *, int, int, struct state *, struct state *);
-static void freesubre(struct vars *, struct subre *);
-static void freesubreandsiblings(struct vars *, struct subre *);
-static void freesrnode(struct vars *, struct subre *);
-static void removecaptures(struct vars *, struct subre *);
-static int numst(struct subre *, int);
-static void markst(struct subre *);
-static void cleanst(struct vars *);
-static long nfatree(struct vars *, struct subre *, FILE *);
-static long nfanode(struct vars *, struct subre *, int, FILE *);
-static int newlacon(struct vars *, struct state *, struct state *, int);
-static void freelacons(struct subre *, int);
-static void rfree(regex_t *);
+static void moresubs(struct vars *v, int wanted);
+static int freev(struct vars *v, int err);
+static void makesearch(struct vars *v, struct nfa *nfa);
+static struct subre *parse(struct vars *v, int stopper, int type,
+ struct state *init, struct state *final);
+static struct subre *parsebranch(struct vars *v, int stopper, int type,
+ struct state *left, struct state *right,
+ int partial);
+static struct subre *parseqatom(struct vars *v, int stopper, int type,
+ struct state *lp, struct state *rp,
+ struct subre *top);
+static void nonword(struct vars *v, int dir, struct state *lp,
+ struct state *rp);
+static void word(struct vars *v, int dir, struct state *lp, struct state *rp);
+static void charclass(struct vars *v, enum char_classes cls, struct state *lp,
+ struct state *rp);
+static void charclasscomplement(struct vars *v, enum char_classes cls,
+ struct state *lp, struct state *rp);
+static int scannum(struct vars *v);
+static void repeat(struct vars *v, struct state *lp, struct state *rp,
+ int m, int n);
+static void bracket(struct vars *v, struct state *lp, struct state *rp);
+static void cbracket(struct vars *v, struct state *lp, struct state *rp);
+static void brackpart(struct vars *v, struct state *lp, struct state *rp,
+ bool *have_cclassc);
+static const chr *scanplain(struct vars *v);
+static void onechr(struct vars *v, chr c, struct state *lp, struct state *rp);
+static void optimizebracket(struct vars *v, struct state *lp, struct state *rp);
+static void wordchrs(struct vars *v);
+static void processlacon(struct vars *v, struct state *begin,
+ struct state *end, int latype,
+ struct state *lp, struct state *rp);
+static struct subre *subre(struct vars *v, int op, int flags,
+ struct state *begin, struct state *end);
+static void freesubre(struct vars *v, struct subre *sr);
+static void freesubreandsiblings(struct vars *v, struct subre *sr);
+static void freesrnode(struct vars *v, struct subre *sr);
+static void removecaptures(struct vars *v, struct subre *t);
+static int numst(struct subre *t, int start);
+static void markst(struct subre *t);
+static void cleanst(struct vars *v);
+static long nfatree(struct vars *v, struct subre *t, FILE *f);
+static long nfanode(struct vars *v, struct subre *t,
+ int converttosearch, FILE *f);
+static int newlacon(struct vars *v, struct state *begin, struct state *end,
+ int latype);
+static void freelacons(struct subre *subs, int n);
+static void rfree(regex_t *re);
static int rcancelrequested(void);
static int rstacktoodeep(void);
#ifdef REG_DEBUG
-static void dump(regex_t *, FILE *);
-static void dumpst(struct subre *, FILE *, int);
-static void stdump(struct subre *, FILE *, int);
-static const char *stid(struct subre *, char *, size_t);
+static void dump(regex_t *re, FILE *f);
+static void dumpst(struct subre *t, FILE *f, int nfapresent);
+static void stdump(struct subre *t, FILE *f, int nfapresent);
+static const char *stid(struct subre *t, char *buf, size_t bufsize);
#endif
/* === regc_lex.c === */
-static void lexstart(struct vars *);
-static void prefixes(struct vars *);
-static int next(struct vars *);
-static int lexescape(struct vars *);
-static chr lexdigits(struct vars *, int, int, int);
-static int brenext(struct vars *, chr);
-static void skip(struct vars *);
+static void lexstart(struct vars *v);
+static void prefixes(struct vars *v);
+static int next(struct vars *v);
+static int lexescape(struct vars *v);
+static chr lexdigits(struct vars *v, int base, int minlen, int maxlen);
+static int brenext(struct vars *v, chr c);
+static void skip(struct vars *v);
static chr newline(void);
-static chr chrnamed(struct vars *, const chr *, const chr *, chr);
+static chr chrnamed(struct vars *v, const chr *startp, const chr *endp,
+ chr lastresort);
/* === regc_color.c === */
-static void initcm(struct vars *, struct colormap *);
-static void freecm(struct colormap *);
-static color maxcolor(struct colormap *);
-static color newcolor(struct colormap *);
-static void freecolor(struct colormap *, color);
-static color pseudocolor(struct colormap *);
-static color subcolor(struct colormap *, chr);
-static color subcolorhi(struct colormap *, color *);
-static color newsub(struct colormap *, color);
-static int newhicolorrow(struct colormap *, int);
-static void newhicolorcols(struct colormap *);
-static void subcolorcvec(struct vars *, struct cvec *, struct state *, struct state *);
-static void subcoloronechr(struct vars *, chr, struct state *, struct state *, color *);
-static void subcoloronerange(struct vars *, chr, chr, struct state *, struct state *, color *);
-static void subcoloronerow(struct vars *, int, struct state *, struct state *, color *);
-static void okcolors(struct nfa *, struct colormap *);
-static void colorchain(struct colormap *, struct arc *);
-static void uncolorchain(struct colormap *, struct arc *);
-static void rainbow(struct nfa *, struct colormap *, int, color, struct state *, struct state *);
-static void colorcomplement(struct nfa *, struct colormap *, int, struct state *, struct state *, struct state *);
+static void initcm(struct vars *v, struct colormap *cm);
+static void freecm(struct colormap *cm);
+static color maxcolor(struct colormap *cm);
+static color newcolor(struct colormap *cm);
+static void freecolor(struct colormap *cm, color co);
+static color pseudocolor(struct colormap *cm);
+static color subcolor(struct colormap *cm, chr c);
+static color subcolorhi(struct colormap *cm, color *pco);
+static color newsub(struct colormap *cm, color co);
+static int newhicolorrow(struct colormap *cm, int oldrow);
+static void newhicolorcols(struct colormap *cm);
+static void subcolorcvec(struct vars *v, struct cvec *cv, struct state *lp,
+ struct state *rp);
+static void subcoloronechr(struct vars *v, chr ch, struct state *lp,
+ struct state *rp, color *lastsubcolor);
+static void subcoloronerange(struct vars *v, chr from, chr to,
+ struct state *lp, struct state *rp,
+ color *lastsubcolor);
+static void subcoloronerow(struct vars *v, int rownum, struct state *lp,
+ struct state *rp, color *lastsubcolor);
+static void okcolors(struct nfa *nfa, struct colormap *cm);
+static void colorchain(struct colormap *cm, struct arc *a);
+static void uncolorchain(struct colormap *cm, struct arc *a);
+static void rainbow(struct nfa *nfa, struct colormap *cm, int type, color but,
+ struct state *from, struct state *to);
+static void colorcomplement(struct nfa *nfa, struct colormap *cm, int type,
+ struct state *of, struct state *from,
+ struct state *to);
#ifdef REG_DEBUG
-static void dumpcolors(struct colormap *, FILE *);
-static void dumpchr(chr, FILE *);
+static void dumpcolors(struct colormap *cm, FILE *f);
+static void dumpchr(chr c, FILE *f);
#endif
/* === regc_nfa.c === */
-static struct nfa *newnfa(struct vars *, struct colormap *, struct nfa *);
-static void freenfa(struct nfa *);
-static struct state *newstate(struct nfa *);
-static struct state *newfstate(struct nfa *, int flag);
-static void dropstate(struct nfa *, struct state *);
-static void freestate(struct nfa *, struct state *);
-static void newarc(struct nfa *, int, color, struct state *, struct state *);
-static void createarc(struct nfa *, int, color, struct state *, struct state *);
-static struct arc *allocarc(struct nfa *);
-static void freearc(struct nfa *, struct arc *);
-static void changearcsource(struct arc *, struct state *);
-static void changearctarget(struct arc *, struct state *);
-static int hasnonemptyout(struct state *);
-static struct arc *findarc(struct state *, int, color);
-static void cparc(struct nfa *, struct arc *, struct state *, struct state *);
-static void sortins(struct nfa *, struct state *);
-static int sortins_cmp(const void *, const void *);
-static void sortouts(struct nfa *, struct state *);
-static int sortouts_cmp(const void *, const void *);
-static void moveins(struct nfa *, struct state *, struct state *);
-static void copyins(struct nfa *, struct state *, struct state *);
-static void mergeins(struct nfa *, struct state *, struct arc **, int);
-static void moveouts(struct nfa *, struct state *, struct state *);
-static void copyouts(struct nfa *, struct state *, struct state *);
-static void cloneouts(struct nfa *, struct state *, struct state *, struct state *, int);
-static void delsub(struct nfa *, struct state *, struct state *);
-static void deltraverse(struct nfa *, struct state *, struct state *);
-static void dupnfa(struct nfa *, struct state *, struct state *, struct state *, struct state *);
-static void duptraverse(struct nfa *, struct state *, struct state *);
-static void removeconstraints(struct nfa *, struct state *, struct state *);
-static void removetraverse(struct nfa *, struct state *);
-static void cleartraverse(struct nfa *, struct state *);
-static struct state *single_color_transition(struct state *, struct state *);
-static void specialcolors(struct nfa *);
-static long optimize(struct nfa *, FILE *);
-static void pullback(struct nfa *, FILE *);
-static int pull(struct nfa *, struct arc *, struct state **);
-static void pushfwd(struct nfa *, FILE *);
-static int push(struct nfa *, struct arc *, struct state **);
+static struct nfa *newnfa(struct vars *v, struct colormap *cm,
+ struct nfa *parent);
+static void freenfa(struct nfa *nfa);
+static struct state *newstate(struct nfa *nfa);
+static struct state *newfstate(struct nfa *nfa, int flag);
+static void dropstate(struct nfa *nfa, struct state *s);
+static void freestate(struct nfa *nfa, struct state *s);
+static void newarc(struct nfa *nfa, int t, color co,
+ struct state *from, struct state *to);
+static void createarc(struct nfa *nfa, int t, color co,
+ struct state *from, struct state *to);
+static struct arc *allocarc(struct nfa *nfa);
+static void freearc(struct nfa *nfa, struct arc *victim);
+static void changearcsource(struct arc *a, struct state *newfrom);
+static void changearctarget(struct arc *a, struct state *newto);
+static int hasnonemptyout(struct state *s);
+static struct arc *findarc(struct state *s, int type, color co);
+static void cparc(struct nfa *nfa, struct arc *oa,
+ struct state *from, struct state *to);
+static void sortins(struct nfa *nfa, struct state *s);
+static int sortins_cmp(const void *a, const void *b);
+static void sortouts(struct nfa *nfa, struct state *s);
+static int sortouts_cmp(const void *a, const void *b);
+static void moveins(struct nfa *nfa, struct state *oldState,
+ struct state *newState);
+static void copyins(struct nfa *nfa, struct state *oldState,
+ struct state *newState);
+static void mergeins(struct nfa *nfa, struct state *s,
+ struct arc **arcarray, int arccount);
+static void moveouts(struct nfa *nfa, struct state *oldState,
+ struct state *newState);
+static void copyouts(struct nfa *nfa, struct state *oldState,
+ struct state *newState);
+static void cloneouts(struct nfa *nfa, struct state *old, struct state *from,
+ struct state *to, int type);
+static void delsub(struct nfa *nfa, struct state *lp, struct state *rp);
+static void deltraverse(struct nfa *nfa, struct state *leftend,
+ struct state *s);
+static void dupnfa(struct nfa *nfa, struct state *start, struct state *stop,
+ struct state *from, struct state *to);
+static void duptraverse(struct nfa *nfa, struct state *s, struct state *stmp);
+static void removeconstraints(struct nfa *nfa, struct state *start, struct state *stop);
+static void removetraverse(struct nfa *nfa, struct state *s);
+static void cleartraverse(struct nfa *nfa, struct state *s);
+static struct state *single_color_transition(struct state *s1,
+ struct state *s2);
+static void specialcolors(struct nfa *nfa);
+static long optimize(struct nfa *nfa, FILE *f);
+static void pullback(struct nfa *nfa, FILE *f);
+static int pull(struct nfa *nfa, struct arc *con,
+ struct state **intermediates);
+static void pushfwd(struct nfa *nfa, FILE *f);
+static int push(struct nfa *nfa, struct arc *con,
+ struct state **intermediates);
#define INCOMPATIBLE 1 /* destroys arc */
#define SATISFIED 2 /* constraint satisfied */
#define COMPATIBLE 3 /* compatible but not satisfied yet */
#define REPLACEARC 4 /* replace arc's color with constraint color */
static int combine(struct nfa *nfa, struct arc *con, struct arc *a);
-static void fixempties(struct nfa *, FILE *);
-static struct state *emptyreachable(struct nfa *, struct state *,
- struct state *, struct arc **);
-static int isconstraintarc(struct arc *);
-static int hasconstraintout(struct state *);
-static void fixconstraintloops(struct nfa *, FILE *);
-static int findconstraintloop(struct nfa *, struct state *);
-static void breakconstraintloop(struct nfa *, struct state *);
-static void clonesuccessorstates(struct nfa *, struct state *, struct state *,
- struct state *, struct arc *,
- char *, char *, int);
-static void cleanup(struct nfa *);
-static void markreachable(struct nfa *, struct state *, struct state *, struct state *);
-static void markcanreach(struct nfa *, struct state *, struct state *, struct state *);
-static long analyze(struct nfa *);
-static void checkmatchall(struct nfa *);
-static bool checkmatchall_recurse(struct nfa *, struct state *, bool **);
-static bool check_out_colors_match(struct state *, color, color);
-static bool check_in_colors_match(struct state *, color, color);
-static void compact(struct nfa *, struct cnfa *);
-static void carcsort(struct carc *, size_t);
-static int carc_cmp(const void *, const void *);
-static void freecnfa(struct cnfa *);
-static void dumpnfa(struct nfa *, FILE *);
+static void fixempties(struct nfa *nfa, FILE *f);
+static struct state *emptyreachable(struct nfa *nfa, struct state *s,
+ struct state *lastfound,
+ struct arc **inarcsorig);
+static int isconstraintarc(struct arc *a);
+static int hasconstraintout(struct state *s);
+static void fixconstraintloops(struct nfa *nfa, FILE *f);
+static int findconstraintloop(struct nfa *nfa, struct state *s);
+static void breakconstraintloop(struct nfa *nfa, struct state *sinitial);
+static void clonesuccessorstates(struct nfa *nfa, struct state *ssource,
+ struct state *sclone,
+ struct state *spredecessor,
+ struct arc *refarc, char *curdonemap,
+ char *outerdonemap, int nstates);
+static void cleanup(struct nfa *nfa);
+static void markreachable(struct nfa *nfa, struct state *s,
+ struct state *okay, struct state *mark);
+static void markcanreach(struct nfa *nfa, struct state *s, struct state *okay,
+ struct state *mark);
+static long analyze(struct nfa *nfa);
+static void checkmatchall(struct nfa *nfa);
+static bool checkmatchall_recurse(struct nfa *nfa, struct state *s,
+ bool **haspaths);
+static bool check_out_colors_match(struct state *s, color co1, color co2);
+static bool check_in_colors_match(struct state *s, color co1, color co2);
+static void compact(struct nfa *nfa, struct cnfa *cnfa);
+static void carcsort(struct carc *first, size_t n);
+static int carc_cmp(const void *a, const void *b);
+static void freecnfa(struct cnfa *cnfa);
+static void dumpnfa(struct nfa *nfa, FILE *f);
#ifdef REG_DEBUG
static void dumpstate(struct state *, FILE *);
@@ -199,12 +241,12 @@ static void dumpcnfa(struct cnfa *, FILE *);
static void dumpcstate(int, struct cnfa *, FILE *);
#endif
/* === regc_cvec.c === */
-static struct cvec *newcvec(int, int);
-static struct cvec *clearcvec(struct cvec *);
-static void addchr(struct cvec *, chr);
-static void addrange(struct cvec *, chr, chr);
-static struct cvec *getcvec(struct vars *, int, int);
-static void freecvec(struct cvec *);
+static struct cvec *newcvec(int nchrs, int nranges);
+static struct cvec *clearcvec(struct cvec *cv);
+static void addchr(struct cvec *cv, chr c);
+static void addrange(struct cvec *cv, chr from, chr to);
+static struct cvec *getcvec(struct vars *v, int nchrs, int nranges);
+static void freecvec(struct cvec *cv);
/* === regc_pg_locale.c === */
static int pg_wc_isdigit(pg_wchar c);
@@ -221,16 +263,18 @@ static pg_wchar pg_wc_toupper(pg_wchar c);
static pg_wchar pg_wc_tolower(pg_wchar c);
/* === regc_locale.c === */
-static chr element(struct vars *, const chr *, const chr *);
-static struct cvec *range(struct vars *, chr, chr, int);
-static int before(chr, chr);
-static struct cvec *eclass(struct vars *, chr, int);
-static enum char_classes lookupcclass(struct vars *, const chr *, const chr *);
-static struct cvec *cclasscvec(struct vars *, enum char_classes, int);
-static int cclass_column_index(struct colormap *, chr);
-static struct cvec *allcases(struct vars *, chr);
-static int cmp(const chr *, const chr *, size_t);
-static int casecmp(const chr *, const chr *, size_t);
+static chr element(struct vars *v, const chr *startp, const chr *endp);
+static struct cvec *range(struct vars *v, chr a, chr b, int cases);
+static int before(chr x, chr y);
+static struct cvec *eclass(struct vars *v, chr c, int cases);
+static enum char_classes lookupcclass(struct vars *v, const chr *startp,
+ const chr *endp);
+static struct cvec *cclasscvec(struct vars *v, enum char_classes cclasscode,
+ int cases);
+static int cclass_column_index(struct colormap *cm, chr c);
+static struct cvec *allcases(struct vars *v, chr c);
+static int cmp(const chr *x, const chr *y, size_t len);
+static int casecmp(const chr *x, const chr *y, size_t len);
/* internal variables, bundled for easy passing around */
diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c
index 92715443606..29c364f3db1 100644
--- a/src/backend/regex/regexec.c
+++ b/src/backend/regex/regexec.c
@@ -137,36 +137,45 @@ struct vars
* forward declarations
*/
/* === regexec.c === */
-static struct dfa *getsubdfa(struct vars *, struct subre *);
-static struct dfa *getladfa(struct vars *, int);
-static int find(struct vars *, struct cnfa *, struct colormap *);
-static int cfind(struct vars *, struct cnfa *, struct colormap *);
-static int cfindloop(struct vars *, struct cnfa *, struct colormap *, struct dfa *, struct dfa *, chr **);
-static void zapallsubs(regmatch_t *, size_t);
-static void zaptreesubs(struct vars *, struct subre *);
-static void subset(struct vars *, struct subre *, chr *, chr *);
-static int cdissect(struct vars *, struct subre *, chr *, chr *);
-static int ccondissect(struct vars *, struct subre *, chr *, chr *);
-static int crevcondissect(struct vars *, struct subre *, chr *, chr *);
-static int cbrdissect(struct vars *, struct subre *, chr *, chr *);
-static int caltdissect(struct vars *, struct subre *, chr *, chr *);
-static int citerdissect(struct vars *, struct subre *, chr *, chr *);
-static int creviterdissect(struct vars *, struct subre *, chr *, chr *);
+static struct dfa *getsubdfa(struct vars *v, struct subre *t);
+static struct dfa *getladfa(struct vars *v, int n);
+static int find(struct vars *v, struct cnfa *cnfa, struct colormap *cm);
+static int cfind(struct vars *v, struct cnfa *cnfa, struct colormap *cm);
+static int cfindloop(struct vars *v, struct cnfa *cnfa, struct colormap *cm,
+ struct dfa *d, struct dfa *s, chr **coldp);
+static void zapallsubs(regmatch_t *p, size_t n);
+static void zaptreesubs(struct vars *v, struct subre *t);
+static void subset(struct vars *v, struct subre *sub, chr *begin, chr *end);
+static int cdissect(struct vars *v, struct subre *t, chr *begin, chr *end);
+static int ccondissect(struct vars *v, struct subre *t, chr *begin, chr *end);
+static int crevcondissect(struct vars *v, struct subre *t, chr *begin, chr *end);
+static int cbrdissect(struct vars *v, struct subre *t, chr *begin, chr *end);
+static int caltdissect(struct vars *v, struct subre *t, chr *begin, chr *end);
+static int citerdissect(struct vars *v, struct subre *t, chr *begin, chr *end);
+static int creviterdissect(struct vars *v, struct subre *t, chr *begin, chr *end);
/* === rege_dfa.c === */
-static chr *longest(struct vars *, struct dfa *, chr *, chr *, int *);
-static chr *shortest(struct vars *, struct dfa *, chr *, chr *, chr *, chr **, int *);
-static int matchuntil(struct vars *, struct dfa *, chr *, struct sset **, chr **);
-static chr *dfa_backref(struct vars *, struct dfa *, chr *, chr *, chr *, bool);
-static chr *lastcold(struct vars *, struct dfa *);
-static struct dfa *newdfa(struct vars *, struct cnfa *, struct colormap *, struct smalldfa *);
-static void freedfa(struct dfa *);
-static unsigned hash(unsigned *, int);
-static struct sset *initialize(struct vars *, struct dfa *, chr *);
-static struct sset *miss(struct vars *, struct dfa *, struct sset *, color, chr *, chr *);
-static int lacon(struct vars *, struct cnfa *, chr *, color);
-static struct sset *getvacant(struct vars *, struct dfa *, chr *, chr *);
-static struct sset *pickss(struct vars *, struct dfa *, chr *, chr *);
+static chr *longest(struct vars *v, struct dfa *d,
+ chr *start, chr *stop, int *hitstopp);
+static chr *shortest(struct vars *v, struct dfa *d, chr *start, chr *min,
+ chr *max, chr **coldp, int *hitstopp);
+static int matchuntil(struct vars *v, struct dfa *d, chr *probe,
+ struct sset **lastcss, chr **lastcp);
+static chr *dfa_backref(struct vars *v, struct dfa *d, chr *start,
+ chr *min, chr *max, bool shortest);
+static chr *lastcold(struct vars *v, struct dfa *d);
+static struct dfa *newdfa(struct vars *v, struct cnfa *cnfa,
+ struct colormap *cm, struct smalldfa *sml);
+static void freedfa(struct dfa *d);
+static unsigned hash(unsigned *uv, int n);
+static struct sset *initialize(struct vars *v, struct dfa *d, chr *start);
+static struct sset *miss(struct vars *v, struct dfa *d, struct sset *css,
+ color co, chr *cp, chr *start);
+static int lacon(struct vars *v, struct cnfa *pcnfa, chr *cp, color co);
+static struct sset *getvacant(struct vars *v, struct dfa *d, chr *cp,
+ chr *start);
+static struct sset *pickss(struct vars *v, struct dfa *d, chr *cp,
+ chr *start);
/*