Blame


1 4418401f 2004-05-17 devnull /*
2 4418401f 2004-05-17 devnull output language from troff:
3 4418401f 2004-05-17 devnull all numbers are character strings
4 4418401f 2004-05-17 devnull
5 4418401f 2004-05-17 devnull sn size in points
6 4418401f 2004-05-17 devnull fn font as number from 1-n
7 4418401f 2004-05-17 devnull cx ascii character x
8 4418401f 2004-05-17 devnull Cxyz funny char xyz. terminated by white space
9 4418401f 2004-05-17 devnull Nn absolute character number n on this font. ditto
10 4418401f 2004-05-17 devnull Hn go to absolute horizontal position n
11 4418401f 2004-05-17 devnull Vn go to absolute vertical position n (down is positive)
12 4418401f 2004-05-17 devnull hn go n units horizontally (relative)
13 4418401f 2004-05-17 devnull vn ditto vertically
14 4418401f 2004-05-17 devnull nnc move right nn, then print c (exactly 2 digits!)
15 4418401f 2004-05-17 devnull (this wart is an optimization that shrinks output file size
16 4418401f 2004-05-17 devnull about 35% and run-time about 15% while preserving ascii-ness)
17 4418401f 2004-05-17 devnull Dt ...\n draw operation 't':
18 4418401f 2004-05-17 devnull Dl x y line from here by x,y
19 4418401f 2004-05-17 devnull Dc d circle of diameter d with left side here
20 4418401f 2004-05-17 devnull De x y ellipse of axes x,y with left side here
21 4418401f 2004-05-17 devnull Da dx dy dx dy arc counter-clockwise, center at dx,dx, end at dx,dy
22 4418401f 2004-05-17 devnull D~ x y x y ... wiggly line by x,y then x,y ...
23 4418401f 2004-05-17 devnull nb a end of line (information only -- no action needed)
24 4418401f 2004-05-17 devnull w paddable word space -- no action needed
25 4418401f 2004-05-17 devnull b = space before line, a = after
26 4418401f 2004-05-17 devnull p new page begins -- set v to 0
27 4418401f 2004-05-17 devnull #...\n comment
28 4418401f 2004-05-17 devnull x ...\n device control functions:
29 4418401f 2004-05-17 devnull x i init
30 4418401f 2004-05-17 devnull x T s name of device is s
31 4418401f 2004-05-17 devnull x r n h v resolution is n/inch
32 4418401f 2004-05-17 devnull h = min horizontal motion, v = min vert
33 4418401f 2004-05-17 devnull x p pause (can restart)
34 4418401f 2004-05-17 devnull x s stop -- done for ever
35 4418401f 2004-05-17 devnull x t generate trailer
36 4418401f 2004-05-17 devnull x f n s font position n contains font s
37 4418401f 2004-05-17 devnull x H n set character height to n
38 4418401f 2004-05-17 devnull x S n set slant to N
39 4418401f 2004-05-17 devnull
40 4418401f 2004-05-17 devnull Subcommands like "i" are often spelled out like "init".
41 4418401f 2004-05-17 devnull */
42 4418401f 2004-05-17 devnull
43 4418401f 2004-05-17 devnull #include <u.h>
44 4418401f 2004-05-17 devnull #include <libc.h>
45 4418401f 2004-05-17 devnull #include <draw.h>
46 4418401f 2004-05-17 devnull #include <bio.h>
47 4418401f 2004-05-17 devnull
48 4418401f 2004-05-17 devnull #define hmot(n) hpos += n
49 4418401f 2004-05-17 devnull #define hgoto(n) hpos = n
50 4418401f 2004-05-17 devnull #define vmot(n) vgoto(vpos + n)
51 4418401f 2004-05-17 devnull #define vgoto(n) vpos = n
52 4418401f 2004-05-17 devnull
53 4418401f 2004-05-17 devnull #define putchar(x) Bprint(&bout, "%C", x)
54 4418401f 2004-05-17 devnull
55 4418401f 2004-05-17 devnull int hpos; /* horizontal position where we are supposed to be next (left = 0) */
56 4418401f 2004-05-17 devnull int vpos; /* current vertical position (down positive) */
57 4418401f 2004-05-17 devnull char *fontfile = "/lib/font/bit/pelm/unicode.9x24.font";
58 4418401f 2004-05-17 devnull
59 4418401f 2004-05-17 devnull char *pschar(char *, char *hex, int *wid, int *ht);
60 4418401f 2004-05-17 devnull int kanji(char *);
61 4418401f 2004-05-17 devnull void Bgetstr(Biobuf *bp, char *s);
62 4418401f 2004-05-17 devnull void Bgetline(Biobuf *bp, char *s);
63 4418401f 2004-05-17 devnull void Bgetint(Biobuf *bp, int *n);
64 4418401f 2004-05-17 devnull
65 4418401f 2004-05-17 devnull Biobuf bin, bout;
66 4418401f 2004-05-17 devnull
67 4418401f 2004-05-17 devnull void
68 4418401f 2004-05-17 devnull main(void)
69 4418401f 2004-05-17 devnull {
70 4418401f 2004-05-17 devnull int c, n;
71 4418401f 2004-05-17 devnull char str[100], *args[10];
72 4418401f 2004-05-17 devnull int jfont, curfont;
73 4418401f 2004-05-17 devnull
74 4418401f 2004-05-17 devnull if(initdraw(0, fontfile, 0) < 0){
75 4418401f 2004-05-17 devnull fprint(2, "mnihongo: can't initialize display: %r\n");
76 4418401f 2004-05-17 devnull exits("open");
77 4418401f 2004-05-17 devnull }
78 4418401f 2004-05-17 devnull Binit(&bin, 0, OREAD);
79 4418401f 2004-05-17 devnull Binit(&bout, 1, OWRITE);
80 4418401f 2004-05-17 devnull
81 4418401f 2004-05-17 devnull jfont = -1;
82 4418401f 2004-05-17 devnull curfont = 1;
83 4418401f 2004-05-17 devnull while ((c = Bgetc(&bin)) >= 0) {
84 4418401f 2004-05-17 devnull switch (c) {
85 4418401f 2004-05-17 devnull case '\n': /* when input is text */
86 4418401f 2004-05-17 devnull case ' ':
87 4418401f 2004-05-17 devnull case '\0': /* occasional noise creeps in */
88 4418401f 2004-05-17 devnull putchar(c);
89 4418401f 2004-05-17 devnull break;
90 4418401f 2004-05-17 devnull case '0': case '1': case '2': case '3': case '4':
91 4418401f 2004-05-17 devnull case '5': case '6': case '7': case '8': case '9':
92 4418401f 2004-05-17 devnull /* two motion digits plus a character */
93 4418401f 2004-05-17 devnull putchar(c); /* digit 1 */
94 4418401f 2004-05-17 devnull n = (c-'0')*10;
95 4418401f 2004-05-17 devnull c = Bgetc(&bin);
96 4418401f 2004-05-17 devnull putchar(c); /* digit 2 */
97 4418401f 2004-05-17 devnull n += c - '0';
98 4418401f 2004-05-17 devnull hmot(n);
99 4418401f 2004-05-17 devnull putchar(Bgetc(&bin)); /* char itself */
100 4418401f 2004-05-17 devnull break;
101 4418401f 2004-05-17 devnull case 'c': /* single character */
102 4418401f 2004-05-17 devnull c = Bgetrune(&bin);
103 4418401f 2004-05-17 devnull if(c==' ') /* why does this happen? it's troff - bwk */
104 4418401f 2004-05-17 devnull break;
105 4418401f 2004-05-17 devnull else if(jfont == curfont){
106 4418401f 2004-05-17 devnull Bungetrune(&bin);
107 4418401f 2004-05-17 devnull Bgetstr(&bin, str);
108 4418401f 2004-05-17 devnull kanji(str);
109 4418401f 2004-05-17 devnull }else{
110 4418401f 2004-05-17 devnull putchar('c');
111 4418401f 2004-05-17 devnull putchar(c);
112 4418401f 2004-05-17 devnull }
113 4418401f 2004-05-17 devnull break;
114 4418401f 2004-05-17 devnull case 'C':
115 4418401f 2004-05-17 devnull Bgetstr(&bin, str);
116 4418401f 2004-05-17 devnull Bprint(&bout, "C%s", str);
117 4418401f 2004-05-17 devnull break;
118 4418401f 2004-05-17 devnull case 'f':
119 4418401f 2004-05-17 devnull Bgetstr(&bin, str);
120 4418401f 2004-05-17 devnull curfont = atoi(str);
121 4418401f 2004-05-17 devnull if(curfont < 0 || curfont > 20)
122 4418401f 2004-05-17 devnull curfont = 1; /* sanity */
123 4418401f 2004-05-17 devnull Bprint(&bout, "%c%s", c, str);
124 4418401f 2004-05-17 devnull break;
125 4418401f 2004-05-17 devnull case 'N': /* absolute character number */
126 4418401f 2004-05-17 devnull case 's':
127 4418401f 2004-05-17 devnull case 'p': /* new page */
128 4418401f 2004-05-17 devnull Bgetint(&bin, &n);
129 4418401f 2004-05-17 devnull Bprint(&bout, "%c%d", c, n);
130 4418401f 2004-05-17 devnull break;
131 4418401f 2004-05-17 devnull case 'H': /* absolute horizontal motion */
132 4418401f 2004-05-17 devnull Bgetint(&bin, &n);
133 4418401f 2004-05-17 devnull Bprint(&bout, "%c%d", c, n);
134 4418401f 2004-05-17 devnull hgoto(n);
135 4418401f 2004-05-17 devnull break;
136 4418401f 2004-05-17 devnull case 'h': /* relative horizontal motion */
137 4418401f 2004-05-17 devnull Bgetint(&bin, &n);
138 4418401f 2004-05-17 devnull Bprint(&bout, "%c%d", c, n);
139 4418401f 2004-05-17 devnull hmot(n);
140 4418401f 2004-05-17 devnull break;
141 4418401f 2004-05-17 devnull case 'V':
142 4418401f 2004-05-17 devnull Bgetint(&bin, &n);
143 4418401f 2004-05-17 devnull Bprint(&bout, "%c%d", c, n);
144 4418401f 2004-05-17 devnull vgoto(n);
145 4418401f 2004-05-17 devnull break;
146 4418401f 2004-05-17 devnull case 'v':
147 4418401f 2004-05-17 devnull Bgetint(&bin, &n);
148 4418401f 2004-05-17 devnull Bprint(&bout, "%c%d", c, n);
149 4418401f 2004-05-17 devnull vmot(n);
150 4418401f 2004-05-17 devnull break;
151 4418401f 2004-05-17 devnull
152 4418401f 2004-05-17 devnull case 'w': /* word space */
153 4418401f 2004-05-17 devnull putchar(c);
154 4418401f 2004-05-17 devnull break;
155 4418401f 2004-05-17 devnull
156 4418401f 2004-05-17 devnull case 'x': /* device control */
157 4418401f 2004-05-17 devnull Bgetline(&bin, str);
158 4418401f 2004-05-17 devnull Bprint(&bout, "%c%s", c, str);
159 4418401f 2004-05-17 devnull if(tokenize(str, args, 10)>2 && args[0][0]=='f' && ('0'<=args[1][0] && args[1][0]<='9')){
160 4418401f 2004-05-17 devnull if(strncmp(args[2], "Jp", 2) == 0)
161 4418401f 2004-05-17 devnull jfont = atoi(args[1]);
162 4418401f 2004-05-17 devnull else if(atoi(args[1]) == jfont)
163 4418401f 2004-05-17 devnull jfont = -1;
164 4418401f 2004-05-17 devnull }
165 4418401f 2004-05-17 devnull break;
166 4418401f 2004-05-17 devnull
167 4418401f 2004-05-17 devnull case 'D': /* draw function */
168 4418401f 2004-05-17 devnull case 'n': /* end of line */
169 4418401f 2004-05-17 devnull case '#': /* comment */
170 4418401f 2004-05-17 devnull Bgetline(&bin, str);
171 4418401f 2004-05-17 devnull Bprint(&bout, "%c%s", c, str);
172 4418401f 2004-05-17 devnull break;
173 4418401f 2004-05-17 devnull default:
174 4418401f 2004-05-17 devnull fprint(2, "mnihongo: unknown input character %o %c\n", c, c);
175 4418401f 2004-05-17 devnull exits("error");
176 4418401f 2004-05-17 devnull }
177 4418401f 2004-05-17 devnull }
178 4418401f 2004-05-17 devnull }
179 4418401f 2004-05-17 devnull
180 4418401f 2004-05-17 devnull int kanji(char *s) /* very special pleading */
181 4418401f 2004-05-17 devnull { /* dump as kanji char if looks like one */
182 4418401f 2004-05-17 devnull Rune r;
183 4418401f 2004-05-17 devnull char hex[500];
184 4418401f 2004-05-17 devnull int size = 10, ht, wid;
185 4418401f 2004-05-17 devnull
186 4418401f 2004-05-17 devnull chartorune(&r, s);
187 4418401f 2004-05-17 devnull pschar(s, hex, &wid, &ht);
188 4418401f 2004-05-17 devnull Bprint(&bout, "x X PS save %d %d m\n", hpos, vpos);
189 4418401f 2004-05-17 devnull Bprint(&bout, "x X PS currentpoint translate %d %d scale ptsize dup scale\n", size, size);
190 4418401f 2004-05-17 devnull Bprint(&bout, "x X PS %d %d true [%d 0 0 -%d 0 %d]\n",
191 4418401f 2004-05-17 devnull wid, ht, wid, wid, ht-2); /* kludge; ought to use ->ascent */
192 4418401f 2004-05-17 devnull Bprint(&bout, "x X PS {<%s>}\n", hex);
193 4418401f 2004-05-17 devnull Bprint(&bout, "x X PS imagemask restore\n");
194 4418401f 2004-05-17 devnull return 1;
195 4418401f 2004-05-17 devnull }
196 4418401f 2004-05-17 devnull
197 4418401f 2004-05-17 devnull char *pschar(char *s, char *hex, int *wid, int *ht)
198 4418401f 2004-05-17 devnull {
199 4418401f 2004-05-17 devnull Point chpt, spt;
200 4418401f 2004-05-17 devnull Image *b;
201 4418401f 2004-05-17 devnull uchar rowdata[100];
202 4418401f 2004-05-17 devnull char *hp = hex;
203 4418401f 2004-05-17 devnull int y, i;
204 4418401f 2004-05-17 devnull
205 4418401f 2004-05-17 devnull chpt = stringsize(font, s); /* bounding box of char */
206 4418401f 2004-05-17 devnull *wid = ((chpt.x+7) / 8) * 8;
207 4418401f 2004-05-17 devnull *ht = chpt.y;
208 4418401f 2004-05-17 devnull /* postscript is backwards to video, so draw white (ones) on black (zeros) */
209 4418401f 2004-05-17 devnull b = allocimage(display, Rpt(ZP, chpt), GREY1, 0, DBlack); /* place to put it */
210 4418401f 2004-05-17 devnull spt = string(b, Pt(0,0), display->white, ZP, font, s); /* put it there */
211 4418401f 2004-05-17 devnull /* Bprint(&bout, "chpt %P, spt %P, wid,ht %d,%d\n", chpt, spt, *wid, *ht);
212 4418401f 2004-05-17 devnull /* Bflush(&bout); */
213 4418401f 2004-05-17 devnull for (y = 0; y < chpt.y; y++) { /* read bits a row at a time */
214 4418401f 2004-05-17 devnull memset(rowdata, 0, sizeof rowdata);
215 4418401f 2004-05-17 devnull unloadimage(b, Rect(0, y, chpt.x, y+1), rowdata, sizeof rowdata);
216 4418401f 2004-05-17 devnull for (i = 0; i < spt.x; i += 8) { /* 8 == byte */
217 4418401f 2004-05-17 devnull sprint(hp, "%2.2x", rowdata[i/8]);
218 4418401f 2004-05-17 devnull hp += 2;
219 4418401f 2004-05-17 devnull }
220 4418401f 2004-05-17 devnull }
221 4418401f 2004-05-17 devnull *hp = 0;
222 4418401f 2004-05-17 devnull freeimage(b);
223 4418401f 2004-05-17 devnull return hex;
224 4418401f 2004-05-17 devnull }
225 4418401f 2004-05-17 devnull
226 4418401f 2004-05-17 devnull
227 4418401f 2004-05-17 devnull void Bgetstr(Biobuf *bp, char *s) /* get a string */
228 4418401f 2004-05-17 devnull {
229 4418401f 2004-05-17 devnull int c;
230 4418401f 2004-05-17 devnull
231 4418401f 2004-05-17 devnull while ((c = Bgetc(bp)) >= 0) {
232 4418401f 2004-05-17 devnull if (c == ' ' || c == '\t' || c == '\n') {
233 4418401f 2004-05-17 devnull Bungetc(bp);
234 4418401f 2004-05-17 devnull break;
235 4418401f 2004-05-17 devnull }
236 4418401f 2004-05-17 devnull *s++ = c;
237 4418401f 2004-05-17 devnull }
238 4418401f 2004-05-17 devnull *s = 0;
239 4418401f 2004-05-17 devnull }
240 4418401f 2004-05-17 devnull
241 4418401f 2004-05-17 devnull void Bgetline(Biobuf *bp, char *s) /* get a line, including newline */
242 4418401f 2004-05-17 devnull {
243 4418401f 2004-05-17 devnull int c;
244 4418401f 2004-05-17 devnull
245 4418401f 2004-05-17 devnull while ((c = Bgetc(bp)) >= 0) {
246 4418401f 2004-05-17 devnull *s++ = c;
247 4418401f 2004-05-17 devnull if (c == '\n')
248 4418401f 2004-05-17 devnull break;
249 4418401f 2004-05-17 devnull }
250 4418401f 2004-05-17 devnull *s = 0;
251 4418401f 2004-05-17 devnull }
252 4418401f 2004-05-17 devnull
253 4418401f 2004-05-17 devnull void Bgetint(Biobuf *bp, int *n) /* get an integer */
254 4418401f 2004-05-17 devnull {
255 4418401f 2004-05-17 devnull double d;
256 4418401f 2004-05-17 devnull
257 4418401f 2004-05-17 devnull Bgetd(bp, &d);
258 4418401f 2004-05-17 devnull *n = d;
259 4418401f 2004-05-17 devnull }