10 /* output troff code; newlines may appear only at the end of s */
11 static void out_out(char *s
, va_list ap
)
13 out_nl
= strchr(s
, '\n') != NULL
;
14 vfprintf(stdout
, s
, ap
);
17 /* output troff code; no preceding newline is necessary */
18 static void outnn(char *s
, ...)
26 /* output troff cmd; should appear after a newline */
27 void out(char *s
, ...)
54 int utf8read(char **s
, char *d
)
56 int l
= utf8len((unsigned char) **s
);
58 for (i
= 0; i
< l
; i
++)
69 static void out_ps(int n
)
77 static void out_ft(int n
)
79 if (n
>= 0 && o_f
!= n
) {
85 static void out_clr(int n
)
87 if (n
>= 0 && o_m
!= n
) {
89 out("m%s\n", clr_str(o_m
));
93 static void escarg(char **sp
, char *d
, int cmd
)
97 if (strchr(ESC_P
, cmd
)) {
98 if (cmd
== 's' && (*s
== '-' || *s
== '+'))
104 } else if (!n_cp
&& *s
== '[') {
106 while (*s
&& *s
!= ']')
112 if (cmd
== 's' && s
[-1] >= '1' && s
[-1] <= '3')
117 if (strchr(ESC_Q
, cmd
)) {
119 while (*s
&& *s
!= q
)
130 static int tok_num(char **s
, int scale
)
136 while (**s
&& !isspace(**s
))
139 return eval(tok
, scale
);
142 static void out_draw(char *s
)
148 outnn(" %d", tok_num(&s
, 'm'));
149 outnn(" %d", tok_num(&s
, 'v'));
150 outnn(" ."); /* dpost requires this */
153 outnn(" %d", tok_num(&s
, 'm'));
156 outnn(" %d", tok_num(&s
, 'm'));
157 outnn(" %d", tok_num(&s
, 'v'));
160 outnn(" %d", tok_num(&s
, 'm'));
161 outnn(" %d", tok_num(&s
, 'v'));
162 outnn(" %d", tok_num(&s
, 'm'));
163 outnn(" %d", tok_num(&s
, 'v'));
166 outnn(" %d", tok_num(&s
, 'm'));
167 outnn(" %d", tok_num(&s
, 'v'));
169 outnn(" %d", tok_num(&s
, 'm'));
170 outnn(" %d", tok_num(&s
, 'v'));
178 * read a glyph or output troff request
180 * This functions reads from s either an output troff request
181 * (only the ones emitted by wb.c) or a glyph name and updates
182 * s. The return value is the name of the troff request (the
183 * argument is copied into d) or zero for glyph names (it is
184 * copied into d). Returns -1 when the end of s is reached.
186 int out_readc(char **s
, char *d
)
196 utf8read(s
, d
+ strlen(d
));
197 } else if (!n_cp
&& d
[1] == '[') {
198 while (**s
&& **s
!= ']')
202 } else if (strchr("CDfhmsvXx", d
[1])) {
205 return c
== 'C' ? 0 : c
;
213 static void outg(char *c
)
215 if (utf8len((unsigned char) c
[0]) == strlen(c
))
216 outnn("c%s%s", c
, c
[1] ? "\n" : "");
218 out("C%s\n", c
[0] == c_ec
&& c
[1] == '(' ? c
+ 2 : c
);
221 static void outc(char *c
)
223 struct glyph
*g
= dev_glyph(c
, o_f
);
224 int cwid
= charwid(o_f
, o_s
, g
? g
->wid
: SC_DW
);
225 int bwid
= charwid_base(o_f
, o_s
, g
? g
->wid
: SC_DW
);
227 outnn("h%d", (cwid
- bwid
) / 2);
229 if (dev_getbd(o_f
)) {
230 outnn("h%d", dev_getbd(o_f
) - 1);
232 outnn("h%d", -dev_getbd(o_f
) + 1);
235 outnn("h%d", -(cwid
- bwid
) / 2);
239 void out_line(char *s
)
241 char c
[ILNLEN
+ GNLEN
* 4];
243 while ((t
= out_readc(&s
, c
)) >= 0) {
245 if (c
[0] == c_ni
|| (c
[0] == '\\' && c
[1] == '\\')) {
249 if (c
[0] == '\t' || c
[0] == '\x01' || !strcmp(c_hc
, c
))
262 outnn("h%d", eval(c
, 'm'));
269 out_ps(eval_re(c
, o_s
, '\0'));
272 outnn("v%d", eval(c
, 'v'));