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;
21 memset(p->threads, 0, sizeof(Rethread)*p->nthr);
24 if(p->startinst->gen != 0) {
25 for(ci = p->startinst; ci < p->startinst + p->len; ci++)
31 clist->tail = &clist->head;
34 nlist->tail = &nlist->head;
43 if(sem != nil && msize > 0) {
46 if(sem->rep != nil && *sem->rep != L'\0') {
53 for(r = L'☺'; r != L'\0'; rsp++) {
58 assert(pool < p->threads + p->nthr);
66 memset(t->sem, 0, sizeof(Resub)*msize);
70 clist->tail = &t->next;
84 case OANY: /* fallthrough */
89 nlist->tail = &t->next;
103 nlist->tail = &t->next;
112 if(rsp == str || rsp[-1] == L'\n') {
118 if(r == L'\n' || r == L'\0' && rep == nil) {
128 assert(pool < p->threads + p->nthr);
136 memcpy(next->sem, t->sem, sizeof(Resub)*msize);
137 next->next = t->next;
144 t->sem[ci->sub].rsp = rsp;
150 if(sem != nil && msize > 0) {
151 memcpy(sem, t->sem, sizeof(Resub)*msize);
157 t->sem[ci->sub].rep = rsp;
167 if(matchgen && next->gen > matchgen) {
168 *clist->tail = avail;
180 nlist->tail = &nlist->head;
184 return matchgen > 0 ? 1 : 0;