1 a31db67d 2004-04-21 devnull #ifdef PLAN9
2 a31db67d 2004-04-21 devnull #include <u.h>
3 a31db67d 2004-04-21 devnull #include <libc.h>
4 a31db67d 2004-04-21 devnull #include <bio.h>
6 a31db67d 2004-04-21 devnull #include <stdio.h>
7 a31db67d 2004-04-21 devnull #include <unistd.h>
8 a31db67d 2004-04-21 devnull #include "plan9.h"
10 a31db67d 2004-04-21 devnull #include "hdr.h"
11 a31db67d 2004-04-21 devnull #include "conv.h"
12 a31db67d 2004-04-21 devnull #include "gb.h"
15 a31db67d 2004-04-21 devnull a state machine for interpreting gb.
18 a31db67d 2004-04-21 devnull gbproc(int c, Rune **r, long input_loc)
20 a31db67d 2004-04-21 devnull static enum { state0, state1 } state = state0;
21 a31db67d 2004-04-21 devnull static int lastc;
22 a31db67d 2004-04-21 devnull long n, ch, cold = c;
24 a31db67d 2004-04-21 devnull switch(state)
26 a31db67d 2004-04-21 devnull case state0: /* idle state */
27 a31db67d 2004-04-21 devnull if(c < 0)
29 a31db67d 2004-04-21 devnull if(c >= 0xA1){
30 a31db67d 2004-04-21 devnull lastc = c;
31 a31db67d 2004-04-21 devnull state = state1;
37 a31db67d 2004-04-21 devnull case state1: /* seen a font spec */
38 a31db67d 2004-04-21 devnull if(c >= 0xA1)
39 a31db67d 2004-04-21 devnull n = (lastc-0xA0)*100 + (c-0xA0);
41 a31db67d 2004-04-21 devnull nerrors++;
42 a31db67d 2004-04-21 devnull if(squawk)
43 a31db67d 2004-04-21 devnull EPR "%s: bad gb glyph %d (from 0x%x,0x%lx) near byte %ld in %s\n", argv0, c-0xA0, lastc, cold, input_loc, file);
44 a31db67d 2004-04-21 devnull if(!clean)
45 a31db67d 2004-04-21 devnull emit(BADMAP);
46 a31db67d 2004-04-21 devnull state = state0;
49 a31db67d 2004-04-21 devnull ch = tabgb[n];
50 a31db67d 2004-04-21 devnull if(ch < 0){
51 a31db67d 2004-04-21 devnull nerrors++;
52 a31db67d 2004-04-21 devnull if(squawk)
53 a31db67d 2004-04-21 devnull EPR "%s: unknown gb %ld (from 0x%x,0x%lx) near byte %ld in %s\n", argv0, n, lastc, cold, input_loc, file);
54 a31db67d 2004-04-21 devnull if(!clean)
55 a31db67d 2004-04-21 devnull emit(BADMAP);
57 a31db67d 2004-04-21 devnull emit(ch);
58 a31db67d 2004-04-21 devnull state = state0;
63 a31db67d 2004-04-21 devnull gb_in(int fd, long *notused, struct convert *out)
65 a31db67d 2004-04-21 devnull Rune ob[N];
66 a31db67d 2004-04-21 devnull Rune *r, *re;
67 a31db67d 2004-04-21 devnull uchar ibuf[N];
68 a31db67d 2004-04-21 devnull int n, i;
69 a31db67d 2004-04-21 devnull long nin;
71 a31db67d 2004-04-21 devnull USED(notused);
73 a31db67d 2004-04-21 devnull re = ob+N-3;
75 a31db67d 2004-04-21 devnull while((n = read(fd, ibuf, sizeof ibuf)) > 0){
76 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
77 a31db67d 2004-04-21 devnull gbproc(ibuf[i], &r, nin++);
78 a31db67d 2004-04-21 devnull if(r >= re){
79 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
83 a31db67d 2004-04-21 devnull if(r > ob){
84 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
88 a31db67d 2004-04-21 devnull gbproc(-1, &r, nin);
89 a31db67d 2004-04-21 devnull if(r > ob)
90 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
91 536f9b83 2006-05-21 devnull OUT(out, ob, 0);
95 a31db67d 2004-04-21 devnull gb_out(Rune *base, int n, long *notused)
100 a31db67d 2004-04-21 devnull static int first = 1;
102 a31db67d 2004-04-21 devnull USED(notused);
103 a31db67d 2004-04-21 devnull if(first){
104 a31db67d 2004-04-21 devnull first = 0;
105 a31db67d 2004-04-21 devnull for(i = 0; i < NRUNE; i++)
106 a31db67d 2004-04-21 devnull tab[i] = -1;
107 a31db67d 2004-04-21 devnull for(i = 0; i < GBMAX; i++)
108 a31db67d 2004-04-21 devnull if(tabgb[i] != -1)
109 a31db67d 2004-04-21 devnull tab[tabgb[i]] = i;
111 a31db67d 2004-04-21 devnull nrunes += n;
112 a31db67d 2004-04-21 devnull p = obuf;
113 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
114 a31db67d 2004-04-21 devnull r = base[i];
115 a31db67d 2004-04-21 devnull if(r < 128)
116 a31db67d 2004-04-21 devnull *p++ = r;
118 a31db67d 2004-04-21 devnull if(tab[r] != -1){
119 a31db67d 2004-04-21 devnull r = tab[r];
120 a31db67d 2004-04-21 devnull *p++ = 0xA0 + (r/100);
121 a31db67d 2004-04-21 devnull *p++ = 0xA0 + (r%100);
122 a31db67d 2004-04-21 devnull continue;
124 a31db67d 2004-04-21 devnull if(squawk)
125 a31db67d 2004-04-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, r);
126 a31db67d 2004-04-21 devnull nerrors++;
127 a31db67d 2004-04-21 devnull if(clean)
128 a31db67d 2004-04-21 devnull continue;
129 a31db67d 2004-04-21 devnull *p++ = BYTEBADMAP;
132 a31db67d 2004-04-21 devnull noutput += p-obuf;
133 a31db67d 2004-04-21 devnull if(p > obuf)
134 a31db67d 2004-04-21 devnull write(1, obuf, p-obuf);