/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #ifdef PLAN9#include <u.h>#include <libc.h>#include <bio.h>#else#include <stdio.h>#include <unistd.h>#include "plan9.h"#endif#include "hdr.h"#include "conv.h"#include "ksc.h" /* contributed by kuro@vodka.Eng.Sun.COM (Teruhiko Kurosaka)*/ /* a state machine for interpreting shift-ksc.*/ #define SS2 0x8e#define SS3 0x8f/* * Convert EUC in Koran locale to Unicode. * Only codeset 0 and 1 are used. */voidukscproc(int c, Rune **r, long input_loc){ static enum { init, cs1last /*, cs2, cs3first, cs3last*/} state = init; static int korean646 = 1; /* fixed to 1 for now. */ static int lastc; int n; long l; switch(state) { case init: if (c < 0){ return; }else if (c < 128){ if(korean646 && (c=='\\')){ emit(0x20A9); } else { emit(c); }/* }else if (c==SS2){ state = cs2; }else if (c==SS3){ state = cs3first; */ }else{ lastc = c; state = cs1last; } return; case cs1last: /* 2nd byte of codeset 1 (KSC 5601) */ if(c < 0){ if(squawk) EPR "%s: unexpected EOF in %s\n", argv0, file); c = 0x21 | (lastc&0x80); } n = ((lastc&0x7f)-33)*94 + (c&0x7f)-33; if((n >= ksc5601max) || ((l = tabksc5601[n]) < 0)){ nerrors++; if(squawk) EPR "%s: unknown ksc5601 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file); if(!clean) emit(BADMAP); } else { emit(l); } state = init; return; default: if(squawk) EPR "%s: ukscproc: unknown state %d\n", argv0, init); }} voiduksc_in(int fd, long *notused, struct convert *out){ Rune ob[N]; Rune *r, *re; uchar ibuf[N]; int n, i; long nin; USED(notused); r = ob; re = ob+N-3; nin = 0; while((n = read(fd, ibuf, sizeof ibuf)) > 0){ for(i = 0; i < n; i++){ ukscproc(ibuf[i], &r, nin++); if(r >= re){ OUT(out, ob, r-ob); r = ob; } } if(r > ob){ OUT(out, ob, r-ob); r = ob; } } ukscproc(-1, &r, nin); if(r > ob) OUT(out, ob, r-ob); OUT(out, ob, 0);} voiduksc_out(Rune *base, int n, long *notused){ char *p; int i; Rune r; long l; static int first = 1; USED(notused); if(first){ first = 0; for(i = 0; i < NRUNE; i++) tab[i] = -1; for(i = 0; i < ksc5601max; i++) if((l = tabksc5601[i]) != -1){ if(l < 0) tab[-l] = i; else tab[l] = i; } } nrunes += n; p = obuf; for(i = 0; i < n; i++){ r = base[i]; if(r < 128) *p++ = r; else { if(tab[r] != -1){ *p++ = 0x80 | (tab[r]/94 + 0x21); *p++ = 0x80 | (tab[r]%94 + 0x21); continue; } if(squawk) EPR "%s: rune 0x%x not in output cs\n", argv0, r); nerrors++; if(clean) continue; *p++ = BYTEBADMAP; } } noutput += p-obuf; if(p > obuf) write(1, obuf, p-obuf);}
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
#ifdef PLAN9
#include <u.h>
#include <libc.h>
#include <bio.h>
#else
#include <stdio.h>
#include <unistd.h>
#include "plan9.h"
#endif
#include "hdr.h"
#include "conv.h"
#include "ksc.h"
/*
contributed by kuro@vodka.Eng.Sun.COM (Teruhiko Kurosaka)
*/
/*
a state machine for interpreting shift-ksc.
*/
#define SS2 0x8e
#define SS3 0x8f
/*
* Convert EUC in Koran locale to Unicode.
* Only codeset 0 and 1 are used.
*/
void
ukscproc(int c, Rune **r, long input_loc)
{
static enum { init, cs1last /*, cs2, cs3first, cs3last*/} state = init;
static int korean646 = 1; /* fixed to 1 for now. */
static int lastc;
int n;
long l;
switch(state)
{
case init:
if (c < 0){
return;
}else if (c < 128){
if(korean646 && (c=='\\')){
emit(0x20A9);
} else {
emit(c);
}
/* }else if (c==SS2){
state = cs2;
}else if (c==SS3){
state = cs3first;
*/ }else{
lastc = c;
state = cs1last;
}
return;
case cs1last: /* 2nd byte of codeset 1 (KSC 5601) */
if(c < 0){
if(squawk)
EPR "%s: unexpected EOF in %s\n", argv0, file);
c = 0x21 | (lastc&0x80);
}
n = ((lastc&0x7f)-33)*94 + (c&0x7f)-33;
if((n >= ksc5601max) || ((l = tabksc5601[n]) < 0)){
nerrors++;
if(squawk)
EPR "%s: unknown ksc5601 %d (from 0x%x,0x%x) near byte %ld in %s\n", argv0, n, lastc, c, input_loc, file);
if(!clean)
emit(BADMAP);
} else {
emit(l);
}
state = init;
return;
default:
if(squawk)
EPR "%s: ukscproc: unknown state %d\n",
argv0, init);
}
}
void
uksc_in(int fd, long *notused, struct convert *out)
{
Rune ob[N];
Rune *r, *re;
uchar ibuf[N];
int n, i;
long nin;
USED(notused);
r = ob;
re = ob+N-3;
nin = 0;
while((n = read(fd, ibuf, sizeof ibuf)) > 0){
for(i = 0; i < n; i++){
ukscproc(ibuf[i], &r, nin++);
if(r >= re){
OUT(out, ob, r-ob);
r = ob;
}
}
if(r > ob){
OUT(out, ob, r-ob);
r = ob;
}
}
ukscproc(-1, &r, nin);
if(r > ob)
OUT(out, ob, r-ob);
OUT(out, ob, 0);
}
void
uksc_out(Rune *base, int n, long *notused)
{
char *p;
int i;
Rune r;
long l;
static int first = 1;
USED(notused);
if(first){
first = 0;
for(i = 0; i < NRUNE; i++)
tab[i] = -1;
for(i = 0; i < ksc5601max; i++)
if((l = tabksc5601[i]) != -1){
if(l < 0)
tab[-l] = i;
else
tab[l] = i;
}
}
nrunes += n;
p = obuf;
for(i = 0; i < n; i++){
r = base[i];
if(r < 128)
*p++ = r;
else {
if(tab[r] != -1){
*p++ = 0x80 | (tab[r]/94 + 0x21);
*p++ = 0x80 | (tab[r]%94 + 0x21);
continue;
}
if(squawk)
EPR "%s: rune 0x%x not in output cs\n", argv0, r);
nerrors++;
if(clean)
continue;
*p++ = BYTEBADMAP;
}
}
noutput += p-obuf;
if(p > obuf)
write(1, obuf, p-obuf);
}