1*74a4d8c2SCharles.Forsyth #pragma src "/usr/inferno/libregexp" 2*74a4d8c2SCharles.Forsyth #pragma lib "libregexp.a" 3*74a4d8c2SCharles.Forsyth 4*74a4d8c2SCharles.Forsyth typedef struct Resub Resub; 5*74a4d8c2SCharles.Forsyth typedef struct Reclass Reclass; 6*74a4d8c2SCharles.Forsyth typedef struct Reinst Reinst; 7*74a4d8c2SCharles.Forsyth typedef struct Reprog Reprog; 8*74a4d8c2SCharles.Forsyth 9*74a4d8c2SCharles.Forsyth /* 10*74a4d8c2SCharles.Forsyth * Sub expression matches 11*74a4d8c2SCharles.Forsyth */ 12*74a4d8c2SCharles.Forsyth struct Resub{ 13*74a4d8c2SCharles.Forsyth union 14*74a4d8c2SCharles.Forsyth { 15*74a4d8c2SCharles.Forsyth char *sp; 16*74a4d8c2SCharles.Forsyth Rune *rsp; 17*74a4d8c2SCharles.Forsyth }s; 18*74a4d8c2SCharles.Forsyth union 19*74a4d8c2SCharles.Forsyth { 20*74a4d8c2SCharles.Forsyth char *ep; 21*74a4d8c2SCharles.Forsyth Rune *rep; 22*74a4d8c2SCharles.Forsyth }e; 23*74a4d8c2SCharles.Forsyth }; 24*74a4d8c2SCharles.Forsyth 25*74a4d8c2SCharles.Forsyth /* 26*74a4d8c2SCharles.Forsyth * character class, each pair of rune's defines a range 27*74a4d8c2SCharles.Forsyth */ 28*74a4d8c2SCharles.Forsyth struct Reclass{ 29*74a4d8c2SCharles.Forsyth Rune *end; 30*74a4d8c2SCharles.Forsyth Rune spans[64]; 31*74a4d8c2SCharles.Forsyth }; 32*74a4d8c2SCharles.Forsyth 33*74a4d8c2SCharles.Forsyth /* 34*74a4d8c2SCharles.Forsyth * Machine instructions 35*74a4d8c2SCharles.Forsyth */ 36*74a4d8c2SCharles.Forsyth struct Reinst{ 37*74a4d8c2SCharles.Forsyth int type; 38*74a4d8c2SCharles.Forsyth union { 39*74a4d8c2SCharles.Forsyth Reclass *cp; /* class pointer */ 40*74a4d8c2SCharles.Forsyth Rune r; /* character */ 41*74a4d8c2SCharles.Forsyth int subid; /* sub-expression id for RBRA and LBRA */ 42*74a4d8c2SCharles.Forsyth Reinst *right; /* right child of OR */ 43*74a4d8c2SCharles.Forsyth }u1; 44*74a4d8c2SCharles.Forsyth union { /* regexp relies on these two being in the same union */ 45*74a4d8c2SCharles.Forsyth Reinst *left; /* left child of OR */ 46*74a4d8c2SCharles.Forsyth Reinst *next; /* next instruction for CAT & LBRA */ 47*74a4d8c2SCharles.Forsyth }u2; 48*74a4d8c2SCharles.Forsyth }; 49*74a4d8c2SCharles.Forsyth 50*74a4d8c2SCharles.Forsyth /* 51*74a4d8c2SCharles.Forsyth * Reprogram definition 52*74a4d8c2SCharles.Forsyth */ 53*74a4d8c2SCharles.Forsyth struct Reprog{ 54*74a4d8c2SCharles.Forsyth Reinst *startinst; /* start pc */ 55*74a4d8c2SCharles.Forsyth Reclass class[16]; /* .data */ 56*74a4d8c2SCharles.Forsyth Reinst firstinst[5]; /* .text */ 57*74a4d8c2SCharles.Forsyth }; 58*74a4d8c2SCharles.Forsyth 59*74a4d8c2SCharles.Forsyth extern Reprog *regcomp(char*); 60*74a4d8c2SCharles.Forsyth extern Reprog *regcomplit(char*); 61*74a4d8c2SCharles.Forsyth extern Reprog *regcompnl(char*); 62*74a4d8c2SCharles.Forsyth extern void regerror(char*); 63*74a4d8c2SCharles.Forsyth extern int regexec(Reprog*, char*, Resub*, int); 64*74a4d8c2SCharles.Forsyth extern void regsub(char*, char*, Resub*, int); 65*74a4d8c2SCharles.Forsyth extern int rregexec(Reprog*, Rune*, Resub*, int); 66*74a4d8c2SCharles.Forsyth extern void rregsub(Rune*, Rune*, Resub*, int); 67