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