#include "sdef.h" #include "d.h" #include "v.h" #include "tw.h" /* sroff9.c misc functions */ extern int cbuf[]; extern int *cp; extern int ch; extern int chbits; extern int dfact; extern int vflag; extern int Em; extern int fc; extern int padc; extern int tabtab[]; extern int nlflg; extern int lss; extern int tabch, ldrch; extern int tabc, dotc; extern int nchar, rchar; extern int xxx; setz(){ register i; if(!((i = getch()) & MOT))i |= ZBIT; return(i); } setline(){ register *i, length, c; int w, cnt, delim, rem, temp; if((delim = getch()) & MOT)return; else delim =& CMASK; vflag = 0; dfact = Em; length = atoi(); dfact = 1; if(!length){ eat(delim); return; } s0: if(((c = getch()) & CMASK) == delim){ ch = c; c = 0137 | chbits; }else if((c & CMASK) == FILLER)goto s0; w = width(c); i = cbuf; 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){ switch(c & CMASK){ case 0137: /*rule stan*/ case C_UR: /*underrule stan*/ case C_RN: /*root en stan*/ *i++ = c | ZBIT; default: *i++ = makem(rem); } } if(cnt){ *i++ = RPT; *i++ = cnt; *i++ = c; } s1: *i++ = 0; eat(delim); cp = cbuf; } eat(c) int c; { register i; while(((i = getch() & CMASK) != c) && (i != '\n')); return(i); } setov(){ register i, j, k; int *p, delim, o[NOV], w[NOV]; if((delim = getch()) & MOT)return; else delim &= CMASK; for(k=0; (k<NOV) && ((j=(i = getch()) & CMASK) != 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; p = cbuf; for(k=0; o[k]; k++){ *p++ = o[k]; *p++ = makem(-((w[k]+w[k+1])/2)); } *p++ = makem(w[0]/2); *p = 0; cp = cbuf; } /* stan, escape sequences for the sanders use \E'abc...' as in overstriking this is an add on to nroff */ setesc(){ register i, j, k; int *p, delim; if((delim = getch()) & MOT)return; else delim =& CMASK; p = cbuf; while (((j=(i = getch()) & CMASK) != delim) && (j != '\n')) *p++ = i | EBIT; *p = 0; cp = cbuf; } setbra(){ register i, *j, k; int cnt, delim, dwn; if((delim = getch()) & MOT)return; else delim &= CMASK; j = cbuf + 1; cnt = 0; dwn = Em | MOT | VMOT; while(((k = (i = getch()) & CMASK) != delim) && (k != '\n') && (j <= (cbuf+NC-4))){ *j++ = i | ZBIT; *j++ = dwn; cnt++; } if(--cnt < 0)return; else if (!cnt){ ch = *(j-2); return; } *j = 0; *--j = *cbuf = (cnt*Em)/2 | MOT | NMOT | VMOT; *--j &= ~ZBIT; cp = cbuf; } setvline(){ register i, c, *k; int cnt, neg, rem, ver, delim, dflt; if((delim = getch()) & MOT)return; else delim &= CMASK; dfact = lss; vflag++; i = atoi(); dfact = 1; if(!i){ eat(delim); vflag = 0; return; } #define VBHEIGHT 101 if(((c = getch()) & CMASK) == delim){ /* * In the default case, simulate box rule but do the motions * by hand, to minimize motion commands to the printer. */ dflt = 1; c = C_VB|ZBIT; /* single vertical line, sci-pi font */ ver = VBHEIGHT; /* height of C_VB */ } else { dflt = 0; getch(); ver = Em; c |= ZBIT; } neg = 0; if(i < 0){ i = -i; neg = NMOT; } cnt = utos(i)/utos(ver); rem = i-(stou(cnt*utos(ver))); rem = makem(rem) | neg; ver = makem(ver) | neg; vflag = 0; k = cbuf; if(!neg)*k++ = ver; if (dflt) *k++ = makem(-getcw(c)/2); if(rem & ~MOTV){ *k++ = c; *k++ = rem; } while((k < (cbuf+NC-3)) && cnt--){ *k++ = c; *k++ = ver; } *(k-2) &= ~ZBIT; if(!neg)k--; if (dflt) *k++ = makem(-getcw(c)/2); *k = 0; cp = cbuf; } casefc(){ register i; fc = IMP; padc = ' '; if(skip() || ((i = getch()) & MOT) || ((i &= CMASK) == '\n'))return; fc = i; if(skip() || (ch & MOT) || ((ch &= CMASK) == fc))return; padc = ch; } setfield(x) int x; { register i, j, *fp; int length, ws, npad, temp, type; int **pp, *padptr[NPP]; static int fbuf[FBUFSZ]; int savfc, savtc, savlc; 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; for(j=0;;j++){ if((tabtab[j] & TMASK)== 0){ if(x==savfc)prstr("Zero field width.\n"); j = 0; goto rtn; } if((length = ((tabtab[j] & TMASK) - v.hp)) > 0 )break; } type = tabtab[j] & (~TMASK); fp = fbuf; pp = padptr; if(x == savfc){while(1){ if(((j = (i = getch()) & CMASK)) == 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 += width(i); s1: *fp++ = i; if(fp > (fbuf + FBUFSZ -3))break; } if(!npad){ npad++; *pp++ = fp; *fp++ = 0; } *fp++ = temp; *fp++ = 0; temp = i = (j = length-ws)/npad; if((j -= i*npad) <0)j = -j; i = makem(i); if(temp <0)i |= NMOT; for(;npad > 0; npad--){ *(*--pp) = i; if(j){ j -= HOR; (*(*pp)) += HOR; } } cp = fbuf; j = 0; }else if(type == 0){ /*plain tab or leader*/ if((j = width(rchar)) == 0)nchar = 0; else{ nchar = length /j; length %= j; } if(length)j = length | MOT; else j = getch0(); }else{ /*center tab*/ /*right tab*/ while(((j = (i = getch()) & CMASK) != savtc) && (j != '\n') && (j != savlc)){ ws += width(i); *fp++ = i; if(fp > (fbuf +FBUFSZ - 3)) break; } *fp++ = i; *fp++ = 0; if(type == RTAB)length -= ws; else length -= ws/2; /*CTAB*/ if(((j = width(rchar)) == 0) || (length <= 0))nchar = 0; else{ nchar = length/j; length %= j; } j = makem(length); cp = fbuf; nlflg = 0; } rtn: fc = savfc; tabch = savtc; ldrch = savlc; return(j); }