+void dfa_parse_cmap_clean (struct DFA *d)
+{
+ struct DFA_parse *dfa = d->parse_info;
+
+ assert (dfa);
+ if (!dfa->charMap)
+ {
+ dfa->charMapSize = 7;
+ dfa->charMap = imalloc (dfa->charMapSize * sizeof(*dfa->charMap));
+ }
+ dfa->charMap[0] = 0;
+}
+
+void dfa_parse_cmap_new (struct DFA *d, const int *cmap)
+{
+ struct DFA_parse *dfa = d->parse_info;
+ const int *cp;
+ int size;
+
+ assert (dfa);
+ for (cp = cmap; *cp; cp += 2)
+ ;
+ size = cp - cmap + 1;
+ if (size > dfa->charMapSize)
+ {
+ if (dfa->charMap)
+ ifree (dfa->charMap);
+ dfa->charMapSize = size;
+ dfa->charMap = imalloc (size * sizeof(*dfa->charMap));
+ }
+ memcpy (dfa->charMap, cmap, size * sizeof(*dfa->charMap));
+}
+
+void dfa_parse_cmap_del (struct DFA *d, int from)
+{
+ struct DFA_parse *dfa = d->parse_info;
+ int *cc;
+
+ assert (dfa);
+ for (cc = dfa->charMap; *cc; cc += 2)
+ if (*cc == from)
+ {
+ while ((cc[0] = cc[2]))
+ {
+ cc[1] = cc[3];
+ cc += 2;
+ }
+ break;
+ }
+}
+
+void dfa_parse_cmap_add (struct DFA *d, int from, int to)
+{
+ struct DFA_parse *dfa = d->parse_info;
+ int *cc;
+ int indx, size;
+
+ assert (dfa);
+ for (cc = dfa->charMap; *cc; cc += 2)
+ if (*cc == from)
+ {
+ cc[1] = to;
+ return ;
+ }
+ indx = cc - dfa->charMap;
+ size = dfa->charMapSize;
+ if (indx >= size)
+ {
+ int *cn = imalloc ((size+16) * sizeof(*dfa->charMap));
+ memcpy (cn, dfa->charMap, indx*sizeof(*dfa->charMap));
+ ifree (dfa->charMap);
+ dfa->charMap = cn;
+ dfa->charMapSize = size+16;
+ }
+ dfa->charMap[indx] = from;
+ dfa->charMap[indx+1] = to;
+ dfa->charMap[indx+2] = 0;
+}
+
+void dfa_parse_cmap_thompson (struct DFA *d)
+{
+ static int thompson_chars[] =
+ {
+ '*', L_CLOS0,
+ '+', L_CLOS1,
+ '|', L_ALT,
+ '^', L_START,
+ '$', L_END,
+ '?', L_QUEST,
+ '.', L_ANY,
+ '(', L_LP,
+ ')', L_RP,
+ ' ', 0,
+ '\t', 0,
+ '\n', 0,
+ 0
+ };
+ dfa_parse_cmap_new (d, thompson_chars);
+}
+