xref: /plan9/sys/src/cmd/htmlroff/t4.c (revision 426d2b71458df9b491ba6c167f699b3f1f7b0428)
1*426d2b71SDavid du Colombier #include "a.h"
2*426d2b71SDavid du Colombier 
3*426d2b71SDavid du Colombier /*
4*426d2b71SDavid du Colombier  * 4 - Text filling, centering, and adjusting.
5*426d2b71SDavid du Colombier  * 	"\ " - unbreakable space
6*426d2b71SDavid du Colombier  * 	.n register - length of last line
7*426d2b71SDavid du Colombier  *	nl register - text baseline position on this page
8*426d2b71SDavid du Colombier  *	.h register - baseline high water mark
9*426d2b71SDavid du Colombier  *	.k register - current horizontal output position
10*426d2b71SDavid du Colombier  *	\p - cause break at end of word, justify
11*426d2b71SDavid du Colombier  *	\& - non-printing zero-width filler
12*426d2b71SDavid du Colombier  *	tr - output translation
13*426d2b71SDavid du Colombier  *	\c - break (but don't) input line in .nf mode
14*426d2b71SDavid du Colombier  *	\c - break (but don't) word in .fi mode
15*426d2b71SDavid du Colombier  */
16*426d2b71SDavid du Colombier 
17*426d2b71SDavid du Colombier int
e_space(void)18*426d2b71SDavid du Colombier e_space(void)
19*426d2b71SDavid du Colombier {
20*426d2b71SDavid du Colombier 	return 0xA0;	/* non-breaking space */
21*426d2b71SDavid du Colombier }
22*426d2b71SDavid du Colombier 
23*426d2b71SDavid du Colombier int
e_amp(void)24*426d2b71SDavid du Colombier e_amp(void)
25*426d2b71SDavid du Colombier {
26*426d2b71SDavid du Colombier 	return Uempty;
27*426d2b71SDavid du Colombier }
28*426d2b71SDavid du Colombier 
29*426d2b71SDavid du Colombier int
e_c(void)30*426d2b71SDavid du Colombier e_c(void)
31*426d2b71SDavid du Colombier {
32*426d2b71SDavid du Colombier 	getrune();
33*426d2b71SDavid du Colombier 	bol = 1;
34*426d2b71SDavid du Colombier 	return 0;
35*426d2b71SDavid du Colombier }
36*426d2b71SDavid du Colombier 
37*426d2b71SDavid du Colombier void
r_br(int argc,Rune ** argv)38*426d2b71SDavid du Colombier r_br(int argc, Rune **argv)
39*426d2b71SDavid du Colombier {
40*426d2b71SDavid du Colombier 	USED(argc);
41*426d2b71SDavid du Colombier 	USED(argv);
42*426d2b71SDavid du Colombier 	br();
43*426d2b71SDavid du Colombier }
44*426d2b71SDavid du Colombier 
45*426d2b71SDavid du Colombier /* fill mode on */
46*426d2b71SDavid du Colombier void
r_fi(int argc,Rune ** argv)47*426d2b71SDavid du Colombier r_fi(int argc, Rune **argv)
48*426d2b71SDavid du Colombier {
49*426d2b71SDavid du Colombier 	USED(argc);
50*426d2b71SDavid du Colombier 	USED(argv);
51*426d2b71SDavid du Colombier 	nr(L(".fi"), 1);
52*426d2b71SDavid du Colombier // warn(".fi");
53*426d2b71SDavid du Colombier }
54*426d2b71SDavid du Colombier 
55*426d2b71SDavid du Colombier /* no-fill mode */
56*426d2b71SDavid du Colombier void
r_nf(int argc,Rune ** argv)57*426d2b71SDavid du Colombier r_nf(int argc, Rune **argv)
58*426d2b71SDavid du Colombier {
59*426d2b71SDavid du Colombier 	USED(argc);
60*426d2b71SDavid du Colombier 	USED(argv);
61*426d2b71SDavid du Colombier 	nr(L(".fi"), 0);
62*426d2b71SDavid du Colombier }
63*426d2b71SDavid du Colombier 
64*426d2b71SDavid du Colombier /* adjust */
65*426d2b71SDavid du Colombier void
r_ad(int argc,Rune ** argv)66*426d2b71SDavid du Colombier r_ad(int argc, Rune **argv)
67*426d2b71SDavid du Colombier {
68*426d2b71SDavid du Colombier 	int c, n;
69*426d2b71SDavid du Colombier 
70*426d2b71SDavid du Colombier 	nr(L(".j"), getnr(L(".j"))|1);
71*426d2b71SDavid du Colombier 	if(argc < 2)
72*426d2b71SDavid du Colombier 		return;
73*426d2b71SDavid du Colombier 	c = argv[1][0];
74*426d2b71SDavid du Colombier 	switch(c){
75*426d2b71SDavid du Colombier 	default:
76*426d2b71SDavid du Colombier 		fprint(2, "%L: bad adjust %C\n", c);
77*426d2b71SDavid du Colombier 		return;
78*426d2b71SDavid du Colombier 	case 'r':
79*426d2b71SDavid du Colombier 		n = 2*2|1;
80*426d2b71SDavid du Colombier 		break;
81*426d2b71SDavid du Colombier 	case 'l':
82*426d2b71SDavid du Colombier 		n = 0;
83*426d2b71SDavid du Colombier 		break;
84*426d2b71SDavid du Colombier 	case 'c':
85*426d2b71SDavid du Colombier 		n = 1*2|1;
86*426d2b71SDavid du Colombier 		break;
87*426d2b71SDavid du Colombier 	case 'b':
88*426d2b71SDavid du Colombier 	case 'n':
89*426d2b71SDavid du Colombier 		n = 0*2|1;
90*426d2b71SDavid du Colombier 		break;
91*426d2b71SDavid du Colombier 	case '0':
92*426d2b71SDavid du Colombier 	case '1':
93*426d2b71SDavid du Colombier 	case '2':
94*426d2b71SDavid du Colombier 	case '3':
95*426d2b71SDavid du Colombier 	case '4':
96*426d2b71SDavid du Colombier 	case '5':
97*426d2b71SDavid du Colombier 		n = c-'0';
98*426d2b71SDavid du Colombier 		break;
99*426d2b71SDavid du Colombier 	}
100*426d2b71SDavid du Colombier 	nr(L(".j"), n);
101*426d2b71SDavid du Colombier }
102*426d2b71SDavid du Colombier 
103*426d2b71SDavid du Colombier /* no adjust */
104*426d2b71SDavid du Colombier void
r_na(int argc,Rune ** argv)105*426d2b71SDavid du Colombier r_na(int argc, Rune **argv)
106*426d2b71SDavid du Colombier {
107*426d2b71SDavid du Colombier 	USED(argc);
108*426d2b71SDavid du Colombier 	USED(argv);
109*426d2b71SDavid du Colombier 
110*426d2b71SDavid du Colombier 	nr(L(".j"), getnr(L(".j"))&~1);
111*426d2b71SDavid du Colombier }
112*426d2b71SDavid du Colombier 
113*426d2b71SDavid du Colombier /* center next N lines */
114*426d2b71SDavid du Colombier void
r_ce(int argc,Rune ** argv)115*426d2b71SDavid du Colombier r_ce(int argc, Rune **argv)
116*426d2b71SDavid du Colombier {
117*426d2b71SDavid du Colombier 	if(argc < 2)
118*426d2b71SDavid du Colombier 		nr(L(".ce"), 1);
119*426d2b71SDavid du Colombier 	else
120*426d2b71SDavid du Colombier 		nr(L(".ce"), eval(argv[1]));
121*426d2b71SDavid du Colombier 	/* XXX set trap */
122*426d2b71SDavid du Colombier }
123*426d2b71SDavid du Colombier 
124*426d2b71SDavid du Colombier void
t4init(void)125*426d2b71SDavid du Colombier t4init(void)
126*426d2b71SDavid du Colombier {
127*426d2b71SDavid du Colombier 	nr(L(".fi"), 1);
128*426d2b71SDavid du Colombier 	nr(L(".j"), 1);
129*426d2b71SDavid du Colombier 
130*426d2b71SDavid du Colombier 	addreq(L("br"), r_br, 0);
131*426d2b71SDavid du Colombier 	addreq(L("fi"), r_fi, 0);
132*426d2b71SDavid du Colombier 	addreq(L("nf"), r_nf, 0);
133*426d2b71SDavid du Colombier 	addreq(L("ad"), r_ad, -1);
134*426d2b71SDavid du Colombier 	addreq(L("na"), r_na, 0);
135*426d2b71SDavid du Colombier 	addreq(L("ce"), r_ce, -1);
136*426d2b71SDavid du Colombier 
137*426d2b71SDavid du Colombier 	addesc(' ', e_space, 0);
138*426d2b71SDavid du Colombier 	addesc('p', e_warn, 0);
139*426d2b71SDavid du Colombier 	addesc('&', e_amp, 0);
140*426d2b71SDavid du Colombier 	addesc('c', e_c, 0);
141*426d2b71SDavid du Colombier }
142*426d2b71SDavid du Colombier 
143