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