Blame


1 61f5c35c 2004-05-15 devnull #include <u.h>
2 61f5c35c 2004-05-15 devnull #include <libc.h>
3 61f5c35c 2004-05-15 devnull #include <bio.h>
4 61f5c35c 2004-05-15 devnull #include "../common/common.h"
5 61f5c35c 2004-05-15 devnull #include "tr2post.h"
6 61f5c35c 2004-05-15 devnull
7 61f5c35c 2004-05-15 devnull int hpos = 0, vpos = 0;
8 61f5c35c 2004-05-15 devnull int fontsize, fontpos;
9 61f5c35c 2004-05-15 devnull
10 61f5c35c 2004-05-15 devnull #define MAXSTR 128
11 61f5c35c 2004-05-15 devnull int trindex; /* index into trofftab of current troff font */
12 61f5c35c 2004-05-15 devnull static int expecthmot = 0;
13 61f5c35c 2004-05-15 devnull
14 61f5c35c 2004-05-15 devnull void
15 61f5c35c 2004-05-15 devnull initialize(void) {
16 61f5c35c 2004-05-15 devnull }
17 61f5c35c 2004-05-15 devnull
18 61f5c35c 2004-05-15 devnull void
19 61f5c35c 2004-05-15 devnull hgoto(int x) {
20 61f5c35c 2004-05-15 devnull hpos = x;
21 61f5c35c 2004-05-15 devnull if (pageon()) {
22 61f5c35c 2004-05-15 devnull endstring();
23 61f5c35c 2004-05-15 devnull /* Bprint(Bstdout, "%d %d m\n", hpos, vpos); */
24 61f5c35c 2004-05-15 devnull }
25 61f5c35c 2004-05-15 devnull }
26 61f5c35c 2004-05-15 devnull
27 61f5c35c 2004-05-15 devnull void
28 61f5c35c 2004-05-15 devnull vgoto(int y) {
29 61f5c35c 2004-05-15 devnull vpos = y;
30 61f5c35c 2004-05-15 devnull if (pageon()) {
31 61f5c35c 2004-05-15 devnull endstring();
32 61f5c35c 2004-05-15 devnull /* Bprint(Bstdout, "%d %d m\n", hpos, vpos); */
33 61f5c35c 2004-05-15 devnull }
34 61f5c35c 2004-05-15 devnull }
35 61f5c35c 2004-05-15 devnull
36 61f5c35c 2004-05-15 devnull void
37 61f5c35c 2004-05-15 devnull hmot(int x) {
38 61f5c35c 2004-05-15 devnull int delta;
39 61f5c35c 2004-05-15 devnull
40 61f5c35c 2004-05-15 devnull if ((x<expecthmot-1) || (x>expecthmot+1)) {
41 61f5c35c 2004-05-15 devnull delta = x - expecthmot;
42 61f5c35c 2004-05-15 devnull if (curtrofffontid <0 || curtrofffontid >= troffontcnt) {
43 61f5c35c 2004-05-15 devnull Bprint(Bstderr, "troffontcnt=%d curtrofffontid=%d\n", troffontcnt, curtrofffontid);
44 61f5c35c 2004-05-15 devnull Bflush(Bstderr);
45 61f5c35c 2004-05-15 devnull exits("");
46 61f5c35c 2004-05-15 devnull }
47 61f5c35c 2004-05-15 devnull if (delta == troffontab[curtrofffontid].spacewidth*fontsize/10 && isinstring()) {
48 61f5c35c 2004-05-15 devnull if (pageon()) runeout(' ');
49 61f5c35c 2004-05-15 devnull } else {
50 fa325e9b 2020-01-10 cross if (pageon()) {
51 61f5c35c 2004-05-15 devnull endstring();
52 61f5c35c 2004-05-15 devnull /* Bprint(Bstdout, " %d 0 rmoveto ", delta); */
53 61f5c35c 2004-05-15 devnull /* Bprint(Bstdout, " %d %d m ", hpos+x, vpos); */
54 61f5c35c 2004-05-15 devnull if (debug) Bprint(Bstderr, "x=%d expecthmot=%d\n", x, expecthmot);
55 61f5c35c 2004-05-15 devnull }
56 61f5c35c 2004-05-15 devnull }
57 61f5c35c 2004-05-15 devnull }
58 61f5c35c 2004-05-15 devnull hpos += x;
59 61f5c35c 2004-05-15 devnull expecthmot = 0;
60 61f5c35c 2004-05-15 devnull }
61 61f5c35c 2004-05-15 devnull
62 61f5c35c 2004-05-15 devnull void
63 61f5c35c 2004-05-15 devnull vmot(int y) {
64 61f5c35c 2004-05-15 devnull endstring();
65 61f5c35c 2004-05-15 devnull /* Bprint(Bstdout, " 0 %d rmoveto ", -y); */
66 61f5c35c 2004-05-15 devnull vpos += y;
67 61f5c35c 2004-05-15 devnull }
68 61f5c35c 2004-05-15 devnull
69 61f5c35c 2004-05-15 devnull struct charent **
70 61f5c35c 2004-05-15 devnull findglyph(int trfid, Rune rune, char *stoken) {
71 61f5c35c 2004-05-15 devnull struct charent **cp;
72 61f5c35c 2004-05-15 devnull
73 61f5c35c 2004-05-15 devnull for (cp = &(troffontab[trfid].charent[RUNEGETGROUP(rune)][RUNEGETCHAR(rune)]); *cp != 0; cp = &((*cp)->next)) {
74 61f5c35c 2004-05-15 devnull if ((*cp)->name) {
75 61f5c35c 2004-05-15 devnull if (debug) Bprint(Bstderr, "looking for <%s>, have <%s> in font %s\n", stoken, (*cp)->name, troffontab[trfid].trfontid);
76 61f5c35c 2004-05-15 devnull if (strcmp((*cp)->name, stoken) == 0)
77 61f5c35c 2004-05-15 devnull break;
78 61f5c35c 2004-05-15 devnull }
79 61f5c35c 2004-05-15 devnull }
80 61f5c35c 2004-05-15 devnull return(cp);
81 61f5c35c 2004-05-15 devnull }
82 61f5c35c 2004-05-15 devnull
83 61f5c35c 2004-05-15 devnull /* output glyph. Use first rune to look up character (hash)
84 61f5c35c 2004-05-15 devnull * then use stoken UTF string to find correct glyph in linked
85 61f5c35c 2004-05-15 devnull * list of glyphs in bucket.
86 61f5c35c 2004-05-15 devnull */
87 61f5c35c 2004-05-15 devnull void
88 61f5c35c 2004-05-15 devnull glyphout(Rune rune, char *stoken, BOOLEAN specialflag) {
89 61f5c35c 2004-05-15 devnull struct charent **cp;
90 61f5c35c 2004-05-15 devnull struct troffont *tfp;
91 e8fb1d3e 2004-05-17 devnull struct psfent *psfp = (struct psfent*)0;
92 61f5c35c 2004-05-15 devnull int i, t;
93 61f5c35c 2004-05-15 devnull int fontid; /* this is the troff font table index, not the mounted font table index */
94 e8fb1d3e 2004-05-17 devnull int mi, wid;
95 61f5c35c 2004-05-15 devnull Rune r;
96 61f5c35c 2004-05-15 devnull
97 e8fb1d3e 2004-05-17 devnull mi = 0;
98 61f5c35c 2004-05-15 devnull settrfont();
99 61f5c35c 2004-05-15 devnull
100 61f5c35c 2004-05-15 devnull /* check current font for the character, special or not */
101 61f5c35c 2004-05-15 devnull fontid = curtrofffontid;
102 61f5c35c 2004-05-15 devnull if (debug) fprint(2, " looking through current font: trying %s\n", troffontab[fontid].trfontid);
103 61f5c35c 2004-05-15 devnull cp = findglyph(fontid, rune, stoken);
104 61f5c35c 2004-05-15 devnull if (*cp != 0) goto foundit;
105 61f5c35c 2004-05-15 devnull
106 61f5c35c 2004-05-15 devnull if (specialflag) {
107 61f5c35c 2004-05-15 devnull if (expecthmot) hmot(0);
108 61f5c35c 2004-05-15 devnull
109 61f5c35c 2004-05-15 devnull /* check special fonts for the special character */
110 61f5c35c 2004-05-15 devnull /* cycle through the (troff) mounted fonts starting at the next font */
111 61f5c35c 2004-05-15 devnull for (mi=0; mi<fontmnt; mi++) {
112 61f5c35c 2004-05-15 devnull if (troffontab[fontid].trfontid==0) error(WARNING, "glyphout:troffontab[%d].trfontid=0x%x, botch!\n",
113 61f5c35c 2004-05-15 devnull fontid, troffontab[fontid].trfontid);
114 61f5c35c 2004-05-15 devnull if (fontmtab[mi]==0) {
115 61f5c35c 2004-05-15 devnull if (debug) fprint(2, "fontmtab[%d]=0x%x, fontmnt=%d\n", mi, fontmtab[mi], fontmnt);
116 61f5c35c 2004-05-15 devnull continue;
117 61f5c35c 2004-05-15 devnull }
118 61f5c35c 2004-05-15 devnull if (strcmp(troffontab[fontid].trfontid, fontmtab[mi])==0) break;
119 61f5c35c 2004-05-15 devnull }
120 61f5c35c 2004-05-15 devnull if (mi==fontmnt) error(FATAL, "current troff font is not mounted, botch!\n");
121 61f5c35c 2004-05-15 devnull for (i=(mi+1)%fontmnt; i!=mi; i=(i+1)%fontmnt) {
122 61f5c35c 2004-05-15 devnull if (fontmtab[i]==0) {
123 61f5c35c 2004-05-15 devnull if (debug) fprint(2, "fontmtab[%d]=0x%x, fontmnt=%d\n", i, fontmtab[i], fontmnt);
124 61f5c35c 2004-05-15 devnull continue;
125 61f5c35c 2004-05-15 devnull }
126 61f5c35c 2004-05-15 devnull fontid = findtfn(fontmtab[i], TRUE);
127 61f5c35c 2004-05-15 devnull if (debug) fprint(2, " looking through special fonts: trying %s\n", troffontab[fontid].trfontid);
128 61f5c35c 2004-05-15 devnull if (troffontab[fontid].special) {
129 61f5c35c 2004-05-15 devnull cp = findglyph(fontid, rune, stoken);
130 61f5c35c 2004-05-15 devnull if (*cp != 0) goto foundit;
131 61f5c35c 2004-05-15 devnull }
132 61f5c35c 2004-05-15 devnull }
133 61f5c35c 2004-05-15 devnull
134 61f5c35c 2004-05-15 devnull /* check font 1 (if current font is not font 1) for the special character */
135 61f5c35c 2004-05-15 devnull if (mi != 1) {
136 61f5c35c 2004-05-15 devnull fontid = findtfn(fontmtab[1], TRUE);;
137 61f5c35c 2004-05-15 devnull if (debug) fprint(2, " looking through font at position 1: trying %s\n", troffontab[fontid].trfontid);
138 61f5c35c 2004-05-15 devnull cp = findglyph(fontid, rune, stoken);
139 61f5c35c 2004-05-15 devnull if (*cp != 0) goto foundit;
140 61f5c35c 2004-05-15 devnull }
141 61f5c35c 2004-05-15 devnull }
142 61f5c35c 2004-05-15 devnull
143 61f5c35c 2004-05-15 devnull if (*cp == 0) {
144 61f5c35c 2004-05-15 devnull error(WARNING, "cannot find glyph, rune=0x%x stoken=<%s> troff font %s\n", rune, stoken,
145 61f5c35c 2004-05-15 devnull troffontab[curtrofffontid].trfontid);
146 61f5c35c 2004-05-15 devnull expecthmot = 0;
147 61f5c35c 2004-05-15 devnull }
148 61f5c35c 2004-05-15 devnull
149 61f5c35c 2004-05-15 devnull /* use the peter face in lieu of the character that we couldn't find */
150 61f5c35c 2004-05-15 devnull rune = 'p'; stoken = "pw";
151 61f5c35c 2004-05-15 devnull for (i=(mi+1)%fontmnt; i!=mi; i=(i+1)%fontmnt) {
152 61f5c35c 2004-05-15 devnull if (fontmtab[i]==0) {
153 61f5c35c 2004-05-15 devnull if (debug) fprint(2, "fontmtab[%d]=0x%x\n", i, fontmtab[i]);
154 61f5c35c 2004-05-15 devnull continue;
155 61f5c35c 2004-05-15 devnull }
156 61f5c35c 2004-05-15 devnull fontid = findtfn(fontmtab[i], TRUE);
157 61f5c35c 2004-05-15 devnull if (debug) fprint(2, " looking through special fonts: trying %s\n", troffontab[fontid].trfontid);
158 61f5c35c 2004-05-15 devnull if (troffontab[fontid].special) {
159 61f5c35c 2004-05-15 devnull cp = findglyph(fontid, rune, stoken);
160 61f5c35c 2004-05-15 devnull if (*cp != 0) goto foundit;
161 61f5c35c 2004-05-15 devnull }
162 61f5c35c 2004-05-15 devnull }
163 fa325e9b 2020-01-10 cross
164 61f5c35c 2004-05-15 devnull if (*cp == 0) {
165 61f5c35c 2004-05-15 devnull error(WARNING, "cannot find glyph, rune=0x%x stoken=<%s> troff font %s\n", rune, stoken,
166 61f5c35c 2004-05-15 devnull troffontab[curtrofffontid].trfontid);
167 61f5c35c 2004-05-15 devnull expecthmot = 0;
168 61f5c35c 2004-05-15 devnull return;
169 61f5c35c 2004-05-15 devnull }
170 61f5c35c 2004-05-15 devnull
171 61f5c35c 2004-05-15 devnull foundit:
172 61f5c35c 2004-05-15 devnull t = (((*cp)->postfontid&0xff)<<8) | ((*cp)->postcharid&0xff);
173 61f5c35c 2004-05-15 devnull if (debug) {
174 61f5c35c 2004-05-15 devnull Bprint(Bstderr, "runeout(0x%x)<%C> postfontid=0x%x postcharid=0x%x troffcharwidth=%d\n",
175 61f5c35c 2004-05-15 devnull rune, rune, (*cp)->postfontid, (*cp)->postcharid, (*cp)->troffcharwidth);
176 61f5c35c 2004-05-15 devnull }
177 fa325e9b 2020-01-10 cross
178 61f5c35c 2004-05-15 devnull tfp = &(troffontab[fontid]);
179 61f5c35c 2004-05-15 devnull for (i=0; i<tfp->psfmapsize; i++) {
180 61f5c35c 2004-05-15 devnull psfp = &(tfp->psfmap[i]);
181 61f5c35c 2004-05-15 devnull if(t>=psfp->start && t<=psfp->end) break;
182 61f5c35c 2004-05-15 devnull }
183 61f5c35c 2004-05-15 devnull if (i >= tfp->psfmapsize)
184 61f5c35c 2004-05-15 devnull error(FATAL, "character <0x%x> does not have a Postscript font defined.\n", rune);
185 61f5c35c 2004-05-15 devnull
186 61f5c35c 2004-05-15 devnull setpsfont(psfp->psftid, fontsize);
187 61f5c35c 2004-05-15 devnull
188 61f5c35c 2004-05-15 devnull if (t == 0x0001) { /* character is in charlib */
189 61f5c35c 2004-05-15 devnull endstring();
190 61f5c35c 2004-05-15 devnull if (pageon()) {
191 61f5c35c 2004-05-15 devnull Bprint(Bstdout, "%d %d m ", hpos, vpos);
192 61f5c35c 2004-05-15 devnull /* if char is unicode character rather than name, clean up for postscript */
193 61f5c35c 2004-05-15 devnull wid = chartorune(&r, (*cp)->name);
194 61f5c35c 2004-05-15 devnull if(' '<r && r<0x7F)
195 61f5c35c 2004-05-15 devnull Bprint(Bstdout, "%d build_%s\n", (*cp)->troffcharwidth, (*cp)->name);
196 61f5c35c 2004-05-15 devnull else{
197 61f5c35c 2004-05-15 devnull if((*cp)->name[wid] != 0)
198 61f5c35c 2004-05-15 devnull error(FATAL, "character <%s> badly named\n", (*cp)->name);
199 61f5c35c 2004-05-15 devnull Bprint(Bstdout, "%d build_X%.4x\n", (*cp)->troffcharwidth, r);
200 61f5c35c 2004-05-15 devnull }
201 61f5c35c 2004-05-15 devnull
202 61f5c35c 2004-05-15 devnull /* stash charent pointer in a list so that we can print these character definitions
203 61f5c35c 2004-05-15 devnull * in the prologue.
204 61f5c35c 2004-05-15 devnull */
205 61f5c35c 2004-05-15 devnull for (i=0; i<build_char_cnt; i++)
206 61f5c35c 2004-05-15 devnull if (*cp == build_char_list[i]) break;
207 61f5c35c 2004-05-15 devnull if (i == build_char_cnt) {
208 61f5c35c 2004-05-15 devnull build_char_list = galloc(build_char_list, sizeof(struct charent *) * ++build_char_cnt,
209 61f5c35c 2004-05-15 devnull "build_char_list");
210 61f5c35c 2004-05-15 devnull build_char_list[build_char_cnt-1] = *cp;
211 61f5c35c 2004-05-15 devnull }
212 61f5c35c 2004-05-15 devnull }
213 61f5c35c 2004-05-15 devnull expecthmot = (*cp)->troffcharwidth * fontsize / unitwidth;
214 61f5c35c 2004-05-15 devnull } else if (isinstring() || rune != ' ') {
215 61f5c35c 2004-05-15 devnull startstring();
216 61f5c35c 2004-05-15 devnull if (pageon()) {
217 61f5c35c 2004-05-15 devnull if (rune == ' ')
218 61f5c35c 2004-05-15 devnull Bprint(Bstdout, " ");
219 61f5c35c 2004-05-15 devnull else
220 61f5c35c 2004-05-15 devnull Bprint(Bstdout, "%s", charcode[RUNEGETCHAR(t)].str);
221 61f5c35c 2004-05-15 devnull }
222 61f5c35c 2004-05-15 devnull expecthmot = (*cp)->troffcharwidth * fontsize / unitwidth;
223 61f5c35c 2004-05-15 devnull }
224 61f5c35c 2004-05-15 devnull }
225 61f5c35c 2004-05-15 devnull
226 61f5c35c 2004-05-15 devnull /* runeout puts a symbol into a string (queue) to be output.
227 61f5c35c 2004-05-15 devnull * It also has to keep track of the current and last symbol
228 61f5c35c 2004-05-15 devnull * output to check that the spacing is correct by default
229 61f5c35c 2004-05-15 devnull * or needs to be adjusted with a spacing operation.
230 61f5c35c 2004-05-15 devnull */
231 61f5c35c 2004-05-15 devnull
232 61f5c35c 2004-05-15 devnull void
233 61f5c35c 2004-05-15 devnull runeout(Rune rune) {
234 61f5c35c 2004-05-15 devnull char stoken[UTFmax+1];
235 61f5c35c 2004-05-15 devnull int i;
236 61f5c35c 2004-05-15 devnull
237 61f5c35c 2004-05-15 devnull i = runetochar(stoken, &rune);
238 61f5c35c 2004-05-15 devnull stoken[i] = '\0';
239 61f5c35c 2004-05-15 devnull glyphout(rune, stoken, TRUE);
240 61f5c35c 2004-05-15 devnull }
241 61f5c35c 2004-05-15 devnull
242 61f5c35c 2004-05-15 devnull void
243 61f5c35c 2004-05-15 devnull specialout(char *stoken) {
244 61f5c35c 2004-05-15 devnull Rune rune;
245 61f5c35c 2004-05-15 devnull
246 63002b3e 2014-03-03 0intro chartorune(&rune, stoken);
247 61f5c35c 2004-05-15 devnull glyphout(rune, stoken, TRUE);
248 61f5c35c 2004-05-15 devnull }
249 61f5c35c 2004-05-15 devnull
250 61f5c35c 2004-05-15 devnull void
251 e8fb1d3e 2004-05-17 devnull graphfunc(Biobuf *bp) {
252 61f5c35c 2004-05-15 devnull }
253 61f5c35c 2004-05-15 devnull
254 61f5c35c 2004-05-15 devnull long
255 61f5c35c 2004-05-15 devnull nametorune(char *name) {
256 61f5c35c 2004-05-15 devnull return(0);
257 61f5c35c 2004-05-15 devnull }
258 61f5c35c 2004-05-15 devnull
259 61f5c35c 2004-05-15 devnull void
260 61f5c35c 2004-05-15 devnull notavail(char *msg) {
261 61f5c35c 2004-05-15 devnull Bprint(Bstderr, "%s is not available at this time.\n", msg);
262 61f5c35c 2004-05-15 devnull }