13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * substitution list 33e12c5d1SDavid du Colombier */ 4*219b2ee8SDavid du Colombier #define NSUBEXP 32 53e12c5d1SDavid du Colombier typedef struct Resublist Resublist; 63e12c5d1SDavid du Colombier struct Resublist 73e12c5d1SDavid du Colombier { 8*219b2ee8SDavid du Colombier Resub m[NSUBEXP]; 93e12c5d1SDavid du Colombier }; 103e12c5d1SDavid du Colombier 113e12c5d1SDavid du Colombier /* max character classes per program */ 123e12c5d1SDavid du Colombier Reprog RePrOg; 133e12c5d1SDavid du Colombier #define NCLASS (sizeof(RePrOg.class)/sizeof(Reclass)) 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier /* max rune ranges per character class */ 163e12c5d1SDavid du Colombier #define NCCRUNE (sizeof(Reclass)/sizeof(Rune)) 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier /* 193e12c5d1SDavid du Colombier * Actions and Tokens (Reinst types) 203e12c5d1SDavid du Colombier * 213e12c5d1SDavid du Colombier * 02xx are operators, value == precedence 223e12c5d1SDavid du Colombier * 03xx are tokens, i.e. operands for operators 233e12c5d1SDavid du Colombier */ 243e12c5d1SDavid du Colombier #define RUNE 0177 253e12c5d1SDavid du Colombier #define OPERATOR 0200 /* Bitmask of all operators */ 263e12c5d1SDavid du Colombier #define START 0200 /* Start, used for marker on stack */ 273e12c5d1SDavid du Colombier #define RBRA 0201 /* Right bracket, ) */ 283e12c5d1SDavid du Colombier #define LBRA 0202 /* Left bracket, ( */ 293e12c5d1SDavid du Colombier #define OR 0203 /* Alternation, | */ 303e12c5d1SDavid du Colombier #define CAT 0204 /* Concatentation, implicit operator */ 313e12c5d1SDavid du Colombier #define STAR 0205 /* Closure, * */ 323e12c5d1SDavid du Colombier #define PLUS 0206 /* a+ == aa* */ 333e12c5d1SDavid du Colombier #define QUEST 0207 /* a? == a|nothing, i.e. 0 or 1 a's */ 343e12c5d1SDavid du Colombier #define ANY 0300 /* Any character except newline, . */ 353e12c5d1SDavid du Colombier #define ANYNL 0301 /* Any character including newline, . */ 363e12c5d1SDavid du Colombier #define NOP 0302 /* No operation, internal use only */ 373e12c5d1SDavid du Colombier #define BOL 0303 /* Beginning of line, ^ */ 383e12c5d1SDavid du Colombier #define EOL 0304 /* End of line, $ */ 393e12c5d1SDavid du Colombier #define CCLASS 0305 /* Character class, [] */ 403e12c5d1SDavid du Colombier #define NCCLASS 0306 /* Negated character class, [] */ 413e12c5d1SDavid du Colombier #define END 0377 /* Terminate: match found */ 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier /* 443e12c5d1SDavid du Colombier * regexec execution lists 453e12c5d1SDavid du Colombier */ 46*219b2ee8SDavid du Colombier #define LISTSIZE 10 47*219b2ee8SDavid du Colombier #define BIGLISTSIZE (10*LISTSIZE) 483e12c5d1SDavid du Colombier typedef struct Relist Relist; 493e12c5d1SDavid du Colombier struct Relist 503e12c5d1SDavid du Colombier { 513e12c5d1SDavid du Colombier Reinst* inst; /* Reinstruction of the thread */ 523e12c5d1SDavid du Colombier Resublist se; /* matched subexpressions in this thread */ 533e12c5d1SDavid du Colombier }; 54*219b2ee8SDavid du Colombier typedef struct Reljunk Reljunk; 55*219b2ee8SDavid du Colombier struct Reljunk 56*219b2ee8SDavid du Colombier { 57*219b2ee8SDavid du Colombier Relist* relist[2]; 58*219b2ee8SDavid du Colombier Relist* reliste[2]; 59*219b2ee8SDavid du Colombier int starttype; 60*219b2ee8SDavid du Colombier Rune startchar; 61*219b2ee8SDavid du Colombier char* starts; 62*219b2ee8SDavid du Colombier char* eol; 63*219b2ee8SDavid du Colombier Rune* rstarts; 64*219b2ee8SDavid du Colombier Rune* reol; 65*219b2ee8SDavid du Colombier }; 663e12c5d1SDavid du Colombier 673e12c5d1SDavid du Colombier extern Relist* _renewthread(Relist*, Reinst*, Resublist*); 683e12c5d1SDavid du Colombier extern void _renewmatch(Resub*, int, Resublist*); 69*219b2ee8SDavid du Colombier extern Relist* _renewemptythread(Relist*, Reinst*, char*); 70*219b2ee8SDavid du Colombier extern Relist* _rrenewemptythread(Relist*, Reinst*, Rune*); 71