return(backref(m, sp+len, stop, ss+1, stopst, lev));
return(backref(m, sp+len, stop, ss+1, stopst, lev, rec));
backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst,    sopno lev)			/* PLUS nesting level */{	int i;	sopno ss;	/* start sop of current subRE */	char *sp;	/* start of string matched by it */	sopno ssub;	/* start sop of subsubRE */	sopno esub;	/* end sop of subsubRE */	char *ssp;	/* start of string matched by subsubRE */	char *dp;	size_t len;	int hard;	sop s;	regoff_t offsave;	cset *cs;	AT("back", start, stop, startst, stopst);	sp = start;	/* get as far as we can with easy stuff */	hard = 0;	for (ss = startst; !hard && ss < stopst; ss++)		switch (OP(s = m->g->strip[ss])) {		case OCHAR:			if (sp == stop || *sp++ != (char)OPND(s))				return(NULL);			break;		case OANY:			if (sp == stop)				return(NULL);			sp++;			break;		case OANYOF:			cs = &m->g->sets[OPND(s)];			if (sp == stop || !CHIN(cs, *sp++))				return(NULL);			break;		case OBOL:			if ( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||					(sp < m->endp && *(sp-1) == '\n' &&						(m->g->cflags&REG_NEWLINE)) )				{ /* yes */ }			else				return(NULL);			break;		case OEOL:			if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||					(sp < m->endp && *sp == '\n' &&						(m->g->cflags&REG_NEWLINE)) )				{ /* yes */ }			else				return(NULL);			break;		case OBOW:			if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||					(sp < m->endp && *(sp-1) == '\n' &&						(m->g->cflags&REG_NEWLINE)) ||					(sp > m->beginp &&							!ISWORD(*(sp-1))) ) &&					(sp < m->endp && ISWORD(*sp)) )				{ /* yes */ }			else				return(NULL);			break;		case OEOW:			if (( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||					(sp < m->endp && *sp == '\n' &&						(m->g->cflags&REG_NEWLINE)) ||					(sp < m->endp && !ISWORD(*sp)) ) &&					(sp > m->beginp && ISWORD(*(sp-1))) )				{ /* yes */ }			else				return(NULL);			break;		case O_QUEST:			break;		case OOR1:	/* matches null but needs to skip */			ss++;			s = m->g->strip[ss];			do {				assert(OP(s) == OOR2);				ss += OPND(s);			} while (OP(s = m->g->strip[ss]) != O_CH);			/* note that the ss++ gets us past the O_CH */			break;		default:	/* have to make a choice */			hard = 1;			break;		}	if (!hard) {		/* that was it! */		if (sp != stop)			return(NULL);		return(sp);	}	ss--;			/* adjust for the for's final increment */	/* the hard stuff */	AT("hard", sp, stop, ss, stopst);	s = m->g->strip[ss];	switch (OP(s)) {	case OBACK_:		/* the vilest depths */		i = OPND(s);		assert(0 < i && i <= m->g->nsub);		if (m->pmatch[i].rm_eo == -1)			return(NULL);		assert(m->pmatch[i].rm_so != -1);		len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;		if (len == 0)			return(NULL);		assert(stop - m->beginp >= len);		if (sp > stop - len)			return(NULL);	/* not enough left to match */		ssp = m->offp + m->pmatch[i].rm_so;		if (memcmp(sp, ssp, len) != 0)			return(NULL);		while (m->g->strip[ss] != SOP(O_BACK, i))			ss++;		return(backref(m, sp+len, stop, ss+1, stopst, lev));		break;	case OQUEST_:		/* to null or not */		dp = backref(m, sp, stop, ss+1, stopst, lev);		if (dp != NULL)			return(dp);	/* not */		return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev));		break;	case OPLUS_:		assert(m->lastpos != NULL);		assert(lev+1 <= m->g->nplus);		m->lastpos[lev+1] = sp;		return(backref(m, sp, stop, ss+1, stopst, lev+1));		break;	case O_PLUS:		if (sp == m->lastpos[lev])	/* last pass matched null */			return(backref(m, sp, stop, ss+1, stopst, lev-1));		/* try another pass */		m->lastpos[lev] = sp;		dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev);		if (dp == NULL)			return(backref(m, sp, stop, ss+1, stopst, lev-1));		else			return(dp);		break;	case OCH_:		/* find the right one, if any */		ssub = ss + 1;		esub = ss + OPND(s) - 1;		assert(OP(m->g->strip[esub]) == OOR1);		for (;;) {	/* find first matching branch */			dp = backref(m, sp, stop, ssub, esub, lev);			if (dp != NULL)				return(dp);			/* that one missed, try next one */			if (OP(m->g->strip[esub]) == O_CH)				return(NULL);	/* there is none */			esub++;			assert(OP(m->g->strip[esub]) == OOR2);			ssub = esub + 1;			esub += OPND(m->g->strip[esub]);			if (OP(m->g->strip[esub]) == OOR2)				esub--;			else				assert(OP(m->g->strip[esub]) == O_CH);		}		break;	case OLPAREN:		/* must undo assignment if rest fails */		i = OPND(s);		assert(0 < i && i <= m->g->nsub);		offsave = m->pmatch[i].rm_so;		m->pmatch[i].rm_so = sp - m->offp;		dp = backref(m, sp, stop, ss+1, stopst, lev);		if (dp != NULL)			return(dp);		m->pmatch[i].rm_so = offsave;		return(NULL);		break;	case ORPAREN:		/* must undo assignment if rest fails */		i = OPND(s);		assert(0 < i && i <= m->g->nsub);		offsave = m->pmatch[i].rm_eo;		m->pmatch[i].rm_eo = sp - m->offp;		dp = backref(m, sp, stop, ss+1, stopst, lev);		if (dp != NULL)			return(dp);		m->pmatch[i].rm_eo = offsave;		return(NULL);		break;	default:		/* uh oh */		assert(nope);		break;	}	/* "can't happen" */	assert(nope);	/* NOTREACHED */}