13e12c5d1SDavid du Colombier /* tg.c: process included text blocks */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier
43e12c5d1SDavid du Colombier int
gettext(char * sp,int ilin,int icol,char * fn,char * sz)53e12c5d1SDavid du Colombier gettext(char *sp, int ilin, int icol, char *fn, char *sz)
63e12c5d1SDavid du Colombier {
73e12c5d1SDavid du Colombier /* get a section of text */
83e12c5d1SDavid du Colombier char line[4096];
9*b71e558bSDavid du Colombier int oname, startline;
103e12c5d1SDavid du Colombier char *vs;
113e12c5d1SDavid du Colombier
12*b71e558bSDavid du Colombier startline = iline;
133e12c5d1SDavid du Colombier if (texname == 0)
143e12c5d1SDavid du Colombier error("Too many text block diversions");
153e12c5d1SDavid du Colombier if (textflg == 0) {
16219b2ee8SDavid du Colombier Bprint(&tabout, ".nr %d \\n(.lu\n", SL); /* remember old line length */
173e12c5d1SDavid du Colombier textflg = 1;
183e12c5d1SDavid du Colombier }
19219b2ee8SDavid du Colombier Bprint(&tabout, ".eo\n");
20219b2ee8SDavid du Colombier Bprint(&tabout, ".am %s\n", reg(icol, CRIGHT));
21219b2ee8SDavid du Colombier Bprint(&tabout, ".br\n");
22219b2ee8SDavid du Colombier Bprint(&tabout, ".di %c+\n", texname);
233e12c5d1SDavid du Colombier rstofill();
243e12c5d1SDavid du Colombier if (fn && *fn)
25219b2ee8SDavid du Colombier Bprint(&tabout, ".nr %d \\n(.f\n.ft %s\n", S1, fn);
26219b2ee8SDavid du Colombier Bprint(&tabout, ".ft \\n(.f\n"); /* protect font */
273e12c5d1SDavid du Colombier vs = vsize[icol][stynum[ilin]];
283e12c5d1SDavid du Colombier if ((sz && *sz) || (vs && *vs)) {
29219b2ee8SDavid du Colombier Bprint(&tabout, ".nr %d \\n(.v\n", S9);
303e12c5d1SDavid du Colombier if (vs == 0 || *vs == 0)
313e12c5d1SDavid du Colombier vs = "\\n(.s+2";
323e12c5d1SDavid du Colombier if (sz && *sz)
33219b2ee8SDavid du Colombier Bprint(&tabout, ".ps %s\n", sz);
34219b2ee8SDavid du Colombier Bprint(&tabout, ".vs %s\n", vs);
35219b2ee8SDavid du Colombier Bprint(&tabout, ".if \\n(%du>\\n(.vu .sp \\n(%du-\\n(.vu\n", S9, S9);
363e12c5d1SDavid du Colombier }
373e12c5d1SDavid du Colombier if (cll[icol][0])
38219b2ee8SDavid du Colombier Bprint(&tabout, ".ll %sn\n", cll[icol]);
393e12c5d1SDavid du Colombier else
40219b2ee8SDavid du Colombier Bprint(&tabout, ".ll \\n(%du*%du/%du\n", SL, ctspan(ilin, icol), ncol + 1);
41219b2ee8SDavid du Colombier Bprint(&tabout, ".if \\n(.l<\\n(%2s .ll \\n(%2su\n", reg(icol, CRIGHT),
423e12c5d1SDavid du Colombier reg(icol, CRIGHT));
433e12c5d1SDavid du Colombier if (ctype(ilin, icol) == 'a')
44219b2ee8SDavid du Colombier Bprint(&tabout, ".ll -2n\n");
45219b2ee8SDavid du Colombier Bprint(&tabout, ".in 0\n");
46*b71e558bSDavid du Colombier for (;;) {
47*b71e558bSDavid du Colombier if (gets1(line, sizeof(line)) == nil) {
48*b71e558bSDavid du Colombier iline = startline;
49*b71e558bSDavid du Colombier error("missing closing T}");
50*b71e558bSDavid du Colombier }
513e12c5d1SDavid du Colombier if (line[0] == 'T' && line[1] == '}' && line[2] == tab)
523e12c5d1SDavid du Colombier break;
533e12c5d1SDavid du Colombier if (match("T}", line))
543e12c5d1SDavid du Colombier break;
55219b2ee8SDavid du Colombier Bprint(&tabout, "%s\n", line);
563e12c5d1SDavid du Colombier }
573e12c5d1SDavid du Colombier if (fn && *fn)
58219b2ee8SDavid du Colombier Bprint(&tabout, ".ft \\n(%d\n", S1);
593e12c5d1SDavid du Colombier if (sz && *sz)
60219b2ee8SDavid du Colombier Bprint(&tabout, ".br\n.ps\n.vs\n");
61219b2ee8SDavid du Colombier Bprint(&tabout, ".br\n");
62219b2ee8SDavid du Colombier Bprint(&tabout, ".di\n");
63219b2ee8SDavid du Colombier Bprint(&tabout, ".nr %c| \\n(dn\n", texname);
64219b2ee8SDavid du Colombier Bprint(&tabout, ".nr %c- \\n(dl\n", texname);
65219b2ee8SDavid du Colombier Bprint(&tabout, "..\n");
66219b2ee8SDavid du Colombier Bprint(&tabout, ".ec \\\n");
673e12c5d1SDavid du Colombier /* copy remainder of line */
683e12c5d1SDavid du Colombier if (line[2])
693e12c5d1SDavid du Colombier tcopy (sp, line + 3);
703e12c5d1SDavid du Colombier else
713e12c5d1SDavid du Colombier *sp = 0;
723e12c5d1SDavid du Colombier oname = texname;
733e12c5d1SDavid du Colombier texname = texstr[++texct];
743e12c5d1SDavid du Colombier return(oname);
753e12c5d1SDavid du Colombier }
763e12c5d1SDavid du Colombier
773e12c5d1SDavid du Colombier
783e12c5d1SDavid du Colombier void
untext(void)793e12c5d1SDavid du Colombier untext(void)
803e12c5d1SDavid du Colombier {
813e12c5d1SDavid du Colombier rstofill();
82219b2ee8SDavid du Colombier Bprint(&tabout, ".nf\n");
83219b2ee8SDavid du Colombier Bprint(&tabout, ".ll \\n(%du\n", SL);
843e12c5d1SDavid du Colombier }
853e12c5d1SDavid du Colombier
863e12c5d1SDavid du Colombier
87