summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/common/regex/regdecomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libast/common/regex/regdecomp.c')
-rw-r--r--usr/src/lib/libast/common/regex/regdecomp.c448
1 files changed, 0 insertions, 448 deletions
diff --git a/usr/src/lib/libast/common/regex/regdecomp.c b/usr/src/lib/libast/common/regex/regdecomp.c
deleted file mode 100644
index 1f239615b1..0000000000
--- a/usr/src/lib/libast/common/regex/regdecomp.c
+++ /dev/null
@@ -1,448 +0,0 @@
-/***********************************************************************
-* *
-* This software is part of the ast package *
-* Copyright (c) 1985-2010 AT&T Intellectual Property *
-* and is licensed under the *
-* Common Public License, Version 1.0 *
-* by AT&T Intellectual Property *
-* *
-* A copy of the License is available at *
-* http://www.opensource.org/licenses/cpl1.0.txt *
-* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
-* *
-* Information and Software Systems Research *
-* AT&T Research *
-* Florham Park NJ *
-* *
-* Glenn Fowler <gsf@research.att.com> *
-* David Korn <dgk@research.att.com> *
-* Phong Vo <kpv@research.att.com> *
-* *
-***********************************************************************/
-#pragma prototyped
-
-/*
- * posix regex decompiler
- */
-
-#include "reglib.h"
-
-#undef ismeta
-#define ismeta(c,t,e,d) (state.magic[c] && state.magic[c][(t)+(e)] >= T_META || (c) == (d))
-#define meta(f,c,t,e,d) do { if (ismeta(c,t,e,d)) sfputc(f, '\\'); sfputc(f, c); } while (0)
-
-static void
-detrie(Trie_node_t* x, Sfio_t* sp, char* b, char* p, char* e, int delimiter)
-{
- register Trie_node_t* y;
- char* o;
- int k;
-
- o = p;
- k = 1;
- do
- {
- if (k)
- {
- o = p;
- if (p < e)
- *p++ = x->c;
- }
- sfputc(sp, x->c);
- for (y = x->sib; y; y = y->sib)
- {
- sfputc(sp, '|');
- sfputc(sp, '<');
- sfwrite(sp, b, p - b);
- sfputc(sp, '>');
- detrie(y, sp, b, p, e, delimiter);
- }
- if (x->end && x->son)
- {
- sfputc(sp, '|');
- sfputc(sp, '{');
- sfwrite(sp, b, p - b);
- sfputc(sp, '}');
- p = o;
- }
- } while (x = x->son);
-}
-
-static int
-decomp(register Rex_t* e, Sfio_t* sp, int type, int delimiter, regflags_t flags)
-{
- Rex_t* q;
- unsigned char* s;
- unsigned char* t;
- int c;
- int m;
- int cb;
- int cd;
- int cr;
- int ib;
- int ie;
- int nb;
- int ne;
- unsigned char ic[2*UCHAR_MAX];
- unsigned char nc[2*UCHAR_MAX];
-
- do
- {
- switch (e->type)
- {
- case REX_ALT:
- if (decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags))
- return 1;
- sfputc(sp, '|');
- if (e->re.group.expr.binary.right && decomp(e->re.group.expr.binary.right, sp, type, delimiter, flags))
- return 1;
- break;
- case REX_BACK:
- sfprintf(sp, "\\%d", e->lo);
- break;
- case REX_BEG:
- if (type < SRE)
- sfputc(sp, '^');
- break;
- case REX_END:
- if (type < SRE)
- sfputc(sp, '$');
- break;
- case REX_WBEG:
- meta(sp, '<', type, 1, delimiter);
- break;
- case REX_WEND:
- meta(sp, '<', type, 1, delimiter);
- break;
- case REX_WORD:
- sfprintf(sp, "\\w");
- break;
- case REX_CLASS:
- case REX_COLL_CLASS:
- case REX_ONECHAR:
- case REX_DOT:
- case REX_REP:
- if (type >= SRE)
- {
- c = ')';
- if (e->hi == RE_DUP_INF)
- {
- if (!e->lo)
- sfputc(sp, '*');
- else if (e->lo == 1)
- sfputc(sp, '+');
- else
- sfprintf(sp, "{%d,}", e->lo);
- }
- else if (e->hi != 1)
- sfprintf(sp, "{%d,%d}", e->lo, e->hi);
- else if (e->lo == 0)
- sfputc(sp, '?');
- else
- c = 0;
- }
- switch (e->type)
- {
- case REX_REP:
- if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags))
- return 1;
- break;
- case REX_CLASS:
- sfputc(sp, '[');
- nb = ne = ib = ie = -2;
- cb = cd = cr = 0;
- s = nc;
- t = ic;
- for (m = 0; m <= UCHAR_MAX; m++)
- if (settst(e->re.charclass, m))
- {
- if (m == ']')
- cb = 1;
- else if (m == '-')
- cr = 1;
- else if (m == delimiter)
- cd = 1;
- else if (nb < 0)
- ne = nb = m;
- else if (ne == (m - 1))
- ne = m;
- else
- {
- if (ne == nb)
- *s++ = ne;
- else
- {
- *s++ = nb;
- *s++ = '-';
- *s++ = ne;
- }
- ne = nb = m;
- }
- }
- else
- {
- if (m == ']')
- cb = -1;
- else if (m == '-')
- cr = -1;
- else if (m == delimiter)
- cd = -1;
- else if (ib < 0)
- ie = ib = m;
- else if (ie == (m - 1))
- ie = m;
- else
- {
- if (ie == ib)
- *t++ = ie;
- else
- {
- *t++ = ib;
- *t++ = '-';
- *t++ = ie;
- }
- ie = ib = m;
- }
- }
- if (nb >= 0)
- {
- *s++ = nb;
- if (ne != nb)
- {
- *s++ = '-';
- *s++ = ne;
- }
- }
- if (ib >= 0)
- {
- *t++ = ib;
- if (ie != ib)
- {
- *t++ = '-';
- *t++ = ie;
- }
- }
- if ((t - ic + 1) < (s - nc + (nc[0] == '^')))
- {
- sfputc(sp, '^');
- if (cb < 0)
- sfputc(sp, ']');
- if (cr < 0)
- sfputc(sp, '-');
- if (cd < 0 && delimiter > 0)
- {
- if (flags & REG_ESCAPE)
- sfputc(sp, '\\');
- sfputc(sp, delimiter);
- }
- sfwrite(sp, ic, t - ic);
- }
- else
- {
- if (cb > 0)
- sfputc(sp, ']');
- if (cr > 0)
- sfputc(sp, '-');
- if (cd > 0 && delimiter > 0)
- {
- if (flags & REG_ESCAPE)
- sfputc(sp, '\\');
- sfputc(sp, delimiter);
- }
- if (nc[0] == '^')
- {
- sfwrite(sp, nc + 1, s - nc - 1);
- sfputc(sp, '^');
- }
- else
- sfwrite(sp, nc, s - nc);
- }
- sfputc(sp, ']');
- break;
- case REX_COLL_CLASS:
- break;
- case REX_ONECHAR:
- meta(sp, e->re.onechar, type, 0, delimiter);
- break;
- case REX_DOT:
- sfputc(sp, '.');
- break;
- }
- if (type < SRE)
- {
- if (e->hi == RE_DUP_INF)
- {
- if (!e->lo)
- sfputc(sp, '*');
- else if (e->lo == 1 && ismeta('+', type, 0, delimiter))
- meta(sp, '+', type, 1, delimiter);
- else
- {
- meta(sp, '{', type, 1, delimiter);
- sfprintf(sp, "%d,", e->lo);
- meta(sp, '}', type, 1, delimiter);
- }
- }
- else if (e->hi != 1 || e->lo == 0 && !ismeta('?', type, 0, delimiter))
- {
- meta(sp, '{', type, 1, delimiter);
- sfprintf(sp, "%d,%d", e->lo, e->hi);
- meta(sp, '}', type, 1, delimiter);
- }
- else if (e->lo == 0)
- meta(sp, '?', type, 1, delimiter);
- }
- else if (c)
- sfputc(sp, c);
- break;
- case REX_STRING:
- case REX_KMP:
- t = (s = e->re.string.base) + e->re.string.size;
- while (s < t)
- {
- c = *s++;
- meta(sp, c, type, 0, delimiter);
- }
- break;
- case REX_TRIE:
- ib = 0;
- for (c = 0; c <= UCHAR_MAX; c++)
- if (e->re.trie.root[c])
- {
- char pfx[1024];
-
- if (ib)
- sfputc(sp, '|');
- else
- ib = 1;
- detrie(e->re.trie.root[c], sp, pfx, pfx, &pfx[sizeof(pfx)], delimiter);
- }
- break;
- case REX_NEG:
- if (type >= SRE)
- sfprintf(sp, "!(");
- if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags))
- return 1;
- if (type >= SRE)
- sfputc(sp, ')');
- else
- sfputc(sp, '!');
- break;
- case REX_CONJ:
- if (decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags))
- return 1;
- sfputc(sp, '&');
- if (decomp(e->re.group.expr.binary.right, sp, type, delimiter, flags))
- return 1;
- break;
- case REX_GROUP:
- if (type >= SRE)
- sfputc(sp, '@');
- meta(sp, '(', type, 1, delimiter);
- if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags))
- return 1;
- meta(sp, ')', type, 1, delimiter);
- break;
- case REX_GROUP_AHEAD:
- case REX_GROUP_AHEAD_NOT:
- case REX_GROUP_BEHIND:
- case REX_GROUP_BEHIND_NOT:
- meta(sp, '(', type, 1, delimiter);
- sfputc(sp, '?');
- if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags))
- return 1;
- meta(sp, ')', type, 1, delimiter);
- break;
- case REX_GROUP_COND:
- meta(sp, '(', type, 1, delimiter);
- sfputc(sp, '?');
- if (e->re.group.expr.binary.left && decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags))
- return 1;
- if (q = e->re.group.expr.binary.right)
- {
- sfputc(sp, ':');
- if (q->re.group.expr.binary.left && decomp(q->re.group.expr.binary.left, sp, type, delimiter, flags))
- return 1;
- sfputc(sp, ':');
- if (q->re.group.expr.binary.right && decomp(q->re.group.expr.binary.right, sp, type, delimiter, flags))
- return 1;
- }
- meta(sp, ')', type, 1, delimiter);
- break;
- case REX_GROUP_CUT:
- meta(sp, '(', type, 1, delimiter);
- sfputc(sp, '?');
- if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags))
- return 1;
- meta(sp, ')', type, 1, delimiter);
- break;
- case REX_BM:
- break;
- default:
- sfprintf(sp, "<ERROR:REX_%d>", e->type);
- break;
- }
- } while (e = e->next);
- return 0;
-}
-
-/*
- * reconstruct pattern from compiled re p into sp
- */
-
-size_t
-regdecomp(regex_t* p, regflags_t flags, char* buf, size_t n)
-{
- Sfio_t* sp;
- char* s;
- int type;
- int delimiter;
- size_t r;
-
- if (!(sp = sfstropen()))
- return 0;
- if (flags == (regflags_t)~0)
- flags = p->env->flags;
- switch (flags & (REG_AUGMENTED|REG_EXTENDED|REG_SHELL))
- {
- case 0:
- type = BRE;
- break;
- case REG_AUGMENTED:
- case REG_AUGMENTED|REG_EXTENDED:
- type = ARE;
- break;
- case REG_EXTENDED:
- type = ERE;
- break;
- case REG_SHELL:
- type = SRE;
- break;
- default:
- type = KRE;
- break;
- }
- if (flags & REG_DELIMITED)
- {
- delimiter = '/';
- sfputc(sp, delimiter);
- }
- else
- delimiter = -1;
- if (decomp(p->env->rex, sp, type, delimiter, flags))
- r = 0;
- else
- {
- if (delimiter > 0)
- sfputc(sp, delimiter);
- if ((r = sfstrtell(sp) + 1) <= n)
- {
- if (!(s = sfstruse(sp)))
- r = 0;
- else
- memcpy(buf, s, r);
- }
- }
- sfstrclose(sp);
- return r;
-}