9 contributed by kuro@vodka.Eng.Sun.COM (Teruhiko Kurosaka)
13 a state machine for interpreting shift-ksc.
19 * Convert EUC in Koran locale to Unicode.
20 * Only codeset 0 and 1 are used.
23 ukscproc(int c, Rune **r, long input_loc)
25 static enum { init, cs1last /*, cs2, cs3first, cs3last*/} state = init;
26 static int korean646 = 1; /* fixed to 1 for now. */
37 if(korean646 && (c=='\\')){
52 case cs1last: /* 2nd byte of codeset 1 (KSC 5601) */
55 warn("unexpected EOF in %s", file);
56 c = 0x21 | (lastc&0x80);
58 n = ((lastc&0x7f)-33)*94 + (c&0x7f)-33;
59 if((n >= ksc5601max) || ((l = tabksc5601[n]) < 0)){
62 warn("unknown ksc5601 %d (from 0x%x,0x%x) near byte %ld in %s", n, lastc, c, input_loc, file);
72 warn("ukscproc: unknown state %d", init);
77 uksc_in(int fd, long *, struct convert *out)
88 while((n = read(fd, ibuf, sizeof ibuf)) > 0){
89 for(i = 0; i < n; i++){
90 ukscproc(ibuf[i], &r, nin++);
101 ukscproc(-1, &r, nin);
108 uksc_out(Rune *base, int n, long *)
114 static int first = 1;
118 for(i = 0; i < NRUNE; i++)
120 for(i = 0; i < ksc5601max; i++)
121 if((l = tabksc5601[i]) != -1){
130 for(i = 0; i < n; i++){
135 if(r < NRUNE && tab[r] != -1){
136 *p++ = 0x80 | (tab[r]/94 + 0x21);
137 *p++ = 0x80 | (tab[r]%94 + 0x21);
141 warn("rune 0x%x not in output cs", r);
150 write(1, obuf, p-obuf);