int setvline(void) { int i; tchar c, rem, ver, neg; int cnt, delim, v; tchar vlbuf[NC]; tchar *vlp; if (ismot(c = getch())) return (0); delim = cbits(c); dfact = lss; vflag++; i = quant(atoi(), VERT); dfact = 1; if (!i) { eat(delim); vflag = 0; return (0); } if ((cbits(c = getch())) == delim) { c = BOXRULE | chbits; /* default box rule */ } else getch(); c |= ZBIT; neg = 0; if (i < 0) { i = -i; neg = NMOT; } #ifdef NROFF v = 2 * t.Halfline; #endif #ifndef NROFF v = EM; #endif cnt = i / v; rem = makem(i % v) | neg; ver = makem(v) | neg; vlp = vlbuf; if (!neg) *vlp++ = ver; if (absmot(rem) != 0) { *vlp++ = c; *vlp++ = rem; } while ((vlp < (vlbuf + NC - 3)) && cnt--) { *vlp++ = c; *vlp++ = ver; } *(vlp - 2) &= ~ZBIT; if (!neg) vlp--; *vlp++ = 0; pushback(vlbuf); vflag = 0; return (0); }
void setvline(void) { int i; Tchar c, rem, ver, neg; int cnt, delim, v; Tchar vlbuf[NC]; Tchar *vlp; if (ismot(c = getch())) return; delim = cbits(c); dfact = lss; vflag++; i = quant(atoi0(), VERT); dfact = 1; if (!i) { eat(delim); vflag = 0; return; } if ((cbits(c = getch())) == delim) { c = BOXRULE | chbits; /*default box rule*/ } else getch(); c |= ZBIT; neg = 0; if (i < 0) { i = -i; neg = NMOT; } if (NROFF) v = 2 * t.Halfline; else { v = EM; if (v < VERT) /* ATT EVK hack: Erik van Konijnenburg, */ v = VERT; /* hvlpb!evkonij, ATT NSI Hilversum, Holland */ } cnt = i / v; rem = makem(i % v) | neg; ver = makem(v) | neg; vlp = vlbuf; if (!neg) *vlp++ = ver; if (absmot(rem) != 0) { *vlp++ = c; *vlp++ = rem; } while (vlp < vlbuf + NC - 3 && cnt--) { *vlp++ = c; *vlp++ = ver; } *(vlp - 2) &= ~ZBIT; if (!neg) vlp--; *vlp = 0; pushback(vlbuf); vflag = 0; }
void setline(void) { Tchar *i; Tchar c; int length; int j, w, cnt, delim, rem, temp; Tchar linebuf[NC]; if (ismot(c = getch())) return; delim = cbits(c); vflag = 0; dfact = EM; length = quant(atoi0(), HOR); dfact = 1; if (!length) { eat(delim); return; } s0: if ((j = cbits(c = getch())) == delim || j == '\n') { ch = c; c = RULE | chbits; } else if (cbits(c) == FILLER) goto s0; w = width(c); if (w <= 0) { ERROR "zero-width underline character ignored" WARN; c = RULE | chbits; w = width(c); } i = linebuf; if (length < 0) { *i++ = makem(length); length = -length; } if (!(cnt = length / w)) { *i++ = makem(-(temp = ((w - length) / 2))); *i++ = c; *i++ = makem(-(w - length - temp)); goto s1; } if (rem = length % w) { if (cbits(c) == RULE || cbits(c) == UNDERLINE || cbits(c) == ROOTEN) *i++ = c | ZBIT; *i++ = makem(rem); } if (cnt) { *i++ = RPT; *i++ = cnt; *i++ = c; } s1: *i = 0; eat(delim); pushback(linebuf); }
int setline() { tchar *i; tchar c; int length; int w, cnt, delim, rem, temp; tchar linebuf[NC]; if (ismot(c = getch())) return (0); delim = cbits(c); vflag = 0; dfact = EM; length = quant(atoi(), HOR); dfact = 1; if (!length) { eat(delim); return (0); } s0: if ((cbits(c = getch())) == delim) { ch = c; c = RULE | chbits; } else if (cbits(c) == FILLER) goto s0; w = width(c); i = linebuf; if (length < 0) { *i++ = makem(length); length = -length; } if (!(cnt = length / w)) { *i++ = makem(-(temp = ((w - length) / 2))); *i++ = c; *i++ = makem(-(w - length - temp)); goto s1; } if (rem = length % w) { if (cbits(c) == RULE || cbits(c) == UNDERLINE || cbits(c) == ROOTEN) *i++ = c | ZBIT; *i++ = makem(rem); } if (cnt) { *i++ = RPT; *i++ = cnt; *i++ = c; } s1: *i++ = 0; eat(delim); pushback(linebuf); return (0); }
void setline(void) { register tchar *i; tchar c, delim; int length; int w, cnt, rem, temp; tchar linebuf[NC]; if (ismot(c = getch())) return; delim = c; vflag = 0; dfact = EM; length = quant(hatoi(), HOR); dfact = 1; if (!length) { eat(delim); return; } s0: if (c = getch(), issame(c, delim)) { ch = c; c = RULE | chbits; } else if (cbits(c) == FILLER) goto s0; w = width(c); i = linebuf; if (length < 0) { *i++ = makem(length); length = -length; } if (!(cnt = length / w)) { *i++ = makem(-(temp = ((w - length) / 2))); *i++ = c; *i++ = makem(-(w - length - temp)); goto s1; } if ((rem = length % w)) { if (connectchar(c)) *i++ = c | ZBIT; *i++ = makem(rem); } if (cnt) { *i++ = RPT; *i++ = cnt; *i++ = c; } s1: *i++ = 0; eat(delim); pushback(linebuf); }
void setov(void) { register int j = 0, k; tchar i, delim, o[NOV]; int w[NOV]; if (ismot(i = getch())) return; delim = i; for (k = 0; (k < NOV) && (j = cbits(i = getch()), !issame(i, delim)) && (j != '\n'); k++) { o[k] = i; w[k] = width(i); } if (!issame(j, delim)) nodelim(delim); o[k] = w[k] = 0; if (o[0]) for (j = 1; j; ) { j = 0; for (k = 1; o[k] ; k++) { if (w[k-1] < w[k]) { j++; i = w[k]; w[k] = w[k-1]; w[k-1] = i; i = o[k]; o[k] = o[k-1]; o[k-1] = i; } } } else return; pbbuf[pbp++] = makem(w[0] / 2); for (k = 0; o[k]; k++) ; while (k>0) { k--; if (pbp >= pbsize-4) if (growpbbuf() == NULL) { errprint("no space for .ov"); done(2); } pbbuf[pbp++] = makem(-((w[k] + w[k+1]) / 2)); pbbuf[pbp++] = o[k]; } }
int setov(void) { int j, k; tchar i, o[NOV]; int delim, w[NOV]; if (ismot(i = getch())) return (0); delim = cbits(i); for (k = 0; (k < NOV) && ((j = cbits(i = getch())) != delim) && (j != '\n'); k++) { o[k] = i; w[k] = width(i); } if (k >= NOV) { k = NOV - 1; } o[k] = w[k] = 0; if (o[0]) for (j = 1; j; ) { j = 0; for (k = 1; o[k]; k++) { if (w[k-1] < w[k]) { j++; i = w[k]; w[k] = w[k-1]; w[k-1] = i; i = o[k]; o[k] = o[k-1]; o[k-1] = i; } } } else return (0); *pbp++ = makem(w[0] / 2); for (k = 0; o[k]; k++) ; while (k > 0) { k--; *pbp++ = makem(-((w[k] + w[k+1]) / 2)); *pbp++ = o[k]; } return (0); }
void setov(void) { int j, k; Tchar i, o[NOV+1]; int delim, w[NOV+1]; if (ismot(i = getch())) return; delim = cbits(i); for (k = 0; k < NOV && (j = cbits(i = getch())) != delim && j != '\n'; k++) { o[k] = i; w[k] = width(i); } o[k] = w[k] = 0; if (o[0]) for (j = 1; j; ) { j = 0; for (k = 1; o[k] ; k++) { if (w[k-1] < w[k]) { j++; i = w[k]; w[k] = w[k-1]; w[k-1] = i; i = o[k]; o[k] = o[k-1]; o[k-1] = i; } } } else return; *pbp++ = makem(w[0] / 2); for (k = 0; o[k]; k++) ; while (k>0) { k--; *pbp++ = makem(-((w[k] + w[k+1]) / 2)); *pbp++ = o[k]; } }
Tchar n_sethl(int k) { int j; Tchar i; j = t.Halfline; if (k == 'u') j = -j; else if (k == 'r') j = -2 * j; vflag++; i = makem(j); vflag = 0; return(i); }
Tchar n_mot(void) { int j, n; Tchar i; j = HOR; getch(); /*eat delim*/ if ((n = atoi0())) { if (vflag) j = VERT; i = makem(quant(n, j)); } else i = 0; getch(); vflag = 0; dfact = 1; return(i); }
Tchar getch(void) { int k; Tchar i, j; g0: if (ch) { i = ch; if (cbits(i) == '\n') nlflg++; ch = 0; return(i); } if (nlflg) return('\n'); i = getch0(); if (ismot(i)) return(i); k = cbits(i); if (k >= sizeof(gchtab)/sizeof(gchtab[0]) || gchtab[k] == 0) /* nothing special */ return(i); if (k != ESC) { if (k == '\n') { nlflg++; if (ip == 0) numtabp[CD].val++; /* line number */ return(k); } if (k == FLSS) { copyf++; raw++; i = getch0(); if (!fi) flss = i; copyf--; raw--; goto g0; } if (k == RPT) { setrpt(); goto g0; } if (!copyf) { if (k == 'f' && lg && !lgf) { i = getlg(i); return(i); } if (k == fc || k == tabch || k == ldrch) { if ((i = setfield(k)) == 0) goto g0; else return(i); } if (k == '\b') { i = makem(-width(' ' | chbits)); return(i); } } return(i); } k = cbits(j = getch0()); if (ismot(j)) return(j); switch (k) { case 'n': /* number register */ setn(); goto g0; case '$': /* argument indicator */ seta(); goto g0; case '*': /* string indicator */ setstr(); goto g0; case '{': /* LEFT */ i = LEFT; goto gx; case '}': /* RIGHT */ i = RIGHT; goto gx; case '"': /* comment */ while (cbits(i = getch0()) != '\n') ; if (ip == 0) numtabp[CD].val++; /* line number */ nlflg++; return(i); /* experiment: put it here instead of copy mode */ case '(': /* special char name \(xx */ case 'C': /* \C'...' */ if ((i = setch(k)) == 0) goto g0; goto gx; case ESC: /* double backslash */ i = eschar; goto gx; case 'e': /* printable version of current eschar */ i = PRESC; goto gx; case '\n': /* concealed newline */ numtabp[CD].val++; goto g0; case ' ': /* unpaddable space */ i = UNPAD; goto gx; case '\'': /* \(aa */ i = ACUTE; goto gx; case '`': /* \(ga */ i = GRAVE; goto gx; case '_': /* \(ul */ i = UNDERLINE; goto gx; case '-': /* current font minus */ i = MINUS; goto gx; case '&': /* filler */ i = FILLER; goto gx; case 'c': /* to be continued */ i = CONT; goto gx; case '!': /* transparent indicator */ i = XPAR; goto gx; case 't': /* tab */ i = '\t'; return(i); case 'a': /* leader (SOH) */ /* old: *pbp++ = LEADER; goto g0; */ i = LEADER; return i; case '%': /* ohc */ i = OHC; return(i); case 'g': /* return format of a number register */ setaf(); /* should this really be in copy mode??? */ goto g0; case '.': /* . */ i = '.'; gx: setsfbits(i, sfbits(j)); return(i); } if (copyf) { *pbp++ = j; return(eschar); } switch (k) { case 'f': /* font indicator */ setfont(0); goto g0; case 's': /* size indicator */ setps(); goto g0; case 'v': /* vert mot */ numerr.type = numerr.escarg = 0; numerr.esc = k; if (i = vmot()) { return(i); } goto g0; case 'h': /* horiz mot */ numerr.type = numerr.escarg = 0; numerr.esc = k; if (i = hmot()) return(i); goto g0; case '|': /* narrow space */ if (NROFF) goto g0; return(makem((int)(EM)/6)); case '^': /* half narrow space */ if (NROFF) goto g0; return(makem((int)(EM)/12)); case 'w': /* width function */ setwd(); goto g0; case 'p': /* spread */ spread++; goto g0; case 'N': /* absolute character number */ numerr.type = numerr.escarg = 0; numerr.esc = k; if ((i = setabs()) == 0) goto g0; return i; case 'H': /* character height */ numerr.type = numerr.escarg = 0; numerr.esc = k; return(setht()); case 'S': /* slant */ numerr.type = numerr.escarg = 0; numerr.esc = k; return(setslant()); case 'z': /* zero with char */ return(setz()); case 'l': /* hor line */ numerr.type = numerr.escarg = 0; numerr.esc = k; setline(); goto g0; case 'L': /* vert line */ numerr.type = numerr.escarg = 0; numerr.esc = k; setvline(); goto g0; case 'D': /* drawing function */ numerr.type = numerr.escarg = 0; numerr.esc = k; setdraw(); goto g0; case 'X': /* \X'...' for copy through */ setxon(); goto g0; case 'b': /* bracket */ setbra(); goto g0; case 'o': /* overstrike */ setov(); goto g0; case 'k': /* mark hor place */ if ((k = findr(getsn())) != -1) { numtabp[k].val = numtabp[HP].val; } goto g0; case '0': /* number space */ return(makem(width('0' | chbits))); case 'x': /* extra line space */ numerr.type = numerr.escarg = 0; numerr.esc = k; if (i = xlss()) return(i); goto g0; case 'u': /* half em up */ case 'r': /* full em up */ case 'd': /* half em down */ return(sethl(k)); default: return(j); } /* NOTREACHED */ }
void horiz(int i) { vflag = 0; if (i) pchar(makem(i)); }
tchar setfield(int x) { tchar ii, jj, *fp; int i, j; int length, ws, npad, temp, type; tchar **pp, *padptr[NPP]; tchar fbuf[FBUFSZ]; int savfc, savtc, savlc; tchar rchar; int savepos; if (x == tabch) rchar = tabc | chbits; else if (x == ldrch) rchar = dotc | chbits; 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(gettext("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) { while (1) { j = cbits(ii = getch()); jj = width(ii); 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 ((j = width(rchar)) > 0) { int nchar = length / j; while (nchar-->0 && pbp < &pbbuf[NC-3]) { numtab[HP].val += j; widthp = j; *pbp++ = rchar; } length %= j; } if (length) jj = length | MOT; else jj = getch0(); } else { /* center tab */ /* right tab */ while (((j = cbits(ii = getch())) != savtc) && (j != '\n') && (j != savlc)) { jj = width(ii); 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 = length / j; while (nchar-- > 0 && pbp < &pbbuf[NC-3]) *pbp++ = rchar; length %= j; } 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; return (jj); }
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); }