rem: tchar ibuf[BUFSIZ];
add: tchar ibuf[BUFSIZ + MB_LEN_MAX];
context: backeval(tchar *cp, bool literal){	int pvec[2];	int quoted = (literal || (cp[0] & QUOTE)) ? QUOTE : 0;	tchar ibuf[BUFSIZ];	int icnt = 0, c;	tchar *ip;	bool hadnl = 0;	tchar *fakecom[2];	struct command faket;#ifdef TRACE	tprintf("TRACE- backeval()\n");#endif	faket.t_dtyp = TCOM;	faket.t_dflg = 0;	faket.t_dlef = 0;	faket.t_drit = 0;	faket.t_dspr = 0;	faket.t_dcom = fakecom;	fakecom[0] = S_QPPPQ; /* "` ... `" */;	fakecom[1] = 0;	/*	 * We do the psave job to temporarily change the current job	 * so that the following fork is considered a separate job.	 * This is so that when backquotes are used in a	 * builtin function that calls glob the "current job" is not corrupted.	 * We only need one level of pushed jobs as long as we are sure to	 * fork here.	 */	psavejob();	/*	 * It would be nicer if we could integrate this redirection more	 * with the routines in sh.sem.c by doing a fake execute on a builtin	 * function that was piped out.	 */	mypipe(pvec);	if (pfork(&faket, -1) == 0) {		struct wordent paraml;		struct command *t;		tchar oHIST;		new_process();		(void) close(pvec[0]);		unsetfd(pvec[0]);		(void) dmove(pvec[1], 1);		(void) dmove(SHDIAG, 2);		reinitdesc(0, NULL);		arginp = cp;		while (*cp)			*cp++ &= TRIM;		/*		 *	disable history subsitution in sub-shell		 *  of `` evaluation prevents possible		 *  infinite recursion of `` evaluation		 */		oHIST = HIST;		HIST = 0;		(void) lex(&paraml);		HIST = oHIST;		if (err)			error("%s", gettext(err));		alias(&paraml);		t = syntax(paraml.next, &paraml, 0);		if (err)			error("%s", gettext(err));		if (t)			t->t_dflg |= FPAR;		(void) signal(SIGTSTP, SIG_IGN);		(void) signal(SIGTTIN, SIG_IGN);		(void) signal(SIGTTOU, SIG_IGN);		execute(t, -1);		exitstat();	}	xfree(cp);	(void) close(pvec[1]);	unsetfd(pvec[1]);	do {		int cnt = 0;		for (;;) {			if (icnt == 0) {				ip = ibuf;				icnt = read_(pvec[0], ip, BUFSIZ);				if (icnt <= 0) {					c = -1;					break;				}			}			if (hadnl)				break;			--icnt;			c = (*ip++ & TRIM);			if (c == 0)				break;			if (c == '\n') {				/*				 * Continue around the loop one				 * more time, so that we can eat				 * the last newline without terminating				 * this word.				 */				hadnl = 1;				continue;			}			if (!quoted && issp(c))				break;			cnt++;			psave(c | quoted);		}		/*		 * Unless at end-of-file, we will form a new word		 * here if there were characters in the word, or in		 * any case when we take text literally.  If		 * we didn't make empty words here when literal was		 * set then we would lose blank lines.		 */		if (c != -1 && (cnt || literal)) {			if (pargc == GAVSIZ)				break;			pword();		}		hadnl = 0;	} while (c >= 0);#ifdef GDEBUG	printf("done in backeval, pvec: %d %d\n", pvec[0], pvec[1]);	printf("also c = %c <%o>\n", (tchar) c, (tchar) c);#endif	(void) close(pvec[0]);	unsetfd(pvec[0]);	pwait();	prestjob();}