1219b2ee8SDavid du Colombier #pragma src "/sys/src/libregexp" 23e12c5d1SDavid du Colombier #pragma lib "libregexp.a" 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier typedef struct Resub Resub; 53e12c5d1SDavid du Colombier typedef struct Reclass Reclass; 63e12c5d1SDavid du Colombier typedef struct Reinst Reinst; 73e12c5d1SDavid du Colombier typedef struct Reprog Reprog; 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier /* 103e12c5d1SDavid du Colombier * Sub expression matches 113e12c5d1SDavid du Colombier */ 123e12c5d1SDavid du Colombier struct Resub{ 133e12c5d1SDavid du Colombier union 143e12c5d1SDavid du Colombier { 153e12c5d1SDavid du Colombier char *sp; 163e12c5d1SDavid du Colombier Rune *rsp; 173e12c5d1SDavid du Colombier }; 183e12c5d1SDavid du Colombier union 193e12c5d1SDavid du Colombier { 203e12c5d1SDavid du Colombier char *ep; 213e12c5d1SDavid du Colombier Rune *rep; 223e12c5d1SDavid du Colombier }; 233e12c5d1SDavid du Colombier }; 243e12c5d1SDavid du Colombier 253e12c5d1SDavid du Colombier /* 263e12c5d1SDavid du Colombier * character class, each pair of rune's defines a range 273e12c5d1SDavid du Colombier */ 283e12c5d1SDavid du Colombier struct Reclass{ 293e12c5d1SDavid du Colombier Rune *end; 303e12c5d1SDavid du Colombier Rune spans[64]; 313e12c5d1SDavid du Colombier }; 323e12c5d1SDavid du Colombier 333e12c5d1SDavid du Colombier /* 343e12c5d1SDavid du Colombier * Machine instructions 353e12c5d1SDavid du Colombier */ 363e12c5d1SDavid du Colombier struct Reinst{ 37219b2ee8SDavid du Colombier int type; 383e12c5d1SDavid du Colombier union { 393e12c5d1SDavid du Colombier Reclass *cp; /* class pointer */ 403e12c5d1SDavid du Colombier Rune r; /* character */ 413e12c5d1SDavid du Colombier int subid; /* sub-expression id for RBRA and LBRA */ 423e12c5d1SDavid du Colombier Reinst *right; /* right child of OR */ 433e12c5d1SDavid du Colombier }; 443e12c5d1SDavid du Colombier union { /* regexp relies on these two being in the same union */ 453e12c5d1SDavid du Colombier Reinst *left; /* left child of OR */ 463e12c5d1SDavid du Colombier Reinst *next; /* next instruction for CAT & LBRA */ 473e12c5d1SDavid du Colombier }; 483e12c5d1SDavid du Colombier }; 493e12c5d1SDavid du Colombier 503e12c5d1SDavid du Colombier /* 513e12c5d1SDavid du Colombier * Reprogram definition 523e12c5d1SDavid du Colombier */ 533e12c5d1SDavid du Colombier struct Reprog{ 543e12c5d1SDavid du Colombier Reinst *startinst; /* start pc */ 553e12c5d1SDavid du Colombier Reclass class[16]; /* .data */ 563e12c5d1SDavid du Colombier Reinst firstinst[5]; /* .text */ 573e12c5d1SDavid du Colombier }; 583e12c5d1SDavid du Colombier 593e12c5d1SDavid du Colombier extern Reprog *regcomp(char*); 603e12c5d1SDavid du Colombier extern Reprog *regcomplit(char*); 613e12c5d1SDavid du Colombier extern Reprog *regcompnl(char*); 623e12c5d1SDavid du Colombier extern void regerror(char*); 633e12c5d1SDavid du Colombier extern int regexec(Reprog*, char*, Resub*, int); 64*9a747e4fSDavid du Colombier extern void regsub(char*, char*, int, Resub*, int); 653e12c5d1SDavid du Colombier extern int rregexec(Reprog*, Rune*, Resub*, int); 66*9a747e4fSDavid du Colombier extern void rregsub(Rune*, Rune*, int, Resub*, int); 67