tchar popinlev(void) { tchar c = 0; if (--ninlev < 0) { ninlev = 0; return c; } if (dpenal != inlevp[ninlev]._dpenal) c = mkxfunc(DPENAL, inlevp[ninlev]._dpenal); apts = inlevp[ninlev]._apts; apts1 = inlevp[ninlev]._apts1; pts = inlevp[ninlev]._pts; pts1 = inlevp[ninlev]._pts1; font = inlevp[ninlev]._font; font1 = inlevp[ninlev]._font1; cc = inlevp[ninlev]._cc; c2 = inlevp[ninlev]._c2; ohc = inlevp[ninlev]._ohc; hyf = inlevp[ninlev]._hyf; tabc = inlevp[ninlev]._tabc; dotc = inlevp[ninlev]._dotc; dpenal = inlevp[ninlev]._dpenal; mchbits(); if (ninlev == 0) { free(inlevp); inlevp = NULL; ainlev = 0; } return c; }
tchar setdpenal(void) { if (getpenalty(&dpenal)) return mkxfunc(DPENAL, dpenal); return 0; }
tchar setpenalty(void) { int n; if (getpenalty(&n)) return mkxfunc(PENALTY, n); return 0; }
void storerq(int i) { tchar tp[2]; tp[0] = mkxfunc(RQ, i); tp[1] = 0; pushback(tp); }
void casewhile(void) { tchar c; int k, level, nl; filep newip; if (dip != d) wbfl(); if ((nextb = alloc()) == 0) { errprint("out of space"); edone(04); return; } newip = offset = nextb; wbf(mkxfunc(CC, 0)); wbf(XFUNC); /* caseif */ wbf(' '); copyf++, clonef++; nl = level = 0; do { nlflg = 0; k = cbits(c = getch()); switch (k) { case LEFT: level++; break; case RIGHT: level--; break; } wbf(c); } while (!nlflg || level > 0); if (level < 0 && warn & WARN_DELIM) errprint("%d excess delimiter(s)", -level); wbt(0); copyf--, clonef--; pushi(newip, LOOP, 0); offset = dip->op; }
tchar setolt(void) { storerq(getsn(1)); return mkxfunc(OLT, 0); }
tchar setfield(int x) { register tchar ii, jj, *fp; register int i, j, k; int length, ws, npad, temp; unsigned int type; tchar **pp, *padptr[NPP]; tchar fbuf[FBUFSZ]; int savfc, savtc, savlc; tchar rchar = 0, nexti = 0; int savepos; int oev; prdblesc = 1; if (x == tabch) rchar = tabc | chbits; else if (x == ldrch) rchar = dotc | chbits; if (chartab[trtab[cbits(rchar)]] != 0) rchar = setchar(rchar); temp = npad = ws = 0; savfc = fc; savtc = tabch; savlc = ldrch; tabch = ldrch = fc = IMP; savepos = numtab[HP].val; gchtab[tabch] &= ~TABBIT; gchtab[ldrch] &= ~LDRBIT; gchtab[fc] &= ~FCBIT; gchtab[IMP] |= TABBIT|LDRBIT|FCBIT; for (j = 0; ; j++) { if ((tabtab[j] & TABMASK) == 0) { if (x == savfc) errprint("zero field width."); jj = 0; goto rtn; } if ((length = ((tabtab[j] & TABMASK) - numtab[HP].val)) > 0 ) break; } type = tabtab[j] & (~TABMASK); fp = fbuf; pp = padptr; if (x == savfc) { *fp++ = mkxfunc(FLDMARK, 0); nexti = getch(); while (1) { j = cbits(ii = nexti); jj = width(ii); oev = ev; if (j != savfc && j != '\n' && pp < (padptr + NPP - 1) && fp < (fbuf + FBUFSZ - 3)) nexti = getch(); else nexti = 0; if (ev == oev) jj += kernadjust(ii, nexti); widthp = jj; numtab[HP].val += jj; if (j == padc) { npad++; *pp++ = fp; if (pp > (padptr + NPP - 1)) break; goto s1; } else if (j == savfc) break; else if (j == '\n') { temp = j; nlflg = 0; break; } ws += jj; s1: *fp++ = ii; if (fp > (fbuf + FBUFSZ - 3)) break; } if (!npad) { npad++; *pp++ = fp; *fp++ = 0; } *fp++ = temp; *fp++ = 0; temp = i = (j = length - ws) / npad; i = (i / HOR) * HOR; if ((j -= i * npad) < 0) j = -j; ii = makem(i); if (temp < 0) ii |= NMOT; for (; npad > 0; npad--) { *(*--pp) = ii; if (j) { j -= HOR; (*(*pp)) += HOR; } } pushback(fbuf); jj = 0; } else if (type == 0) { /*plain tab or leader*/ if (pbp >= pbsize-4) growpbbuf(); pbbuf[pbp++] = mkxfunc(FLDMARK, 0); if ((j = width(rchar)) > 0) { int nchar; k = kernadjust(rchar, rchar); if (length < j) nchar = 0; else { nchar = 1; length -= j; nchar += length / (k+j); length %= k+j; } pbbuf[pbp++] = FILLER; while (nchar-->0) { if (pbp >= pbsize-5) if (growpbbuf() == NULL) break; numtab[HP].val += j; widthp = j; if (nchar > 0) { numtab[HP].val += k; widthp += k; } pbbuf[pbp++] = rchar; } pbbuf[pbp++] = FILLER; } if (length) jj = sabsmot(length) | MOT; else jj = 0; } else { /*center tab*/ /*right tab*/ *fp++ = mkxfunc(FLDMARK, 0); nexti = getch(); while (((j = cbits(ii = nexti)) != savtc) && (j != '\n') && (j != savlc)) { jj = width(ii); oev = ev; if (fp < (fbuf + FBUFSZ - 3)) { nexti = getch(); if (ev == oev) jj += kernadjust(ii, nexti); } ws += jj; numtab[HP].val += jj; widthp = jj; *fp++ = ii; if (fp > (fbuf + FBUFSZ - 3)) break; } *fp++ = ii; *fp++ = 0; if (type == RTAB) length -= ws; else length -= ws / 2; /*CTAB*/ pushback(fbuf); if ((j = width(rchar)) != 0 && length > 0) { int nchar; k = kernadjust(rchar, rchar); if (length < j) nchar = 0; else { nchar = 1; length -= j; nchar += length / (k+j); length %= k+j; } if (pbp >= pbsize-3) growpbbuf(); pbbuf[pbp++] = FILLER; while (nchar-- > 0) { if (pbp >= pbsize-3) if (growpbbuf() == NULL) break; pbbuf[pbp++] = rchar; } } length = (length / HOR) * HOR; jj = makem(length); nlflg = 0; } rtn: gchtab[fc] &= ~FCBIT; gchtab[tabch] &= ~TABBIT; gchtab[ldrch] &= ~LDRBIT; fc = savfc; tabch = savtc; ldrch = savlc; gchtab[fc] |= FCBIT; gchtab[tabch] = TABBIT; gchtab[ldrch] |= LDRBIT; numtab[HP].val = savepos; if (pbp < pbsize-3 || growpbbuf()) pbbuf[pbp++] = mkxfunc(FLDMARK, x); prdblesc = 0; return(jj | ADJBIT); }