summaryrefslogtreecommitdiff
path: root/usr/src/lib/libast/common/regex/regsubcomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libast/common/regex/regsubcomp.c')
-rw-r--r--usr/src/lib/libast/common/regex/regsubcomp.c377
1 files changed, 0 insertions, 377 deletions
diff --git a/usr/src/lib/libast/common/regex/regsubcomp.c b/usr/src/lib/libast/common/regex/regsubcomp.c
deleted file mode 100644
index bc0f866a40..0000000000
--- a/usr/src/lib/libast/common/regex/regsubcomp.c
+++ /dev/null
@@ -1,377 +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 ed(1) style substitute compile
- */
-
-#include "reglib.h"
-
-static const regflags_t submap[] =
-{
- 'g', REG_SUB_ALL,
- 'l', REG_SUB_LOWER,
- 'n', REG_SUB_NUMBER,
- 'p', REG_SUB_PRINT,
- 's', REG_SUB_STOP,
- 'u', REG_SUB_UPPER,
- 'w', REG_SUB_WRITE|REG_SUB_LAST,
- 0, 0
-};
-
-int
-regsubflags(regex_t* p, register const char* s, char** e, int delim, register const regflags_t* map, int* pm, regflags_t* pf)
-{
- register int c;
- register const regflags_t* m;
- regflags_t flags;
- int minmatch;
- regdisc_t* disc;
-
- flags = pf ? *pf : 0;
- minmatch = pm ? *pm : 0;
- if (!map)
- map = submap;
- while (!(flags & REG_SUB_LAST))
- {
- if (!(c = *s++) || c == delim)
- {
- s--;
- break;
- }
- else if (c >= '0' && c <= '9')
- {
- if (minmatch)
- {
- disc = p->env->disc;
- regfree(p);
- return fatal(disc, REG_EFLAGS, s - 1);
- }
- minmatch = c - '0';
- while (*s >= '0' && *s <= '9')
- minmatch = minmatch * 10 + *s++ - '0';
- }
- else
- {
- for (m = map; *m; m++)
- if (*m++ == c)
- {
- if (flags & *m)
- {
- disc = p->env->disc;
- regfree(p);
- return fatal(disc, REG_EFLAGS, s - 1);
- }
- flags |= *m--;
- break;
- }
- if (!*m)
- {
- s--;
- break;
- }
- }
- }
- if (pf)
- *pf = flags;
- if (pm)
- *pm = minmatch;
- if (e)
- *e = (char*)s;
- return 0;
-}
-
-/*
- * compile substitute rhs and optional flags
- */
-
-int
-regsubcomp(regex_t* p, register const char* s, const regflags_t* map, int minmatch, regflags_t flags)
-{
- register regsub_t* sub;
- register int c;
- register int d;
- register char* t;
- register regsubop_t* op;
- char* e;
- const char* r;
- int sre;
- int f;
- int g;
- int n;
- int nops;
- const char* o;
- regdisc_t* disc;
-
- disc = p->env->disc;
- if (p->env->flags & REG_NOSUB)
- {
- regfree(p);
- return fatal(disc, REG_BADPAT, NiL);
- }
- if (!(sub = (regsub_t*)alloc(p->env->disc, 0, sizeof(regsub_t) + strlen(s))) || !(sub->re_ops = (regsubop_t*)alloc(p->env->disc, 0, (nops = 8) * sizeof(regsubop_t))))
- {
- if (sub)
- alloc(p->env->disc, sub, 0);
- regfree(p);
- return fatal(disc, REG_ESPACE, s);
- }
- sub->re_buf = sub->re_end = 0;
- p->re_sub = sub;
- p->env->sub = 1;
- op = sub->re_ops;
- o = s;
- if (!(p->env->flags & REG_DELIMITED))
- d = 0;
- else
- switch (d = *(s - 1))
- {
- case '\\':
- case '\n':
- case '\r':
- regfree(p);
- return fatal(disc, REG_EDELIM, s);
- }
- sre = p->env->flags & REG_SHELL;
- t = sub->re_rhs;
- if (d)
- {
- r = s;
- for (;;)
- {
- if (!*s)
- {
- if (p->env->flags & REG_MUSTDELIM)
- {
- regfree(p);
- return fatal(disc, REG_EDELIM, r);
- }
- break;
- }
- else if (*s == d)
- {
- flags |= REG_SUB_FULL;
- s++;
- break;
- }
- else if (*s++ == '\\' && !*s++)
- {
- regfree(p);
- return fatal(disc, REG_EESCAPE, r);
- }
- }
- if (*s)
- {
- if (n = regsubflags(p, s, &e, d, map, &minmatch, &flags))
- return n;
- s = (const char*)e;
- }
- p->re_npat = s - o;
- s = r;
- }
- else
- p->re_npat = 0;
- op->op = f = g = flags & (REG_SUB_LOWER|REG_SUB_UPPER);
- op->off = 0;
- while ((c = *s++) != d)
- {
- again:
- if (!c)
- {
- p->re_npat = s - o - 1;
- break;
- }
- else if (c == '\\')
- {
- if (*s == c)
- {
- *t++ = *s++;
- continue;
- }
- if ((c = *s++) == d)
- goto again;
- if (!c)
- {
- regfree(p);
- return fatal(disc, REG_EESCAPE, s - 2);
- }
- if (c == '&')
- {
- *t++ = c;
- continue;
- }
- }
- else if (c == '&')
- {
- if (sre)
- {
- *t++ = c;
- continue;
- }
- }
- else
- {
- switch (op->op)
- {
- case REG_SUB_UPPER:
- if (islower(c))
- c = toupper(c);
- break;
- case REG_SUB_LOWER:
- if (isupper(c))
- c = tolower(c);
- break;
- case REG_SUB_UPPER|REG_SUB_LOWER:
- if (isupper(c))
- c = tolower(c);
- else if (islower(c))
- c = toupper(c);
- break;
- }
- *t++ = c;
- continue;
- }
- switch (c)
- {
- case 0:
- s--;
- continue;
- case '&':
- c = 0;
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- c -= '0';
- if (isdigit(*s) && (p->env->flags & REG_MULTIREF))
- c = c * 10 + *s++ - '0';
- break;
- case 'l':
- if (c = *s)
- {
- s++;
- if (isupper(c))
- c = tolower(c);
- *t++ = c;
- }
- continue;
- case 'u':
- if (c = *s)
- {
- s++;
- if (islower(c))
- c = toupper(c);
- *t++ = c;
- }
- continue;
- case 'E':
- f = g;
- set:
- if ((op->len = (t - sub->re_rhs) - op->off) && (n = ++op - sub->re_ops) >= nops)
- {
- if (!(sub->re_ops = (regsubop_t*)alloc(p->env->disc, sub->re_ops, (nops *= 2) * sizeof(regsubop_t))))
- {
- regfree(p);
- return fatal(disc, REG_ESPACE, NiL);
- }
- op = sub->re_ops + n;
- }
- op->op = f;
- op->off = t - sub->re_rhs;
- continue;
- case 'L':
- g = f;
- f = REG_SUB_LOWER;
- goto set;
- case 'U':
- g = f;
- f = REG_SUB_UPPER;
- goto set;
- default:
- if (!sre)
- {
- *t++ = chresc(s - 2, &e);
- s = (const char*)e;
- continue;
- }
- s--;
- c = -1;
- break;
- }
- if (c > p->re_nsub)
- {
- regfree(p);
- return fatal(disc, REG_ESUBREG, s - 1);
- }
- if ((n = op - sub->re_ops) >= (nops - 2))
- {
- if (!(sub->re_ops = (regsubop_t*)alloc(p->env->disc, sub->re_ops, (nops *= 2) * sizeof(regsubop_t))))
- {
- regfree(p);
- return fatal(disc, REG_ESPACE, NiL);
- }
- op = sub->re_ops + n;
- }
- if (op->len = (t - sub->re_rhs) - op->off)
- op++;
- op->op = f;
- op->off = c;
- op->len = 0;
- op++;
- op->op = f;
- op->off = t - sub->re_rhs;
- }
- if ((op->len = (t - sub->re_rhs) - op->off) && (n = ++op - sub->re_ops) >= nops)
- {
- if (!(sub->re_ops = (regsubop_t*)alloc(p->env->disc, sub->re_ops, (nops *= 2) * sizeof(regsubop_t))))
- {
- regfree(p);
- return fatal(disc, REG_ESPACE, NiL);
- }
- op = sub->re_ops + n;
- }
- op->len = -1;
- sub->re_flags = flags;
- sub->re_min = minmatch;
- return 0;
-}
-
-void
-regsubfree(regex_t* p)
-{
- Env_t* env;
- regsub_t* sub;
-
- if (p && (env = p->env) && env->sub && (sub = p->re_sub))
- {
- env->sub = 0;
- p->re_sub = 0;
- if (!(env->disc->re_flags & REG_NOFREE))
- {
- if (sub->re_buf)
- alloc(env->disc, sub->re_buf, 0);
- if (sub->re_ops)
- alloc(env->disc, sub->re_ops, 0);
- alloc(env->disc, sub, 0);
- }
- }
-}