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