1 #ifndef lint
2 static char sccsid[] = "@(#)textblocks.c	1.2 (CWI) 85/10/02";
3 #endif lint
4 
5 #include "defs.h"
6 #include "ext.h"
7 
8 /*
9  * Get a section of text
10  *
11  * Note that this doen't work after MAXLIN lines (see over200.c)
12  *
13  */
14 
15 /*
16  * This returns an int with the name of the diversion,
17  * in maktab we test later in wide() whether the table entry is a
18  * pointer to a string, or a character.
19  * If it is a character, we now it is a diversion, and know it its width
20  * to be in <diversionname>-
21  *
22  * Very ugly, (looks like we need unions in declaration of structure colstr ?)
23  */
24 
25 gettext(sp, ilin, icol, fn, sz)
26 char *sp, *fn, *sz;
27 {
28 	char line[BUFSIZ];
29 	char *vs;
30 	int oname;
31 
32 	dprint(".\\\" -- gettext\n");
33 	if(texname == 0)
34 		error("Too many text block diversions");
35 	if(textflg == 0){
36 		printf(".nr %d \\n(.lu\n", SL);
37  		/*
38 		 * remember old line length
39 		 */
40 		textflg = 1;
41 	}
42 	printf(".eo\n");
43 	printf(".am %2s\n", reg(icol, CRIGHT));
44 	printf(".br\n");
45 	printf(".di %c+\n", texname);
46 	rstofill();
47 	if(fn && *fn)
48 		printf(".nr %d \\n(.f\n.ft %s\n", S1, fn);
49 	/*
50 	 * protect font
51 	 */
52 	printf(".ft \\n(.f\n");
53 	vs = vsize[stynum[ilin]][icol];
54 	if((sz && *sz) || (vs && *vs)){
55 		printf(".nr %d \\n(.v\n", S2);
56 		if(vs == 0 || *vs == 0)
57 			vs = "\\n(.s+2";
58 		if(sz && *sz)
59 			printf(".ps %s\n", sz);
60 		printf(".vs %s\n", vs);
61 		printf(".if \\n(%du>\\n(.vu .sp \\n(%du-\\n(.vu\n",
62 									S2, S2);
63 	}
64 	if(cll[icol][0])
65 		printf(".ll %sn\n", cll[icol]);
66 	else
67 		printf(".ll \\n(%du*%du/%du\n", SL, ctspan(ilin, icol),
68 								ncol + 1);
69 	printf(".if \\n(.l<\\n(%2s .ll \\n(%2su\n", reg(icol, CRIGHT),
70 							reg(icol, CRIGHT));
71 	if(ctype(ilin, icol) == 'a')
72 		printf(".ll -2n\n");
73 	printf(".in 0\n");
74 	while(gets1(line)){
75 		if(line[0] == 'T' && line[1] == '}' && line[2] == tab)
76 			break;
77 		if(strcmp("T}", line) == 0)
78 			break;
79 		printf("%s\n", line);
80 	}
81 	if(fn && *fn)
82 		printf(".ft \\n(%d\n", S1);
83 	if(sz && *sz)
84 		printf(".br\n.ps\n.vs\n");
85 	printf(".br\n");
86 	printf(".di\n");
87 	/*
88 	 * Height of last complete diversion in register <diversionname>|
89 	 */
90 	printf(".nr %c| \\n(dn\n", texname);
91 	/*
92 	 * width of last complete diversion in register <diversionname>-
93 	 */
94 	printf(".nr %c- \\n(dl\n", texname);
95 	printf("..\n");
96 	printf(".ec \\\n");
97 	/*
98 	 * copy remainder of line
99 	 */
100 	if(line[2])
101 		strcpy(sp, line + 3);
102 	else
103 		*sp = 0;
104 	oname = texname;
105 	texname = texstr[++texct];
106 	return(oname);
107 }
108 
109 untext(){
110 	rstofill();
111 	printf(".nf\n");
112 	printf(".ll \\n(%du\n", SL);
113 }
114