xref: /onnv-gate/usr/src/lib/libast/common/regex/reginit.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 /*
254887Schin  * posix regex state and alloc
264887Schin  */
274887Schin 
284887Schin #include "reglib.h"
294887Schin 
308462SApril.Chin@Sun.COM #if _PACKAGE_ast
318462SApril.Chin@Sun.COM 
324887Schin #include <ccode.h>
334887Schin 
348462SApril.Chin@Sun.COM #else
358462SApril.Chin@Sun.COM 
368462SApril.Chin@Sun.COM #define CC_bel		'\a'
378462SApril.Chin@Sun.COM #define CC_esc		'\033'
388462SApril.Chin@Sun.COM #define CC_vt		'\v'
398462SApril.Chin@Sun.COM 
408462SApril.Chin@Sun.COM #endif
418462SApril.Chin@Sun.COM 
424887Schin /*
434887Schin  * state shared by all threads
444887Schin  */
454887Schin 
464887Schin State_t		state =
474887Schin {
484887Schin 	{ -1, -1 },
494887Schin 
504887Schin 	/*
514887Schin 	 * escape code table
524887Schin 	 * the "funny" things get special treatment at ends of BRE
534887Schin 	 *
544887Schin 	 *	BRE  0:normal  1:escaped  2:escaped-char-class
554887Schin 	 *	ERE  3:normal  4:escaped  5:escaped-char-class
564887Schin 	 *	ARE  6:normal  7:escaped  8:escaped-char-class
574887Schin 	 *	SRE  9:normal 10:escaped 11:escaped-char-class
584887Schin 	 *	KRE 12:normal 13:escaped 14:escaped-char-class
594887Schin 	 */
604887Schin 
614887Schin 	'\\',
624887Schin 		'\\',		'\\',		'\\',
634887Schin 		'\\',		'\\',		'\\',
644887Schin 		'\\',		'\\',		'\\',
654887Schin 		'\\',		'\\',		'\\',
664887Schin 		'\\',		'\\',		'\\',
674887Schin 	'^',	/* funny */
684887Schin 		'^',		'^',		'^',
694887Schin 		T_CFLX,		'^',		'^',
704887Schin 		T_CFLX,		'^',		'^',
714887Schin 		'^',		'^',		'^',
724887Schin 		'^',		'^',		'^',
734887Schin 	'.',
744887Schin 		T_DOT,		'.',		T_BAD,
754887Schin 		T_DOT, 		'.',		T_BAD,
764887Schin 		T_DOT, 		'.',		T_BAD,
774887Schin 		'.',		'.',		T_BAD,
784887Schin 		'.',		'.',		T_BAD,
794887Schin 	'$',	/* funny */
804887Schin 		'$',		'$',		T_BAD,
814887Schin 		T_DOLL, 	'$',		T_BAD,
824887Schin 		T_DOLL, 	'$',		T_BAD,
834887Schin 		'$',		'$',		T_BAD,
844887Schin 		'$',		'$',		T_BAD,
854887Schin 	'*',
864887Schin 		T_STAR,		'*',		T_BAD,
874887Schin 		T_STAR, 	'*',		T_BAD,
884887Schin 		T_STAR, 	'*',		T_BAD,
894887Schin 		T_STAR, 	'*',		'*',
904887Schin 		T_STAR, 	'*',		'*',
914887Schin 	'[',
924887Schin 		T_BRA,		'[',		'[',
934887Schin 		T_BRA,		'[',		'[',
944887Schin 		T_BRA,		'[',		'[',
954887Schin 		T_BRA,		'[',		'[',
964887Schin 		T_BRA,		'[',		'[',
974887Schin 	'|',
984887Schin 		'|',		T_BAD,		T_BAD,
994887Schin 		T_BAR,		'|',		T_BAD,
1004887Schin 		T_BAR,		'|',		T_BAD,
1014887Schin 		'|',		'|',		T_BAD,
1024887Schin 		T_BAR,		'|',		T_BAD,
1034887Schin 	'+',
1044887Schin 		'+',		T_BAD,		T_BAD,
1054887Schin 		T_PLUS,		'+',		T_BAD,
1064887Schin 		T_PLUS,		'+',		T_BAD,
1074887Schin 		'+',		'+',		T_BAD,
1084887Schin 		T_PLUS,		'+',		T_BAD,
1094887Schin 	'?',
1104887Schin 		'?',		T_BAD,		T_BAD,
1114887Schin 		T_QUES, 	'?',		T_BAD,
1124887Schin 		T_QUES, 	'?',		T_BAD,
1134887Schin 		T_QUES,		'?',		'?',
1144887Schin 		T_QUES,		'?',		'?',
1154887Schin 	'(',
1164887Schin 		'(',		T_OPEN,		T_BAD,
1174887Schin 		T_OPEN, 	'(',		T_BAD,
1184887Schin 		T_OPEN, 	'(',		T_BAD,
1194887Schin 		'(',		'(',		'(',
1204887Schin 		T_OPEN,		'(',		'(',
1214887Schin 	')',
1224887Schin 		')',		T_CLOSE,	T_BAD,
1234887Schin 		T_CLOSE,	')',		T_BAD,
1244887Schin 		T_CLOSE,	')',		T_BAD,
1254887Schin 		')',		')',		')',
1264887Schin 		T_CLOSE,	')',		')',
1274887Schin 	'{',
1284887Schin 		'{',		T_LEFT,		T_BAD,
1294887Schin 		T_LEFT,		'{',		T_BAD,
1304887Schin 		T_LEFT,		'{',		T_BAD,
1314887Schin 		'{',		'{',		'{',
1324887Schin 		T_LEFT,		'{',		'{',
1334887Schin 	'}',
1344887Schin 		'}',		T_RIGHT,	T_BAD,
1354887Schin 		'}',		T_BAD,		T_BAD,
1364887Schin 		'}',		T_BAD,		T_BAD,
1374887Schin 		'}',		'}',		'}',
1384887Schin 		'}',		'}',		'}',
1394887Schin 	'&',
1404887Schin 		'&',		T_BAD,		T_BAD,
1414887Schin 		'&',		T_AND,		T_BAD,
1424887Schin 		T_AND,		'&',		T_BAD,
1434887Schin 		'&',		'&',		T_BAD,
1444887Schin 		T_AND,		'&',		T_BAD,
1454887Schin 	'!',
1464887Schin 		'!',		T_BAD,		T_BAD,
1474887Schin 		'!',		T_BANG,		T_BAD,
1484887Schin 		T_BANG, 	'!',		T_BAD,
1494887Schin 		'!',		'!',		T_BAD,
1504887Schin 		T_BANG,		'!',		T_BAD,
1514887Schin 	'@',
1524887Schin 		'@',		T_BAD,		T_BAD,
1534887Schin 		'@',		T_BAD,		T_BAD,
1544887Schin 		'@',		T_BAD,		T_BAD,
1554887Schin 		'@',		'@',		T_BAD,
1564887Schin 		T_AT,		'@',		T_BAD,
1574887Schin 	'~',
1584887Schin 		'~',		T_BAD,		T_BAD,
1594887Schin 		'~',		T_BAD,		T_BAD,
1604887Schin 		'~',		T_BAD,		T_BAD,
1614887Schin 		'~',		'~',		T_BAD,
1624887Schin 		T_TILDE,	'~',		T_BAD,
1634887Schin 	'%',
1644887Schin 		'%',		T_BAD,		T_BAD,
1654887Schin 		'%',		T_BAD,		T_BAD,
1664887Schin 		'%',		T_BAD,		T_BAD,
1674887Schin 		'%',		'%',		T_BAD,
1684887Schin 		T_PERCENT,	'%',		T_BAD,
1694887Schin 	'<',
1704887Schin 		'<',		T_LT,		T_BAD,
1714887Schin 		'<',		T_LT,		T_BAD,
1724887Schin 		T_LT,   	'<',		T_BAD,
1734887Schin 		'<',		'<',		T_BAD,
1744887Schin 		'<',		'<',		T_BAD,
1754887Schin 	'>',
1764887Schin 		'>',		T_GT,		T_BAD,
1774887Schin 		'>',		T_GT,		T_BAD,
1784887Schin 		T_GT,   	'>',		T_BAD,
1794887Schin 		'>',		'>',		T_BAD,
1804887Schin 		'>',		'>',		T_BAD,
1814887Schin 
1824887Schin 	/* backrefs */
1834887Schin 
1844887Schin 	'0',
1854887Schin 		'0',		T_BACK+0,	T_ESCAPE,
1864887Schin 		'0',		T_BACK+0,	T_ESCAPE,
1874887Schin 		'0',		T_BACK+0,	T_ESCAPE,
1884887Schin 		'0',		T_BACK+0,	T_ESCAPE,
1894887Schin 		'0',		T_BACK+0,	T_ESCAPE,
1904887Schin 	'1',
1914887Schin 		'1',		T_BACK+1,	T_ESCAPE,
1924887Schin 		'1',		T_BACK+1,	T_ESCAPE,
1934887Schin 		'1',		T_BACK+1,	T_ESCAPE,
1944887Schin 		'1',		T_BACK+1,	T_ESCAPE,
1954887Schin 		'1',		T_BACK+1,	T_ESCAPE,
1964887Schin 	'2',
1974887Schin 		'2',		T_BACK+2,	T_ESCAPE,
1984887Schin 		'2',		T_BACK+2,	T_ESCAPE,
1994887Schin 		'2',		T_BACK+2,	T_ESCAPE,
2004887Schin 		'2',		T_BACK+2,	T_ESCAPE,
2014887Schin 		'2',		T_BACK+2,	T_ESCAPE,
2024887Schin 	'3',
2034887Schin 		'3',		T_BACK+3,	T_ESCAPE,
2044887Schin 		'3',		T_BACK+3,	T_ESCAPE,
2054887Schin 		'3',		T_BACK+3,	T_ESCAPE,
2064887Schin 		'3',		T_BACK+3,	T_ESCAPE,
2074887Schin 		'3',		T_BACK+3,	T_ESCAPE,
2084887Schin 	'4',
2094887Schin 		'4',		T_BACK+4,	T_ESCAPE,
2104887Schin 		'4',		T_BACK+4,	T_ESCAPE,
2114887Schin 		'4',		T_BACK+4,	T_ESCAPE,
2124887Schin 		'4',		T_BACK+4,	T_ESCAPE,
2134887Schin 		'4',		T_BACK+4,	T_ESCAPE,
2144887Schin 	'5',
2154887Schin 		'5',		T_BACK+5,	T_ESCAPE,
2164887Schin 		'5',		T_BACK+5,	T_ESCAPE,
2174887Schin 		'5',		T_BACK+5,	T_ESCAPE,
2184887Schin 		'5',		T_BACK+5,	T_ESCAPE,
2194887Schin 		'5',		T_BACK+5,	T_ESCAPE,
2204887Schin 	'6',
2214887Schin 		'6',		T_BACK+6,	T_ESCAPE,
2224887Schin 		'6',		T_BACK+6,	T_ESCAPE,
2234887Schin 		'6',		T_BACK+6,	T_ESCAPE,
2244887Schin 		'6',		T_BACK+6,	T_ESCAPE,
2254887Schin 		'6',		T_BACK+6,	T_ESCAPE,
2264887Schin 	'7',
2274887Schin 		'7',		T_BACK+7,	T_ESCAPE,
2284887Schin 		'7',		T_BACK+7,	T_ESCAPE,
2294887Schin 		'7',		T_BACK+7,	T_ESCAPE,
2304887Schin 		'7',		T_BACK+7,	T_ESCAPE,
2314887Schin 		'7',		T_BACK+7,	T_ESCAPE,
2324887Schin 	'8',
2334887Schin 		'8',		T_BACK+8,	T_ESCAPE,
2344887Schin 		'8',		T_BACK+8,	T_ESCAPE,
2354887Schin 		'8',		T_BACK+8,	T_ESCAPE,
2364887Schin 		'8',		'8',		T_ESCAPE,
2374887Schin 		'8',		T_BACK+8,	T_ESCAPE,
2384887Schin 	'9',
2394887Schin 		'9',		T_BACK+9,	T_ESCAPE,
2404887Schin 		'9',		T_BACK+9,	T_ESCAPE,
2414887Schin 		'9',		T_BACK+9,	T_ESCAPE,
2424887Schin 		'9',		'9',		T_ESCAPE,
2434887Schin 		'9',		T_BACK+9,	T_ESCAPE,
2444887Schin 
2454887Schin 	/* perl */
2464887Schin 
2474887Schin 	'A',
2484887Schin 		'A',		T_BEG_STR,	T_BAD,
2494887Schin 		'A',		T_BEG_STR,	T_BAD,
2504887Schin 		'A',		T_BEG_STR,	T_BAD,
2514887Schin 		'A',		T_BEG_STR,	T_BAD,
2524887Schin 		'A',		T_BEG_STR,	T_BAD,
2534887Schin 	'b',
2544887Schin 		'b',		T_WORD,		'\b',
2554887Schin 		'b',		T_WORD,		'\b',
2564887Schin 		'b',		T_WORD,		'\b',
2574887Schin 		'b',		T_WORD,		'\b',
2584887Schin 		'b',		T_WORD,		'\b',
2594887Schin 	'B',
2604887Schin 		'B',		T_WORD_NOT,	T_BAD,
2614887Schin 		'B',		T_WORD_NOT,	T_BAD,
2624887Schin 		'B',		T_WORD_NOT,	T_BAD,
2634887Schin 		'B',		T_WORD_NOT,	T_BAD,
2644887Schin 		'B',		T_WORD_NOT,	T_BAD,
2654887Schin 	'd',
2664887Schin 		'd',		T_DIGIT,	T_DIGIT,
2674887Schin 		'd',		T_DIGIT,	T_DIGIT,
2684887Schin 		'd',		T_DIGIT,	T_DIGIT,
2694887Schin 		'd',		T_DIGIT,	T_DIGIT,
2704887Schin 		'd',		T_DIGIT,	T_DIGIT,
2714887Schin 	'D',
2724887Schin 		'D',		T_DIGIT_NOT,	T_DIGIT_NOT,
2734887Schin 		'D',		T_DIGIT_NOT,	T_DIGIT_NOT,
2744887Schin 		'D',		T_DIGIT_NOT,	T_DIGIT_NOT,
2754887Schin 		'D',		T_DIGIT_NOT,	T_DIGIT_NOT,
2764887Schin 		'D',		T_DIGIT_NOT,	T_DIGIT_NOT,
2774887Schin 	's',
2784887Schin 		's',		T_SPACE,	T_SPACE,
2794887Schin 		's',		T_SPACE,	T_SPACE,
2804887Schin 		's',		T_SPACE,	T_SPACE,
2814887Schin 		's',		T_SPACE,	T_SPACE,
2824887Schin 		's',		T_SPACE,	T_SPACE,
2834887Schin 	'S',
2844887Schin 		'S',		T_SPACE_NOT,	T_SPACE_NOT,
2854887Schin 		'S',		T_SPACE_NOT,	T_SPACE_NOT,
2864887Schin 		'S',		T_SPACE_NOT,	T_SPACE_NOT,
2874887Schin 		'S',		T_SPACE_NOT,	T_SPACE_NOT,
2884887Schin 		'S',		T_SPACE_NOT,	T_SPACE_NOT,
2894887Schin 	'w',
2904887Schin 		'w',		T_ALNUM,	T_ALNUM,
2914887Schin 		'w',		T_ALNUM,	T_ALNUM,
2924887Schin 		'w',		T_ALNUM,	T_ALNUM,
2934887Schin 		'w',		T_ALNUM,	T_ALNUM,
2944887Schin 		'w',		T_ALNUM,	T_ALNUM,
2954887Schin 	'W',
2964887Schin 		'W',		T_ALNUM_NOT,	T_ALNUM_NOT,
2974887Schin 		'W',		T_ALNUM_NOT,	T_ALNUM_NOT,
2984887Schin 		'W',		T_ALNUM_NOT,	T_ALNUM_NOT,
2994887Schin 		'W',		T_ALNUM_NOT,	T_ALNUM_NOT,
3004887Schin 		'W',		T_ALNUM_NOT,	T_ALNUM_NOT,
3014887Schin 	'z',
3024887Schin 		'z',		T_FIN_STR,	T_BAD,
3034887Schin 		'z',		T_FIN_STR,	T_BAD,
3044887Schin 		'z',		T_FIN_STR,	T_BAD,
3054887Schin 		'z',		T_FIN_STR,	T_BAD,
3064887Schin 		'z',		T_FIN_STR,	T_BAD,
3074887Schin 	'Z',
3084887Schin 		'Z',		T_END_STR,	T_BAD,
3094887Schin 		'Z',		T_END_STR,	T_BAD,
3104887Schin 		'Z',		T_END_STR,	T_BAD,
3114887Schin 		'Z',		T_END_STR,	T_BAD,
3124887Schin 		'Z',		T_END_STR,	T_BAD,
3134887Schin 
3144887Schin 	/* C escapes */
3154887Schin 
3164887Schin 	'a',
3174887Schin 		'a',		CC_bel,		CC_bel,
3184887Schin 		'a',		CC_bel,		CC_bel,
3194887Schin 		'a',		CC_bel,		CC_bel,
3204887Schin 		'a',		CC_bel,		CC_bel,
3214887Schin 		'a',		CC_bel,		CC_bel,
3224887Schin 	'c',
3234887Schin 		'c',		T_ESCAPE,	T_ESCAPE,
3244887Schin 		'c',		T_ESCAPE,	T_ESCAPE,
3254887Schin 		'c',		T_ESCAPE,	T_ESCAPE,
3264887Schin 		'c',		T_ESCAPE,	T_ESCAPE,
3274887Schin 		'c',		T_ESCAPE,	T_ESCAPE,
3284887Schin 	'C',
3294887Schin 		'C',		T_ESCAPE,	T_ESCAPE,
3304887Schin 		'C',		T_ESCAPE,	T_ESCAPE,
3314887Schin 		'C',		T_ESCAPE,	T_ESCAPE,
3324887Schin 		'C',		T_ESCAPE,	T_ESCAPE,
3334887Schin 		'C',		T_ESCAPE,	T_ESCAPE,
3344887Schin 	'e',
3354887Schin 		'e',		CC_esc,		CC_esc,
3364887Schin 		'e',		CC_esc,		CC_esc,
3374887Schin 		'e',		CC_esc,		CC_esc,
3384887Schin 		'e',		CC_esc,		CC_esc,
3394887Schin 		'e',		CC_esc,		CC_esc,
3404887Schin 	'E',
3414887Schin 		'E',		CC_esc,		CC_esc,
3424887Schin 		'E',		CC_esc,		CC_esc,
3434887Schin 		'E',		CC_esc,		CC_esc,
3444887Schin 		'E',		CC_esc,		CC_esc,
3454887Schin 		'E',		CC_esc,		CC_esc,
3464887Schin 	'f',
3474887Schin 		'f',		'\f',		'\f',
3484887Schin 		'f',		'\f',		'\f',
3494887Schin 		'f',		'\f',		'\f',
3504887Schin 		'f',		'\f',		'\f',
3514887Schin 		'f',		'\f',		'\f',
3524887Schin 	'n',
3534887Schin 		'n',		'\n',		'\n',
3544887Schin 		'n',		'\n',		'\n',
3554887Schin 		'n',		'\n',		'\n',
3564887Schin 		'n',		'\n',		'\n',
3574887Schin 		'n',		'\n',		'\n',
3584887Schin 	'r',
3594887Schin 		'r',		'\r',		'\r',
3604887Schin 		'r',		'\r',		'\r',
3614887Schin 		'r',		'\r',		'\r',
3624887Schin 		'r',		'\r',		'\r',
3634887Schin 		'r',		'\r',		'\r',
3644887Schin 	't',
3654887Schin 		't',		'\t',		'\t',
3664887Schin 		't',		'\t',		'\t',
3674887Schin 		't',		'\t',		'\t',
3684887Schin 		't',		'\t',		'\t',
3694887Schin 		't',		'\t',		'\t',
3704887Schin 	'v',
3714887Schin 		'v',		CC_vt,		CC_vt,
3724887Schin 		'v',		CC_vt,		CC_vt,
3734887Schin 		'v',		CC_vt,		CC_vt,
3744887Schin 		'v',		CC_vt,		CC_vt,
3754887Schin 		'v',		CC_vt,		CC_vt,
3764887Schin 	'x',
3774887Schin 		'x',		T_ESCAPE,	T_ESCAPE,
3784887Schin 		'x',		T_ESCAPE,	T_ESCAPE,
3794887Schin 		'x',		T_ESCAPE,	T_ESCAPE,
3804887Schin 		'x',		T_ESCAPE,	T_ESCAPE,
3814887Schin 		'x',		T_ESCAPE,	T_ESCAPE,
3824887Schin };
3834887Schin 
3844887Schin /*
3854887Schin  * all allocation/free done here
3864887Schin  * interface compatible with vmresize()
3874887Schin  *
3884887Schin  *	malloc(n)	alloc(0,n)
3894887Schin  *	realloc(p,n)	alloc(p,n)
3904887Schin  *	free(p)		alloc(p,0)
3914887Schin  */
3924887Schin 
3934887Schin void*
alloc(register regdisc_t * disc,void * p,size_t n)3944887Schin alloc(register regdisc_t* disc, void* p, size_t n)
3954887Schin {
3964887Schin 	if (disc->re_resizef)
3974887Schin 	{
3984887Schin 		if (!n && (disc->re_flags & REG_NOFREE))
3994887Schin 			return 0;
4004887Schin 		return (*disc->re_resizef)(disc->re_resizehandle, p, n);
4014887Schin 	}
4024887Schin 	else if (!n)
4034887Schin 	{
4044887Schin 		if (!(disc->re_flags & REG_NOFREE))
4054887Schin 			free(p);
4064887Schin 		return 0;
4074887Schin 	}
4084887Schin 	else if (p)
4094887Schin 		return realloc(p, n);
4104887Schin 	else
4114887Schin 		return malloc(n);
4124887Schin }
413