1*3e12c5d1SDavid du Colombier /* 2*3e12c5d1SDavid du Colombier * substitution list 3*3e12c5d1SDavid du Colombier */ 4*3e12c5d1SDavid du Colombier typedef struct Resublist Resublist; 5*3e12c5d1SDavid du Colombier struct Resublist 6*3e12c5d1SDavid du Colombier { 7*3e12c5d1SDavid du Colombier Resub m[32]; 8*3e12c5d1SDavid du Colombier }; 9*3e12c5d1SDavid du Colombier 10*3e12c5d1SDavid du Colombier /* max subexpressions per program */ 11*3e12c5d1SDavid du Colombier Resublist ReSuBlIsT; 12*3e12c5d1SDavid du Colombier #define NSUBEXP (sizeof(ReSuBlIsT.m)/sizeof(Resub)) 13*3e12c5d1SDavid du Colombier 14*3e12c5d1SDavid du Colombier /* max character classes per program */ 15*3e12c5d1SDavid du Colombier Reprog RePrOg; 16*3e12c5d1SDavid du Colombier #define NCLASS (sizeof(RePrOg.class)/sizeof(Reclass)) 17*3e12c5d1SDavid du Colombier 18*3e12c5d1SDavid du Colombier /* max rune ranges per character class */ 19*3e12c5d1SDavid du Colombier #define NCCRUNE (sizeof(Reclass)/sizeof(wchar_t)) 20*3e12c5d1SDavid du Colombier 21*3e12c5d1SDavid du Colombier /* 22*3e12c5d1SDavid du Colombier * Actions and Tokens (Reinst types) 23*3e12c5d1SDavid du Colombier * 24*3e12c5d1SDavid du Colombier * 02xx are operators, value == precedence 25*3e12c5d1SDavid du Colombier * 03xx are tokens, i.e. operands for operators 26*3e12c5d1SDavid du Colombier */ 27*3e12c5d1SDavid du Colombier #define RUNE 0177 28*3e12c5d1SDavid du Colombier #define OPERATOR 0200 /* Bitmask of all operators */ 29*3e12c5d1SDavid du Colombier #define START 0200 /* Start, used for marker on stack */ 30*3e12c5d1SDavid du Colombier #define RBRA 0201 /* Right bracket, ) */ 31*3e12c5d1SDavid du Colombier #define LBRA 0202 /* Left bracket, ( */ 32*3e12c5d1SDavid du Colombier #define OR 0203 /* Alternation, | */ 33*3e12c5d1SDavid du Colombier #define CAT 0204 /* Concatentation, implicit operator */ 34*3e12c5d1SDavid du Colombier #define STAR 0205 /* Closure, * */ 35*3e12c5d1SDavid du Colombier #define PLUS 0206 /* a+ == aa* */ 36*3e12c5d1SDavid du Colombier #define QUEST 0207 /* a? == a|nothing, i.e. 0 or 1 a's */ 37*3e12c5d1SDavid du Colombier #define ANY 0300 /* Any character except newline, . */ 38*3e12c5d1SDavid du Colombier #define ANYNL 0301 /* Any character including newline, . */ 39*3e12c5d1SDavid du Colombier #define NOP 0302 /* No operation, internal use only */ 40*3e12c5d1SDavid du Colombier #define BOL 0303 /* Beginning of line, ^ */ 41*3e12c5d1SDavid du Colombier #define EOL 0304 /* End of line, $ */ 42*3e12c5d1SDavid du Colombier #define CCLASS 0305 /* Character class, [] */ 43*3e12c5d1SDavid du Colombier #define NCCLASS 0306 /* Negated character class, [] */ 44*3e12c5d1SDavid du Colombier #define END 0377 /* Terminate: match found */ 45*3e12c5d1SDavid du Colombier 46*3e12c5d1SDavid du Colombier /* 47*3e12c5d1SDavid du Colombier * regexec execution lists 48*3e12c5d1SDavid du Colombier */ 49*3e12c5d1SDavid du Colombier #define LISTINCREMENT 8 50*3e12c5d1SDavid du Colombier typedef struct Relist Relist; 51*3e12c5d1SDavid du Colombier struct Relist 52*3e12c5d1SDavid du Colombier { 53*3e12c5d1SDavid du Colombier Reinst *inst; /* Reinstruction of the thread */ 54*3e12c5d1SDavid du Colombier Resublist se; /* matched subexpressions in this thread */ 55*3e12c5d1SDavid du Colombier }; 56*3e12c5d1SDavid du Colombier extern Relist* _relist[2]; 57*3e12c5d1SDavid du Colombier extern Relist* _reliste[2]; 58*3e12c5d1SDavid du Colombier extern int _relistsize; 59*3e12c5d1SDavid du Colombier 60*3e12c5d1SDavid du Colombier extern Relist* _renewthread(Relist*, Reinst*, Resublist*); 61*3e12c5d1SDavid du Colombier extern void _renewmatch(Resub*, int, Resublist*); 62