6 typedef struct RethreadQ RethreadQ;
13 rregexec(Reprog *p, Rune *str, Resub *sem, int msize)
15 RethreadQ lists[2], *clist, *nlist, *tmp;
16 Rethread *t, *next, *pool, *avail;
18 Rune *rsp, *rep, endr, r;
24 if(p->startinst->gen != 0) {
25 for(ci = p->startinst; ci < p->startinst + p->len; ci++)
29 memset(p->threads, 0, sizeof(Rethread)*p->nthr);
33 clist->tail = &clist->head;
36 nlist->tail = &nlist->head;
45 if(sem != nil && msize > 0) {
48 if(sem->rep != nil && *sem->rep != L'\0') {
54 for(r = 1; r != L'\0'; rsp++) {
59 assert(pool < p->threads + p->nthr);
67 memset(t->sem, 0, sizeof(Resub)*msize);
71 clist->tail = &t->next;
78 if(ci->gen == gen || matchgen && t->gen > matchgen)
85 case OANY: /* fallthrough */
90 nlist->tail = &t->next;
108 nlist->tail = &t->next;
121 if(rsp == str || rsp[-1] == L'\n') {
127 if(r == L'\n' || r == L'\0' && rep == nil) {
137 assert(pool < p->threads + p->nthr);
145 memcpy(next->sem, t->sem, sizeof(Resub)*msize);
146 next->next = t->next;
153 t->sem[ci->sub].rsp = rsp;
159 if(sem != nil && msize > 0) {
160 memcpy(sem, t->sem, sizeof(Resub)*msize);
166 t->sem[ci->sub].rep = rsp;
183 nlist->tail = &nlist->head;
187 return matchgen > 0 ? 1 : 0;