fmtre.c revision 3e14f97f673e8a630f076077de35afdd43dc1587
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return RE expression given strmatch() pattern
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 0 returned for invalid RE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct Stack_s
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s = (char*)as;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Stack_t* p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s != '*' || *(s + 1) == '(' || *(s + 1) == '-' && *(s + 2) == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '^';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\\':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = *s++) == '!')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '^';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (c == '^')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = *s++) == ']')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '^';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(*t++ = c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = *s++) == ']')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (x = s; *x && *x != '}'; x++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*x++ && (*x == '(' || *x == '-' && *(x + 1) == '('))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*s == '(' || c != '~' && *s == '-' && *(s + 1) == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c == '~')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (s += 3; *t = *s; t++, s++);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '?';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '.';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (c = 0; c < p->len; c++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = p->beg[c];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '?';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*s || *s == ')')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '$';