libregexp: revert regexp fix
diff --git a/src/libregexp/rregexec.c b/src/libregexp/rregexec.c
index 907ddef..ec7907d 100644
--- a/src/libregexp/rregexec.c
+++ b/src/libregexp/rregexec.c
@@ -9,9 +9,9 @@
  */
 static int
 rregexec1(Reprog *progp,	/* program to run */
-	Rune *bol,	/* string to run machine on */
-	Resub *mp,	/* subexpression elements */
-	int ms,		/* number of elements at mp */
+	Rune *bol,		/* string to run machine on */
+	Resub *mp,		/* subexpression elements */
+	int ms,			/* number of elements at mp */
 	Reljunk *j)
 {
 	int flag=0;
@@ -28,7 +28,7 @@
 	Rune *p;
 
 	match = 0;
-	checkstart = j->starttype;
+	checkstart = j->startchar;
 	if(mp)
 		for(i=0; i<ms; i++) {
 			mp[i].s.rsp = 0;
@@ -46,7 +46,7 @@
 			switch(j->starttype) {
 			case RUNE:
 				p = runestrchr(s, j->startchar);
-				if(p == 0 || (j->reol && p >= j->reol))
+				if(p == 0 || p == j->reol)
 					return match;
 				s = p;
 				break;
@@ -54,7 +54,7 @@
 				if(s == bol)
 					break;
 				p = runestrchr(s, '\n');
-				if(p == 0 || (j->reol && p+1 >= j->reol))
+				if(p == 0 || s == j->reol)
 					return match;
 				s = p+1;
 				break;
@@ -71,16 +71,15 @@
 		nl->inst = 0;
 
 		/* Add first instruction to current list */
-		if(match == 0)
-			_rrenewemptythread(tl, tle, progp->startinst, ms, s);
+		_rrenewemptythread(tl, progp->startinst, ms, s);
 
 		/* Execute machine until current list is empty */
 		for(tlp=tl; tlp->inst; tlp++){
-			for(inst = tlp->inst; ; inst = inst->u2.next){
+			for(inst=tlp->inst; ; inst = inst->u2.next){
 				switch(inst->type){
 				case RUNE:	/* regular character */
 					if(inst->u1.r == r)
-						if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+						if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case LBRA:
@@ -91,11 +90,11 @@
 					continue;
 				case ANY:
 					if(r != '\n')
-						if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+						if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case ANYNL:
-					if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+					if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case BOL:
@@ -110,7 +109,7 @@
 					ep = inst->u1.cp->end;
 					for(rp = inst->u1.cp->spans; rp < ep; rp += 2)
 						if(r >= rp[0] && r <= rp[1]){
-							if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+							if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 								return -1;
 							break;
 						}
@@ -121,12 +120,15 @@
 						if(r >= rp[0] && r <= rp[1])
 							break;
 					if(rp == ep)
-						if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+						if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
 							return -1;
 					break;
 				case OR:
-					/* expanded during renewthread; just a place holder */
-					break;
+					/* evaluate right choice later */
+					if(_renewthread(tl, inst->u1.right, ms, &tlp->se) == tle)
+						return -1;
+					/* efficiency: advance and re-evaluate */
+					continue;
 				case END:	/* Match! */
 					match = 1;
 					tlp->se.m[0].e.rep = s;
@@ -139,7 +141,7 @@
 		}
 		if(s == j->reol)
 			break;
-		checkstart = j->starttype && nl->inst==0;
+		checkstart = j->startchar && nl->inst==0;
 		s++;
 	}while(r);
 	return match;
@@ -153,26 +155,15 @@
 	Reljunk *j
 )
 {
-	int rv;
-	Relist *relist0, *relist1;
+	Relist relist0[5*LISTSIZE], relist1[5*LISTSIZE];
 
-	relist0 = malloc((progp->proglen+1)*sizeof(Relist));
-	if(relist0 == nil)
-		return -1;
-	relist1 = malloc((progp->proglen+1)*sizeof(Relist));
-	if(relist1 == nil){
-		free(relist1);
-		return -1;
-	}
+	/* mark space */
 	j->relist[0] = relist0;
 	j->relist[1] = relist1;
-	j->reliste[0] = relist0 + progp->proglen;
-	j->reliste[1] = relist1 + progp->proglen;
+	j->reliste[0] = relist0 + nelem(relist0) - 2;
+	j->reliste[1] = relist1 + nelem(relist1) - 2;
 
-	rv = rregexec1(progp, bol, mp, ms, j);
-	free(relist0);
-	free(relist1);
-	return rv;
+	return rregexec1(progp, bol, mp, ms, j);
 }
 
 extern int
@@ -208,8 +199,8 @@
 	/* mark space */
 	j.relist[0] = relist0;
 	j.relist[1] = relist1;
-	j.reliste[0] = relist0 + nelem(relist0) - 1;
-	j.reliste[1] = relist1 + nelem(relist1) - 1;
+	j.reliste[0] = relist0 + nelem(relist0) - 2;
+	j.reliste[1] = relist1 + nelem(relist1) - 2;
 
 	rv = rregexec1(progp, bol, mp, ms, &j);
 	if(rv >= 0)