170 lines · 3.1 KB · C
RawDownload
/*  * 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);} 

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t