1 /* generating troff output */
11 /* output troff code; newlines may appear only at the end of s */
12 static void out_out(char *s
, va_list ap
)
14 out_nl
= strchr(s
, '\n') != NULL
;
15 vfprintf(stdout
, s
, ap
);
18 /* output troff code; no preceding newline is necessary */
19 static void outnn(char *s
, ...)
27 /* output troff cmd; should appear after a newline */
28 void out(char *s
, ...)
42 static void out_ps(int n
)
50 static void out_ft(int n
)
52 if (n
>= 0 && o_f
!= n
) {
58 static void out_clr(int n
)
60 if (n
>= 0 && o_m
!= n
) {
62 out("m%s\n", clr_str(o_m
));
66 static int tok_num(char **s
, int scale
)
68 while (**s
== ' ' || **s
== '\t')
70 return eval_up(s
, scale
);
73 static int tok_numpt(char **s
, int scale
, int *i
)
76 while (**s
== ' ' || **s
== '\t')
79 *i
= eval_up(s
, scale
);
80 return o
== *s
? 1 : 0;
83 static void out_draw(char *s
)
89 outnn(" %d", tok_num(&s
, 'm'));
90 outnn(" %d", tok_num(&s
, 'v'));
91 outnn(" ."); /* dpost requires this */
94 outnn(" %d", tok_num(&s
, 'm'));
97 outnn(" %d", tok_num(&s
, 'm'));
98 outnn(" %d", tok_num(&s
, 'v'));
101 outnn(" %d", tok_num(&s
, 'm'));
102 outnn(" %d", tok_num(&s
, 'v'));
103 outnn(" %d", tok_num(&s
, 'm'));
104 outnn(" %d", tok_num(&s
, 'v'));
110 if (tok_numpt(&s
, 'm', &h
) || tok_numpt(&s
, 'v', &v
)) {
112 while (*s
&& *s
!= ' ')
124 static void outg(char *c
, int fn
, int sz
)
131 outnn("c%s%s", c
, c
[1] ? "\n" : "");
133 out("C%s\n", c
[0] == c_ec
&& c
[1] == '(' ? c
+ 2 : c
);
138 static void outc(char *c
)
140 struct glyph
*g
= dev_glyph(c
, o_f
);
141 struct font
*fn
= dev_font(o_f
);
145 cwid
= font_gwid(g
->font
, dev_font(o_f
), o_s
, g
->wid
);
146 bwid
= font_wid(g
->font
, o_s
, g
->wid
);
147 if (font_mapped(g
->font
, c
))
150 outnn("h%d", (cwid
- bwid
) / 2);
151 outg(c
, dev_fontpos(g
->font
), font_zoom(g
->font
, o_s
));
152 if (font_getbd(fn
)) {
153 outnn("h%d", font_getbd(fn
) - 1);
154 outg(c
, dev_fontpos(g
->font
), font_zoom(g
->font
, o_s
));
155 outnn("h%d", -font_getbd(fn
) + 1);
158 outnn("h%d", -(cwid
- bwid
) / 2);
167 void out_line(char *s
)
171 while ((t
= escread(&s
, &c
)) >= 0) {
173 if (c
[0] == c_ni
|| (c
[0] == '\\' && c
[1] == '\\')) {
177 if (c
[0] == '\t' || c
[0] == '\x01' || c_hymark(c
))
190 outnn("h%d", eval(c
, 'm'));
200 outnn("v%d", eval(c
, 'v'));