/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2009 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped /* * posix regex state and alloc */ #include "reglib.h" #if _PACKAGE_ast #include #else #define CC_bel '\a' #define CC_esc '\033' #define CC_vt '\v' #endif /* * state shared by all threads */ State_t state = { { -1, -1 }, /* * escape code table * the "funny" things get special treatment at ends of BRE * * BRE 0:normal 1:escaped 2:escaped-char-class * ERE 3:normal 4:escaped 5:escaped-char-class * ARE 6:normal 7:escaped 8:escaped-char-class * SRE 9:normal 10:escaped 11:escaped-char-class * KRE 12:normal 13:escaped 14:escaped-char-class */ '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '\\', '^', /* funny */ '^', '^', '^', T_CFLX, '^', '^', T_CFLX, '^', '^', '^', '^', '^', '^', '^', '^', '.', T_DOT, '.', T_BAD, T_DOT, '.', T_BAD, T_DOT, '.', T_BAD, '.', '.', T_BAD, '.', '.', T_BAD, '$', /* funny */ '$', '$', T_BAD, T_DOLL, '$', T_BAD, T_DOLL, '$', T_BAD, '$', '$', T_BAD, '$', '$', T_BAD, '*', T_STAR, '*', T_BAD, T_STAR, '*', T_BAD, T_STAR, '*', T_BAD, T_STAR, '*', '*', T_STAR, '*', '*', '[', T_BRA, '[', '[', T_BRA, '[', '[', T_BRA, '[', '[', T_BRA, '[', '[', T_BRA, '[', '[', '|', '|', T_BAD, T_BAD, T_BAR, '|', T_BAD, T_BAR, '|', T_BAD, '|', '|', T_BAD, T_BAR, '|', T_BAD, '+', '+', T_BAD, T_BAD, T_PLUS, '+', T_BAD, T_PLUS, '+', T_BAD, '+', '+', T_BAD, T_PLUS, '+', T_BAD, '?', '?', T_BAD, T_BAD, T_QUES, '?', T_BAD, T_QUES, '?', T_BAD, T_QUES, '?', '?', T_QUES, '?', '?', '(', '(', T_OPEN, T_BAD, T_OPEN, '(', T_BAD, T_OPEN, '(', T_BAD, '(', '(', '(', T_OPEN, '(', '(', ')', ')', T_CLOSE, T_BAD, T_CLOSE, ')', T_BAD, T_CLOSE, ')', T_BAD, ')', ')', ')', T_CLOSE, ')', ')', '{', '{', T_LEFT, T_BAD, T_LEFT, '{', T_BAD, T_LEFT, '{', T_BAD, '{', '{', '{', T_LEFT, '{', '{', '}', '}', T_RIGHT, T_BAD, '}', T_BAD, T_BAD, '}', T_BAD, T_BAD, '}', '}', '}', '}', '}', '}', '&', '&', T_BAD, T_BAD, '&', T_AND, T_BAD, T_AND, '&', T_BAD, '&', '&', T_BAD, T_AND, '&', T_BAD, '!', '!', T_BAD, T_BAD, '!', T_BANG, T_BAD, T_BANG, '!', T_BAD, '!', '!', T_BAD, T_BANG, '!', T_BAD, '@', '@', T_BAD, T_BAD, '@', T_BAD, T_BAD, '@', T_BAD, T_BAD, '@', '@', T_BAD, T_AT, '@', T_BAD, '~', '~', T_BAD, T_BAD, '~', T_BAD, T_BAD, '~', T_BAD, T_BAD, '~', '~', T_BAD, T_TILDE, '~', T_BAD, '%', '%', T_BAD, T_BAD, '%', T_BAD, T_BAD, '%', T_BAD, T_BAD, '%', '%', T_BAD, T_PERCENT, '%', T_BAD, '<', '<', T_LT, T_BAD, '<', T_LT, T_BAD, T_LT, '<', T_BAD, '<', '<', T_BAD, '<', '<', T_BAD, '>', '>', T_GT, T_BAD, '>', T_GT, T_BAD, T_GT, '>', T_BAD, '>', '>', T_BAD, '>', '>', T_BAD, /* backrefs */ '0', '0', T_BACK+0, T_ESCAPE, '0', T_BACK+0, T_ESCAPE, '0', T_BACK+0, T_ESCAPE, '0', T_BACK+0, T_ESCAPE, '0', T_BACK+0, T_ESCAPE, '1', '1', T_BACK+1, T_ESCAPE, '1', T_BACK+1, T_ESCAPE, '1', T_BACK+1, T_ESCAPE, '1', T_BACK+1, T_ESCAPE, '1', T_BACK+1, T_ESCAPE, '2', '2', T_BACK+2, T_ESCAPE, '2', T_BACK+2, T_ESCAPE, '2', T_BACK+2, T_ESCAPE, '2', T_BACK+2, T_ESCAPE, '2', T_BACK+2, T_ESCAPE, '3', '3', T_BACK+3, T_ESCAPE, '3', T_BACK+3, T_ESCAPE, '3', T_BACK+3, T_ESCAPE, '3', T_BACK+3, T_ESCAPE, '3', T_BACK+3, T_ESCAPE, '4', '4', T_BACK+4, T_ESCAPE, '4', T_BACK+4, T_ESCAPE, '4', T_BACK+4, T_ESCAPE, '4', T_BACK+4, T_ESCAPE, '4', T_BACK+4, T_ESCAPE, '5', '5', T_BACK+5, T_ESCAPE, '5', T_BACK+5, T_ESCAPE, '5', T_BACK+5, T_ESCAPE, '5', T_BACK+5, T_ESCAPE, '5', T_BACK+5, T_ESCAPE, '6', '6', T_BACK+6, T_ESCAPE, '6', T_BACK+6, T_ESCAPE, '6', T_BACK+6, T_ESCAPE, '6', T_BACK+6, T_ESCAPE, '6', T_BACK+6, T_ESCAPE, '7', '7', T_BACK+7, T_ESCAPE, '7', T_BACK+7, T_ESCAPE, '7', T_BACK+7, T_ESCAPE, '7', T_BACK+7, T_ESCAPE, '7', T_BACK+7, T_ESCAPE, '8', '8', T_BACK+8, T_ESCAPE, '8', T_BACK+8, T_ESCAPE, '8', T_BACK+8, T_ESCAPE, '8', '8', T_ESCAPE, '8', T_BACK+8, T_ESCAPE, '9', '9', T_BACK+9, T_ESCAPE, '9', T_BACK+9, T_ESCAPE, '9', T_BACK+9, T_ESCAPE, '9', '9', T_ESCAPE, '9', T_BACK+9, T_ESCAPE, /* perl */ 'A', 'A', T_BEG_STR, T_BAD, 'A', T_BEG_STR, T_BAD, 'A', T_BEG_STR, T_BAD, 'A', T_BEG_STR, T_BAD, 'A', T_BEG_STR, T_BAD, 'b', 'b', T_WORD, '\b', 'b', T_WORD, '\b', 'b', T_WORD, '\b', 'b', T_WORD, '\b', 'b', T_WORD, '\b', 'B', 'B', T_WORD_NOT, T_BAD, 'B', T_WORD_NOT, T_BAD, 'B', T_WORD_NOT, T_BAD, 'B', T_WORD_NOT, T_BAD, 'B', T_WORD_NOT, T_BAD, 'd', 'd', T_DIGIT, T_DIGIT, 'd', T_DIGIT, T_DIGIT, 'd', T_DIGIT, T_DIGIT, 'd', T_DIGIT, T_DIGIT, 'd', T_DIGIT, T_DIGIT, 'D', 'D', T_DIGIT_NOT, T_DIGIT_NOT, 'D', T_DIGIT_NOT, T_DIGIT_NOT, 'D', T_DIGIT_NOT, T_DIGIT_NOT, 'D', T_DIGIT_NOT, T_DIGIT_NOT, 'D', T_DIGIT_NOT, T_DIGIT_NOT, 's', 's', T_SPACE, T_SPACE, 's', T_SPACE, T_SPACE, 's', T_SPACE, T_SPACE, 's', T_SPACE, T_SPACE, 's', T_SPACE, T_SPACE, 'S', 'S', T_SPACE_NOT, T_SPACE_NOT, 'S', T_SPACE_NOT, T_SPACE_NOT, 'S', T_SPACE_NOT, T_SPACE_NOT, 'S', T_SPACE_NOT, T_SPACE_NOT, 'S', T_SPACE_NOT, T_SPACE_NOT, 'w', 'w', T_ALNUM, T_ALNUM, 'w', T_ALNUM, T_ALNUM, 'w', T_ALNUM, T_ALNUM, 'w', T_ALNUM, T_ALNUM, 'w', T_ALNUM, T_ALNUM, 'W', 'W', T_ALNUM_NOT, T_ALNUM_NOT, 'W', T_ALNUM_NOT, T_ALNUM_NOT, 'W', T_ALNUM_NOT, T_ALNUM_NOT, 'W', T_ALNUM_NOT, T_ALNUM_NOT, 'W', T_ALNUM_NOT, T_ALNUM_NOT, 'z', 'z', T_FIN_STR, T_BAD, 'z', T_FIN_STR, T_BAD, 'z', T_FIN_STR, T_BAD, 'z', T_FIN_STR, T_BAD, 'z', T_FIN_STR, T_BAD, 'Z', 'Z', T_END_STR, T_BAD, 'Z', T_END_STR, T_BAD, 'Z', T_END_STR, T_BAD, 'Z', T_END_STR, T_BAD, 'Z', T_END_STR, T_BAD, /* C escapes */ 'a', 'a', CC_bel, CC_bel, 'a', CC_bel, CC_bel, 'a', CC_bel, CC_bel, 'a', CC_bel, CC_bel, 'a', CC_bel, CC_bel, 'c', 'c', T_ESCAPE, T_ESCAPE, 'c', T_ESCAPE, T_ESCAPE, 'c', T_ESCAPE, T_ESCAPE, 'c', T_ESCAPE, T_ESCAPE, 'c', T_ESCAPE, T_ESCAPE, 'C', 'C', T_ESCAPE, T_ESCAPE, 'C', T_ESCAPE, T_ESCAPE, 'C', T_ESCAPE, T_ESCAPE, 'C', T_ESCAPE, T_ESCAPE, 'C', T_ESCAPE, T_ESCAPE, 'e', 'e', CC_esc, CC_esc, 'e', CC_esc, CC_esc, 'e', CC_esc, CC_esc, 'e', CC_esc, CC_esc, 'e', CC_esc, CC_esc, 'E', 'E', CC_esc, CC_esc, 'E', CC_esc, CC_esc, 'E', CC_esc, CC_esc, 'E', CC_esc, CC_esc, 'E', CC_esc, CC_esc, 'f', 'f', '\f', '\f', 'f', '\f', '\f', 'f', '\f', '\f', 'f', '\f', '\f', 'f', '\f', '\f', 'n', 'n', '\n', '\n', 'n', '\n', '\n', 'n', '\n', '\n', 'n', '\n', '\n', 'n', '\n', '\n', 'r', 'r', '\r', '\r', 'r', '\r', '\r', 'r', '\r', '\r', 'r', '\r', '\r', 'r', '\r', '\r', 't', 't', '\t', '\t', 't', '\t', '\t', 't', '\t', '\t', 't', '\t', '\t', 't', '\t', '\t', 'v', 'v', CC_vt, CC_vt, 'v', CC_vt, CC_vt, 'v', CC_vt, CC_vt, 'v', CC_vt, CC_vt, 'v', CC_vt, CC_vt, 'x', 'x', T_ESCAPE, T_ESCAPE, 'x', T_ESCAPE, T_ESCAPE, 'x', T_ESCAPE, T_ESCAPE, 'x', T_ESCAPE, T_ESCAPE, 'x', T_ESCAPE, T_ESCAPE, }; /* * all allocation/free done here * interface compatible with vmresize() * * malloc(n) alloc(0,n) * realloc(p,n) alloc(p,n) * free(p) alloc(p,0) */ void* alloc(register regdisc_t* disc, void* p, size_t n) { if (disc->re_resizef) { if (!n && (disc->re_flags & REG_NOFREE)) return 0; return (*disc->re_resizef)(disc->re_resizehandle, p, n); } else if (!n) { if (!(disc->re_flags & REG_NOFREE)) free(p); return 0; } else if (p) return realloc(p, n); else return malloc(n); }