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 * regcomp() regex_t cache
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * at&t research
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#define ROUND 64 /* pattern buffer size round */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * flush the cache
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (matchstate.cache[i] && matchstate.cache[i]->keep)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return regcomp() compiled re for pattern and reflags
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinregcache(const char* pattern, regflags_t reflags, int* status)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * 0 pattern flushes the cache and reflags>0 extends cache
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (matchstate.cache = newof(matchstate.cache, Cache_t*, reflags, 0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!(matchstate.cache = newof(0, Cache_t*, CACHE, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * flush the cache if the locale changed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the ast setlocale() intercept maintains
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * persistent setlocale() return values
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((s = setlocale(LC_CTYPE, NiL)) != matchstate.locale)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * check if the pattern is in the cache
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for (i = 0; i < sizeof(key) && pattern[i]; i++)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for (; i < sizeof(key); i++)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner ((char*)&key)[i] = 0;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else if (*(Key_t*)matchstate.cache[i]->pattern == key && !strcmp(matchstate.cache[i]->pattern, pattern) && matchstate.cache[i]->reflags == reflags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!matchstate.cache[old] || matchstate.cache[old]->serial > matchstate.cache[i]->serial)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(cp = matchstate.cache[unused]) && !(cp = matchstate.cache[unused] = newof(0, Cache_t, 1, 0)))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if ((i = strlen(pattern) + 1) >= cp->size)
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if (!(cp->pattern = newof(cp->pattern, char, cp->size, 0)))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner while (++i < sizeof(Key_t))