void n_setwd(void) { int base, wid; Tchar i; int delim, emsz, k; int savhp, savapts, savapts1, savfont, savfont1, savpts, savpts1; base = numtabp[ST].val = wid = numtabp[CT].val = 0; if (ismot(i = getch())) return; delim = cbits(i); savhp = numtabp[HP].val; numtabp[HP].val = 0; savapts = apts; savapts1 = apts1; savfont = font; savfont1 = font1; savpts = pts; savpts1 = pts1; setwdf++; while (cbits(i = getch()) != delim && !nlflg) { k = width(i); wid += k; numtabp[HP].val += k; if (!ismot(i)) { emsz = (INCH * pts + 36) / 72; } else if (isvmot(i)) { k = absmot(i); if (isnmot(i)) k = -k; base -= k; emsz = 0; } else continue; if (base < numtabp[SB].val) numtabp[SB].val = base; if ((k = base + emsz) > numtabp[ST].val) numtabp[ST].val = k; } setn1(wid, 0, (Tchar) 0); numtabp[HP].val = savhp; apts = savapts; apts1 = savapts1; font = savfont; font1 = savfont1; pts = savpts; pts1 = savpts1; mchbits(); setwdf = 0; }
void setn(void) { int i, j, f; Tchar ii; Uchar *p; char buf[NTM]; /* for \n(.S */ f = nform = 0; if ((i = cbits(ii = getach())) == '+') f = 1; else if (i == '-') f = -1; else if (ii) /* don't put it back if it's already back (thanks to jaap) */ ch = ii; if (falsef) f = 0; if ((i = getsn()) == 0) return; p = unpair(i); if (p[0] == '.') switch (p[1]) { case 's': i = pts; break; case 'v': i = lss; break; case 'f': i = font; break; case 'p': i = pl; break; case 't': i = findt1(); break; case 'o': i = po; break; case 'l': i = ll; break; case 'i': i = in; break; case '$': i = frame->nargs; break; case 'A': i = ascii; break; case 'c': i = numtabp[CD].val; break; case 'n': i = lastl; break; case 'a': i = ralss; break; case 'h': i = dip->hnl; break; case 'd': if (dip != d) i = dip->dnl; else i = numtabp[NL].val; break; case 'u': i = fi; break; case 'j': i = ad + 2 * admod; break; case 'w': i = widthp; break; case 'x': i = nel; break; case 'y': i = un; break; case 'T': i = dotT; break; /* -Tterm used in nroff */ case 'V': i = VERT; break; case 'H': i = HOR; break; case 'k': i = ne; break; case 'P': i = print; break; case 'L': i = ls; break; case 'R': /* maximal # of regs that can be addressed */ i = 255*256 - regcnt; break; case 'z': p = unpair(dip->curd); *pbp++ = p[1]; /* watch order */ *pbp++ = p[0]; return; case 'b': i = bdtab[font]; break; case 'F': cpushback(cfname[ifi]); return; case 'S': buf[0] = j = 0; for( i = 0; tabtab[i] != 0 && i < NTAB; i++) { if (i > 0) buf[j++] = ' '; sprintf(&buf[j], "%d", tabtab[i] & TABMASK); j = strlen(buf); if ( tabtab[i] & RTAB) sprintf(&buf[j], "uR"); else if (tabtab[i] & CTAB) sprintf(&buf[j], "uC"); else sprintf(&buf[j], "uL"); j += 2; } cpushback(buf); return; default: goto s0; } else { s0: if ((j = findr(i)) == -1) i = 0; else { i = numtabp[j].val = numtabp[j].val + numtabp[j].inc * f; nform = numtabp[j].fmt; } } setn1(i, nform, (Tchar) 0); }
void casetl(void) { int j; int w[3]; Tchar buf[LNSIZE]; Tchar *tp; Tchar i, delim; /* * bug fix * * if .tl is the first thing in the file, the p1 * doesn't come out, also the pagenumber will be 0 * * tends too confuse the device filter (and the user as well) */ if (dip == d && numtabp[NL].val == -1) newline(1); dip->nls = 0; skip(); if (ismot(delim = getch())) { ch = delim; delim = '\''; } else delim = cbits(delim); tp = buf; numtabp[HP].val = 0; w[0] = w[1] = w[2] = 0; j = 0; while (cbits(i = getch()) != '\n') { if (cbits(i) == cbits(delim)) { if (j < 3) w[j] = numtabp[HP].val; numtabp[HP].val = 0; if (w[j] != 0) *tp++ = WORDSP; j++; *tp++ = 0; } else { if (cbits(i) == pagech) { setn1(numtabp[PN].val, numtabp[findr('%')].fmt, i&SFMASK); continue; } numtabp[HP].val += width(i); if (tp < &buf[LNSIZE-10]) { if (cbits(i) == ' ' && *tp != WORDSP) *tp++ = WORDSP; *tp++ = i; } else { ERROR "Overflow in casetl" WARN; } } } if (j<3) w[j] = numtabp[HP].val; *tp++ = 0; *tp++ = 0; *tp = 0; tp = buf; if (NROFF) horiz(po); while (i = *tp++) pchar(i); if (w[1] || w[2]) horiz(j = quant((lt - w[1]) / 2 - w[0], HOR)); while (i = *tp++) pchar(i); if (w[2]) { horiz(lt - w[0] - w[1] - w[2] - j); while (i = *tp++) pchar(i); } newline(0); if (dip != d) { if (dip->dnl > dip->hnl) dip->hnl = dip->dnl; } else { if (numtabp[NL].val > dip->hnl) dip->hnl = numtabp[NL].val; } }