Blame


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>
5 a31db67d 2004-04-21 devnull #else
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"
9 a31db67d 2004-04-21 devnull #endif
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 "ksc.h"
13 a31db67d 2004-04-21 devnull
14 a31db67d 2004-04-21 devnull /*
15 a31db67d 2004-04-21 devnull contributed by kuro@vodka.Eng.Sun.COM (Teruhiko Kurosaka)
16 a31db67d 2004-04-21 devnull */
17 a31db67d 2004-04-21 devnull
18 a31db67d 2004-04-21 devnull /*
19 a31db67d 2004-04-21 devnull a state machine for interpreting shift-ksc.
20 a31db67d 2004-04-21 devnull */
21 a31db67d 2004-04-21 devnull
22 a31db67d 2004-04-21 devnull #define SS2 0x8e
23 a31db67d 2004-04-21 devnull #define SS3 0x8f
24 a31db67d 2004-04-21 devnull /*
25 a31db67d 2004-04-21 devnull * Convert EUC in Koran locale to Unicode.
26 a31db67d 2004-04-21 devnull * Only codeset 0 and 1 are used.
27 a31db67d 2004-04-21 devnull */
28 a31db67d 2004-04-21 devnull void
29 a31db67d 2004-04-21 devnull ukscproc(int c, Rune **r, long input_loc)
30 a31db67d 2004-04-21 devnull {
31 a31db67d 2004-04-21 devnull static enum { init, cs1last /*, cs2, cs3first, cs3last*/} state = init;
32 a31db67d 2004-04-21 devnull static int korean646 = 1; /* fixed to 1 for now. */
33 a31db67d 2004-04-21 devnull static int lastc;
34 a31db67d 2004-04-21 devnull int n;
35 a31db67d 2004-04-21 devnull long l;
36 a31db67d 2004-04-21 devnull
37 a31db67d 2004-04-21 devnull switch(state)
38 a31db67d 2004-04-21 devnull {
39 a31db67d 2004-04-21 devnull case init:
40 a31db67d 2004-04-21 devnull if (c < 0){
41 a31db67d 2004-04-21 devnull return;
42 a31db67d 2004-04-21 devnull }else if (c < 128){
43 a31db67d 2004-04-21 devnull if(korean646 && (c=='\\')){
44 a31db67d 2004-04-21 devnull emit(0x20A9);
45 a31db67d 2004-04-21 devnull } else {
46 a31db67d 2004-04-21 devnull emit(c);
47 a31db67d 2004-04-21 devnull }
48 a31db67d 2004-04-21 devnull /* }else if (c==SS2){
49 a31db67d 2004-04-21 devnull state = cs2;
50 a31db67d 2004-04-21 devnull }else if (c==SS3){
51 a31db67d 2004-04-21 devnull state = cs3first;
52 a31db67d 2004-04-21 devnull */ }else{
53 a31db67d 2004-04-21 devnull lastc = c;
54 a31db67d 2004-04-21 devnull state = cs1last;
55 a31db67d 2004-04-21 devnull }
56 a31db67d 2004-04-21 devnull return;
57 a31db67d 2004-04-21 devnull
58 a31db67d 2004-04-21 devnull case cs1last: /* 2nd byte of codeset 1 (KSC 5601) */
59 a31db67d 2004-04-21 devnull if(c < 0){
60 a31db67d 2004-04-21 devnull if(squawk)
61 a31db67d 2004-04-21 devnull EPR "%s: unexpected EOF in %s\n", argv0, file);
62 a31db67d 2004-04-21 devnull c = 0x21 | (lastc&0x80);
63 a31db67d 2004-04-21 devnull }
64 a31db67d 2004-04-21 devnull n = ((lastc&0x7f)-33)*94 + (c&0x7f)-33;
65 a31db67d 2004-04-21 devnull if((n >= ksc5601max) || ((l = tabksc5601[n]) < 0)){
66 a31db67d 2004-04-21 devnull nerrors++;
67 a31db67d 2004-04-21 devnull if(squawk)
68 a31db67d 2004-04-21 devnull EPR "%s: unknown ksc5601 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file);
69 a31db67d 2004-04-21 devnull if(!clean)
70 a31db67d 2004-04-21 devnull emit(BADMAP);
71 a31db67d 2004-04-21 devnull } else {
72 a31db67d 2004-04-21 devnull emit(l);
73 a31db67d 2004-04-21 devnull }
74 a31db67d 2004-04-21 devnull state = init;
75 a31db67d 2004-04-21 devnull return;
76 a31db67d 2004-04-21 devnull default:
77 a31db67d 2004-04-21 devnull if(squawk)
78 a31db67d 2004-04-21 devnull EPR "%s: ukscproc: unknown state %d\n",
79 a31db67d 2004-04-21 devnull argv0, init);
80 a31db67d 2004-04-21 devnull }
81 a31db67d 2004-04-21 devnull }
82 a31db67d 2004-04-21 devnull
83 a31db67d 2004-04-21 devnull void
84 a31db67d 2004-04-21 devnull uksc_in(int fd, long *notused, struct convert *out)
85 a31db67d 2004-04-21 devnull {
86 a31db67d 2004-04-21 devnull Rune ob[N];
87 a31db67d 2004-04-21 devnull Rune *r, *re;
88 a31db67d 2004-04-21 devnull uchar ibuf[N];
89 a31db67d 2004-04-21 devnull int n, i;
90 a31db67d 2004-04-21 devnull long nin;
91 a31db67d 2004-04-21 devnull
92 a31db67d 2004-04-21 devnull USED(notused);
93 a31db67d 2004-04-21 devnull r = ob;
94 a31db67d 2004-04-21 devnull re = ob+N-3;
95 a31db67d 2004-04-21 devnull nin = 0;
96 a31db67d 2004-04-21 devnull while((n = read(fd, ibuf, sizeof ibuf)) > 0){
97 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
98 a31db67d 2004-04-21 devnull ukscproc(ibuf[i], &r, nin++);
99 a31db67d 2004-04-21 devnull if(r >= re){
100 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
101 a31db67d 2004-04-21 devnull r = ob;
102 a31db67d 2004-04-21 devnull }
103 a31db67d 2004-04-21 devnull }
104 a31db67d 2004-04-21 devnull if(r > ob){
105 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
106 a31db67d 2004-04-21 devnull r = ob;
107 a31db67d 2004-04-21 devnull }
108 a31db67d 2004-04-21 devnull }
109 a31db67d 2004-04-21 devnull ukscproc(-1, &r, nin);
110 a31db67d 2004-04-21 devnull if(r > ob)
111 a31db67d 2004-04-21 devnull OUT(out, ob, r-ob);
112 536f9b83 2006-05-21 devnull OUT(out, ob, 0);
113 a31db67d 2004-04-21 devnull }
114 a31db67d 2004-04-21 devnull
115 a31db67d 2004-04-21 devnull void
116 a31db67d 2004-04-21 devnull uksc_out(Rune *base, int n, long *notused)
117 a31db67d 2004-04-21 devnull {
118 a31db67d 2004-04-21 devnull char *p;
119 a31db67d 2004-04-21 devnull int i;
120 a31db67d 2004-04-21 devnull Rune r;
121 a31db67d 2004-04-21 devnull long l;
122 a31db67d 2004-04-21 devnull static int first = 1;
123 a31db67d 2004-04-21 devnull
124 a31db67d 2004-04-21 devnull USED(notused);
125 a31db67d 2004-04-21 devnull if(first){
126 a31db67d 2004-04-21 devnull first = 0;
127 a31db67d 2004-04-21 devnull for(i = 0; i < NRUNE; i++)
128 a31db67d 2004-04-21 devnull tab[i] = -1;
129 a31db67d 2004-04-21 devnull for(i = 0; i < ksc5601max; i++)
130 a31db67d 2004-04-21 devnull if((l = tabksc5601[i]) != -1){
131 a31db67d 2004-04-21 devnull if(l < 0)
132 a31db67d 2004-04-21 devnull tab[-l] = i;
133 a31db67d 2004-04-21 devnull else
134 a31db67d 2004-04-21 devnull tab[l] = i;
135 a31db67d 2004-04-21 devnull }
136 a31db67d 2004-04-21 devnull }
137 a31db67d 2004-04-21 devnull nrunes += n;
138 a31db67d 2004-04-21 devnull p = obuf;
139 a31db67d 2004-04-21 devnull for(i = 0; i < n; i++){
140 a31db67d 2004-04-21 devnull r = base[i];
141 a31db67d 2004-04-21 devnull if(r < 128)
142 a31db67d 2004-04-21 devnull *p++ = r;
143 a31db67d 2004-04-21 devnull else {
144 a31db67d 2004-04-21 devnull if(tab[r] != -1){
145 a31db67d 2004-04-21 devnull *p++ = 0x80 | (tab[r]/94 + 0x21);
146 a31db67d 2004-04-21 devnull *p++ = 0x80 | (tab[r]%94 + 0x21);
147 a31db67d 2004-04-21 devnull continue;
148 a31db67d 2004-04-21 devnull }
149 a31db67d 2004-04-21 devnull if(squawk)
150 a31db67d 2004-04-21 devnull EPR "%s: rune 0x%x not in output cs\n", argv0, r);
151 a31db67d 2004-04-21 devnull nerrors++;
152 a31db67d 2004-04-21 devnull if(clean)
153 a31db67d 2004-04-21 devnull continue;
154 a31db67d 2004-04-21 devnull *p++ = BYTEBADMAP;
155 a31db67d 2004-04-21 devnull }
156 a31db67d 2004-04-21 devnull }
157 a31db67d 2004-04-21 devnull noutput += p-obuf;
158 a31db67d 2004-04-21 devnull if(p > obuf)
159 a31db67d 2004-04-21 devnull write(1, obuf, p-obuf);
160 a31db67d 2004-04-21 devnull }