BSD 4_4 release
[unix-history] / usr / src / old / roff / nroff / n6.c
CommitLineData
a860ef9e
KB
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
ad787160
C
5 * This module is believed to contain source code proprietary to AT&T.
6 * Use and redistribution is subject to the Berkeley Software License
7 * Agreement and your Software Agreement with AT&T (Western Electric).
a860ef9e
KB
8 */
9
814d055b 10#ifndef lint
ad787160 11static char sccsid[] = "@(#)n6.c 4.3 (Berkeley) 4/18/91";
a860ef9e 12#endif /* not lint */
814d055b
RH
13
14#include "tdef.h"
15extern
16#include "d.h"
17extern
18#include "v.h"
19#ifdef NROFF
20extern
21#include "tw.h"
22#endif
23
24/*
25troff6.c
26
27width functions, sizes and fonts
28*/
29
30extern int inchar[LNSIZE], *pinchar; /* XXX */
31extern int eschar;
32extern int widthp;
33extern int ohc;
34extern int xfont;
35extern int smnt;
36extern int setwdf;
37extern char trtab[];
38extern int chbits;
39extern int nonumb;
40extern int noscale;
41extern int font;
42extern int font1;
43extern int pts;
44extern int sps;
45extern int nlflg;
46extern int nform;
47extern int dfact;
48extern int dfactd;
49extern int lss;
50extern int lss1;
51extern int vflag;
52extern int ch0;
53extern int level;
54extern int ch;
55extern int res;
56extern int xxx;
57int fontlab[] = {'R','I','B','S',0};
58
59width(c)
60int c;
61{
62 register i,j,k;
63
64 j = c;
65 k = 0;
66 if(j & MOT){
67 if(j & VMOT)goto rtn;
68 k = j & ~MOTV;
69 if(j & NMOT)k = -k;
70 goto rtn;
71 }
72 if((i = (j & CMASK)) == 010){
73 k = -widthp;
74 goto rtn;
75 }
76 if(i == PRESC)i = eschar;
77 if((i == ohc) ||
78 (i >= 0370))goto rtn;
79 if(j & ZBIT)goto rtn;
80 i = trtab[i] & BMASK;
81 if(i < 040)goto rtn;
03ef7d51
BS
82 if (t.codetab[i-32])
83 k = (*(t.codetab[i-32]) & 0177) * t.Char;
84 else
85 k = 0;
814d055b
RH
86 widthp = k;
87rtn:
88 return(k);
89}
90setch(){
91 register i,*j,k;
92 extern int chtab[];
93
94 if((i = getrq()) == 0)return(0);
95 for(j=chtab;*j != i;j++)if(*(j++) == 0)return(0);
96 k = *(++j) | chbits;
97 return(k);
98}
99find(i,j)
100int i,j[];
101{
102 register k;
103
104 if(((k = i-'0') >= 1) && (k <= 4) && (k != smnt))return(--k);
105 for(k=0; j[k] != i; k++)if(j[k] == 0)return(-1);
106 return(k);
107}
108mchbits(){
109 chbits = (((pts)<<2) | font) << (BYTE + 1);
110 sps = width(' ' | chbits);
111}
112setps(){
113 register i,j;
114
115 if((((i=getch() & CMASK) == '+') || (i == '-')) &&
116 (((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9))){
117 ch = 0;
118 return;
119 }
120 if((i -= '0') == 0){
121 return;
122 }
123 if((i > 0) && (i <= 9)){
124 if((i <= 3) &&
125 ((j=(ch = getch() & CMASK) - '0') >= 0) && (j <= 9)){
126 i = 10*i +j;
127 ch = 0;
128 }
129 }
130}
131caseft(){
132 skip();
133 setfont(1);
134}
135setfont(a)
136int a;
137{
138 register i,j;
139
140 if(a)i = getrq();
141 else i = getsn();
142 if(!i || (i == 'P')){
143 j = font1;
144 goto s0;
145 }
146 if(i == 'S')return;
147 if((j = find(i,fontlab)) == -1)return;
148s0:
149 font1 = font;
150 font = j;
151 mchbits();
152}
153setwd(){
154 register i, base, wid;
155 int delim, em, k;
156 int savlevel, savhp, savfont, savfont1;
157 int *savpinchar, *p, *q, tempinchar[LNSIZE]; /* XXX */
158
159 base = v.st = v.sb = wid = v.ct = 0;
160 if((delim = getch() & CMASK) & MOT)return;
161 savhp = v.hp;
162 savpinchar = pinchar; /* XXX */
163 for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */
164 *q++ = *p++; /* XXX */
165 pinchar = inchar; /* XXX */
166 savlevel = level;
167 v.hp = level = 0;
168 savfont = font;
169 savfont1 = font1;
170 setwdf++;
171 while((((i = getch()) & CMASK) != delim) && !nlflg){
172 wid += width(i);
173 if(!(i & MOT)){
174 em = 2*t.Halfline;
175 }else if(i & VMOT){
176 k = i & ~MOTV;
177 if(i & NMOT)k = -k;
178 base -= k;
179 em = 0;
180 }else continue;
181 if(base < v.sb)v.sb = base;
182 if((k=base + em) > v.st)v.st = k;
183 }
184 nform = 0;
185 setn1(wid);
186 v.hp = savhp;
187 pinchar = savpinchar; /* XXX */
188 for (p=inchar, q=tempinchar; p < pinchar; ) /* XXX */
189 *p++ = *q++; /* XXX */
190 level = savlevel;
191 font = savfont;
192 font1 = savfont1;
193 mchbits();
194 setwdf = 0;
195}
196vmot(){
197 dfact = lss;
198 vflag++;
199 return(mot());
200}
201hmot(){
202 dfact = EM;
203 return(mot());
204}
205mot(){
206 register i, j;
207
208 j = HOR;
209 getch(); /*eat delim*/
210 if(i = atoi()){
211 if(vflag)j = VERT;
212 i = makem(quant(i,j));
213 }
214 getch();
215 vflag = 0;
216 dfact = 1;
217 return(i);
218}
219sethl(k)
220int k;
221{
222 register i;
223
224 i = t.Halfline;
225 if(k == 'u')i = -i;
226 else if(k == 'r')i = -2*i;
227 vflag++;
228 i = makem(i);
229 vflag = 0;
230 return(i);
231}
232makem(i)
233int i;
234{
235 register j;
236
237 if((j = i) < 0)j = -j;
238 j = (j & ~MOTV) | MOT;
239 if(i < 0)j |= NMOT;
240 if(vflag)j |= VMOT;
241 return(j);
242}
243casefp(){
244 register i, j;
245
246 skip();
247 if(((i = (getch() & CMASK) - '0' -1) < 0) || (i >3))return;
248 if(skip() || !(j = getrq()))return;
249 fontlab[i] = j;
250}
251casevs(){
252 register i;
253
254 skip();
255 vflag++;
256 dfact = INCH; /*default scaling is points!*/
257 dfactd = 72;
258 res = VERT;
259 i = inumb(&lss);
260 if(nonumb)i = lss1;
261 if(i < VERT)i = VERT;
262 lss1 = lss;
263 lss = i;
264}
265xlss(){
266 register i, j;
267
268 getch();
269 dfact = lss;
270 i = quant(atoi(),VERT);
271 dfact = 1;
272 getch();
273 if((j = i) < 0)j = -j;
274 ch0 = ((j & 03700)<<3) | HX;
275 if(i < 0)ch0 |= 040000;
276 return(((j & 077)<<9) | LX);
277}
278casefz(){}
279caseps(){}
280caselg(){}
281casecs(){}
282casebd(){}
283casess(){}
284getlg(i)
285int i;
286{
287 return(i);
288}