xref: /onnv-gate/usr/src/lib/libast/common/comp/regexp.c (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #pragma prototyped
234887Schin /*
244887Schin  * <regexp.h> library support
254887Schin  */
264887Schin 
274887Schin #define _REGEXP_DECLARE
284887Schin 
294887Schin #include <ast.h>
304887Schin #include <regexp.h>
314887Schin #include <regex.h>
324887Schin #include <align.h>
334887Schin 
344887Schin typedef struct
354887Schin {
364887Schin 	regex_t		re;
374887Schin 	char*		buf;
384887Schin 	char*		cur;
394887Schin 	unsigned int	size;
404887Schin } Env_t;
414887Schin 
424887Schin static void*
block(void * handle,void * data,size_t size)434887Schin block(void* handle, void* data, size_t size)
444887Schin {
454887Schin 	register Env_t*	env = (Env_t*)handle;
464887Schin 
474887Schin 	if (data || (size = roundof(size, ALIGN_BOUND2)) > (env->buf + env->size - env->cur))
484887Schin 		return 0;
494887Schin 	data = (void*)env->cur;
504887Schin 	env->cur += size;
514887Schin 	return data;
524887Schin }
534887Schin 
544887Schin int
_re_comp(regexp_t * re,const char * pattern,char * handle,unsigned int size)554887Schin _re_comp(regexp_t* re, const char* pattern, char* handle, unsigned int size)
564887Schin {
574887Schin 	register Env_t*	env = (Env_t*)handle;
584887Schin 	register int	n;
594887Schin 
604887Schin 	if (size <= sizeof(Env_t))
614887Schin 		return 50;
624887Schin 	env->buf = env->cur = (char*)env + sizeof(Env_t);
634887Schin 	env->size = size - sizeof(Env_t);
644887Schin 	regalloc(env, block, REG_NOFREE);
654887Schin 	n = regcomp(&env->re, pattern, REG_LENIENT|REG_NULL);
664887Schin 	switch (n)
674887Schin 	{
684887Schin 	case 0:
694887Schin 		break;
704887Schin 	case REG_ERANGE:
714887Schin 		n = 11;
724887Schin 		break;
734887Schin 	case REG_BADBR:
744887Schin 		n = 16;
754887Schin 		break;
764887Schin 	case REG_ESUBREG:
774887Schin 		n = 25;
784887Schin 		break;
794887Schin 	case REG_EPAREN:
804887Schin 		n = 42;
814887Schin 		break;
824887Schin 	case REG_EBRACK:
834887Schin 		n = 49;
844887Schin 		break;
854887Schin 	default:
864887Schin 		n = 50;
874887Schin 		break;
884887Schin 	}
894887Schin 	re->re_nbra = env->re.re_nsub;
904887Schin 	return n;
914887Schin }
924887Schin 
934887Schin int
_re_exec(regexp_t * re,const char * subject,const char * handle,int anchor)944887Schin _re_exec(regexp_t* re, const char* subject, const char* handle, int anchor)
954887Schin {
964887Schin 	register Env_t*	env = (Env_t*)handle;
974887Schin 	register int	n;
984887Schin 	regmatch_t	match[elementsof(re->re_braslist)+1];
994887Schin 
1004887Schin 	if (regexec(&env->re, subject, elementsof(match), match, 0) || anchor && match[0].rm_so)
1014887Schin 		return 0;
1024887Schin 	re->re_loc1 = (char*)subject + match[0].rm_so;
1034887Schin 	re->re_loc2 = (char*)subject + match[0].rm_eo;
1044887Schin 	for (n = 1; n <= env->re.re_nsub; n++)
1054887Schin 	{
1064887Schin 		re->re_braslist[n-1] = (char*)subject + match[n].rm_so;
1074887Schin 		re->re_braelist[n-1] = (char*)subject + match[n].rm_eo;
1084887Schin 	}
1094887Schin 	return 1;
1104887Schin }
1114887Schin 
1124887Schin char*
_re_putc(int c)1134887Schin _re_putc(int c)
1144887Schin {
1154887Schin 	static Sfio_t*	sp;
1164887Schin 
1174887Schin 	if (!sp && !(sp = sfstropen()))
1184887Schin 		return 0;
1194887Schin 	if (!c)
1204887Schin 		return sfstruse(sp);
1214887Schin 	sfputc(sp, c);
1224887Schin 	return 0;
1234887Schin }
124