xref: /illumos-gate/usr/src/cmd/troff/n2.c (revision 2a8bcb4efb45d99ac41c94a75c396b362c414f7f)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 1989 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 /*
31  * University Copyright- Copyright (c) 1982, 1986, 1988
32  * The Regents of the University of California
33  * All Rights Reserved
34  *
35  * University Acknowledgment- Portions of this document are derived from
36  * software developed by the University of California, Berkeley, and its
37  * contributors.
38  */
39 
40 /*
41  * n2.c
42  *
43  * output, cleanup
44  */
45 
46 #include <signal.h>
47 #include "tdef.h"
48 #ifdef NROFF
49 #include "tw.h"
50 #endif
51 #include <setjmp.h>
52 #include "ext.h"
53 #ifdef EUC
54 #ifdef NROFF
55 #include <stddef.h>
56 #include <widec.h>
57 #include <limits.h>
58 #include <ctype.h>
59 
60 char mbobuf[MB_LEN_MAX] = {0};
61 wchar_t wchar;
62 int	nmb1 = 0;
63 #endif /* NROFF */
64 #endif /* EUC */
65 
66 extern	jmp_buf	sjbuf;
67 int	toolate;
68 int	error;
69 
70 int
pchar(i)71 pchar(i)
72 	tchar i;
73 {
74 	int j;
75 	static int hx = 0;	/* records if have seen HX */
76 
77 	if (hx) {
78 		hx = 0;
79 		j = absmot(i);
80 		if (isnmot(i)) {
81 			if (j > dip->blss)
82 				dip->blss = j;
83 		} else {
84 			if (j > dip->alss)
85 				dip->alss = j;
86 			ralss = dip->alss;
87 		}
88 		return (0);
89 	}
90 	if (ismot(i)) {
91 		pchar1(i);
92 		return (0);
93 	}
94 	switch (j = cbits(i)) {
95 	case 0:
96 	case IMP:
97 	case RIGHT:
98 	case LEFT:
99 		return (0);
100 	case HX:
101 		hx = 1;
102 		return (0);
103 	case PRESC:
104 		if (dip == &d[0])
105 			j = eschar;	/* fall through */
106 	default:
107 #ifndef EUC
108 		setcbits(i, trtab[j]);
109 #else
110 #ifndef NROFF
111 		setcbits(i, trtab[j]);
112 #else
113 		if (!multi_locale || (!(j & CSMASK) && !(j & MBMASK1)))
114 			setcbits(i, trtab[j]);
115 #endif /* NROFF */
116 #endif /* EUC */
117 	}
118 	pchar1(i);
119 
120 	return (0);
121 }
122 
123 
124 int
pchar1(i)125 pchar1(i)
126 	tchar i;
127 {
128 	int	j;
129 
130 	j = cbits(i);
131 	if (dip != &d[0]) {
132 		wbf(i);
133 		dip->op = offset;
134 		return (0);
135 	}
136 	if (!tflg && !print) {
137 		if (j == '\n')
138 			dip->alss = dip->blss = 0;
139 		return (0);
140 	}
141 	if (no_out || j == FILLER)
142 		return (0);
143 	if (tflg) {	/* transparent mode, undiverted */
144 		fdprintf(ptid, "%c", j);
145 		return (0);
146 	}
147 #ifndef NROFF
148 	if (ascii)
149 		outascii(i);
150 	else
151 #endif
152 		ptout(i);
153 
154 	return (0);
155 }
156 
157 int
outascii(i)158 outascii(i)	/* print i in best-guess ascii */
159 	tchar i;
160 {
161 	int j = cbits(i);
162 
163 	if (ismot(i)) {
164 		oput(' ');
165 		return (0);
166 	}
167 	if (j < 0177 && j >= ' ' || j == '\n') {
168 		oput(j);
169 		return (0);
170 	}
171 	if (j == DRAWFCN)
172 		oputs("\\D");
173 	else if (j == HYPHEN || j == MINUS)
174 		oput('-');
175 	else if (j == XON)
176 		oputs("\\X");
177 	else if (j == LIG_FI)
178 		oputs("fi");
179 	else if (j == LIG_FL)
180 		oputs("fl");
181 	else if (j == LIG_FF)
182 		oputs("ff");
183 	else if (j == LIG_FFI)
184 		oputs("ffi");
185 	else if (j == LIG_FFL)
186 		oputs("ffl");
187 	else if (j == WORDSP)
188 		;	/* nothing at all */
189 	else if (j > 0177) {
190 		oput('\\');
191 		oput('(');
192 		oput(chname[chtab[j-128]]);
193 		oput(chname[chtab[j-128]+1]);
194 	}
195 
196 	return (0);
197 }
198 
199 
200 /*
201  * now a macro
202 int
203 oput(i)
204 	int	i;
205 {
206 	*obufp++ = i;
207 	if (obufp >= &obuf[OBUFSZ])
208 		flusho();
209 
210 	return (0);
211 }
212 */
213 
214 int
oputs(i)215 oputs(i)
216 char	*i;
217 {
218 	while (*i != 0)
219 		oput(*i++);
220 
221 	return (0);
222 }
223 
224 
225 int
flusho()226 flusho()
227 {
228 	if (obufp == obuf)
229 		return (0);
230 	if (no_out == 0) {
231 		if (!toolate) {
232 			toolate++;
233 #ifdef NROFF
234 			set_tty();
235 			{
236 				char	*p = t.twinit;
237 				while (*p++)
238 					;
239 				if (p - t.twinit > 1)
240 					write(ptid, t.twinit, p - t.twinit - 1);
241 			}
242 #endif
243 		}
244 		toolate += write(ptid, obuf, obufp - obuf);
245 	}
246 	obufp = obuf;
247 
248 	return (0);
249 }
250 
251 
252 int
done(x)253 done(x)
254 int	x;
255 {
256 	int	i;
257 
258 	error |= x;
259 	app = ds = lgf = 0;
260 	if (i = em) {
261 		donef = -1;
262 		em = 0;
263 		if (control(i, 0))
264 			longjmp(sjbuf, 1);
265 	}
266 	if (!nfo)
267 		done3(0);
268 	mflg = 0;
269 	dip = &d[0];
270 	if (woff)
271 		wbt((tchar)0);
272 	if (pendw)
273 		getword(1);
274 	pendnf = 0;
275 	if (donef == 1)
276 		done1(0);
277 	donef = 1;
278 	ip = 0;
279 	frame = stk;
280 	nxf = frame + 1;
281 	if (!ejf)
282 		tbreak();
283 	nflush++;
284 	eject((struct s *)0);
285 	longjmp(sjbuf, 1);
286 
287 	return (0);
288 }
289 
290 
291 int
done1(x)292 done1(x)
293 int	x;
294 {
295 	error |= x;
296 	if (numtab[NL].val) {
297 		trap = 0;
298 		eject((struct s *)0);
299 		longjmp(sjbuf, 1);
300 	}
301 	if (nofeed) {
302 		ptlead();
303 		flusho();
304 		done3(0);
305 	} else {
306 		if (!gflag)
307 			pttrailer();
308 		done2(0);
309 	}
310 
311 	return (0);
312 }
313 
314 
315 int
done2(x)316 done2(x)
317 int	x;
318 {
319 	ptlead();
320 #ifndef NROFF
321 	if (!ascii)
322 		ptstop();
323 #endif
324 	flusho();
325 	done3(x);
326 
327 	return (0);
328 }
329 
330 int
done3(x)331 done3(x)
332 int	x;
333 {
334 	error |= x;
335 	signal(SIGINT, SIG_IGN);
336 	signal(SIGTERM, SIG_IGN);
337 	unlink(unlkp);
338 #ifdef NROFF
339 	twdone();
340 #endif
341 	if (ascii)
342 		mesg(1);
343 	exit(error);
344 
345 	return (0);
346 }
347 
348 
349 int
edone(x)350 edone(x)
351 int	x;
352 {
353 	frame = stk;
354 	nxf = frame + 1;
355 	ip = 0;
356 	done(x);
357 
358 	return (0);
359 }
360 
361 
362 int
casepi()363 casepi()
364 {
365 	int	i;
366 	int	id[2];
367 
368 	if (toolate || skip() || !getname() || pipe(id) == -1 || (i = fork()) == -1) {
369 		errprint(gettext("Pipe not created."));
370 		return (0);
371 	}
372 	ptid = id[1];
373 	if (i > 0) {
374 		close(id[0]);
375 		toolate++;
376 		pipeflg++;
377 		return (0);
378 	}
379 	close(0);
380 	dup(id[0]);
381 	close(id[1]);
382 	execl(nextf, nextf, 0);
383 	errprint(gettext("Cannot exec %s"), nextf);
384 	exit(-4);
385 
386 	return (0);
387 }
388