No. 32/622 Index Prev Next
Relay-Version: version B 2.10.2 9/5/84; site titcca.UUCP
Posting-Version: version B 2.10.2 9/18/84; site titnca.UUCP
Path: titcca!titnca!mk-sato
From: mk-sato@titnca.UUCP
Newsgroups: fj.sources,fj.kanji
Subject: k-in k-out converter
Message-ID: < 121@titnca.UUCP>
Date: 6 Jun 86 10:28:32 GMT
Date-Received: 6 Jun 86 10:28:53 GMT
Distribution: fj
Organization: Tokyo Institute of Tech. Japan
Lines: 296
*** REPLACE THIS LINE WITH YOUR MESSAGE ***
/*この間 fj.kanji に於て漢字のコード及び、k−in k−outの規格の
統一に関しての議論が盛んですが、私は以下のプログラムを用いてこの問題に対
処しています。これは、ホストコンピュータ上で、フィルターとして用います。
従来、この種のプログラムはすでにいくつも作成されておりますが、このプロ
グラムは、以下の点に特徴があります。
(1)図1に示す k-in k-out の体系に含まれるコードであれば漢字テキスト
にそれらが混在することを許容します。(但し、誤解のない程度の混在?)
即ち、漢字テキストに使用されているコードの種類の指定も行う必要がありませ
ん。
(2)コントロールコードが、^? というように変換される場合にも漢字コードを
読むことができます。(しかし、この場合には多少の危険を伴うことになります。)
プログラムの使用方法は、以下の通りです。
1。先ず、このプログラムを kc.c という名前でコピーし、ヘッダー部分を削除します。
2。cc kc.c
3。mv a.out kc
4。kcと入力すると、使用法が表示されます。
5。使用法の指示どうりに操作します。
例1。
kc -c < kanji.text ユーザー端末の種類が cpm type(k-in=ESC+'$'+'@' k
-out=ESC+'('+'H')で、漢字テキストを読む。
例2。
kc -c k.text
ユーザー端末の種類が cpm type(k-in=ESC+'$'+'@' k
-out=ESC+'('+'H')で読める漢字テキストk.textに変換
する。
例3
rn |kc -p ユーザー端末の種類が basic P parameta type(k-in=
ESC+'K' k-out=ESC+'H')で、news を読む。
等、
ご利用された方、あるいはこのプログラムに興味を持った方は、fj.kanji にnews
を送るか、mk-sato@titnca にメイルをお送り下さい。
*/
/************************ kanji-in sequence *******************************
図1ー(a)
ROOT
|
|-------------------------------|
ESC CNT
| |
|---------------| |---------------|
'$' 'K' SB SH
| | | |
|---------| SUC |---------| SUC
'@' CNT 'p' FAI
| | |
SUC |---------| SUC
'B' SUC
|
SUC
-------------------------------------------------------------------------------
jis(1978) rtux basic'I'
jis(1983) basic'P' tsscc(oldversion)
******************************************************************************/
/************************ kanji-out sequence *******************************
図1ー(b)
ROOT
|
|-------------------------------|
ESC CNT
| |
|---------------| |---------------|
'(' CNT SB SH
| | | |
|---------| |--------| |---------| SUC
'H' CNT '+' 'H' 'q' FAI
| | | | |
SUC |---------| SUC SUC SUC
'B' 'J'
| |
SUC SUC
-------------------------------------------------------------------------------
jis(1978) rtux basic'I'
jis(1983) jis(romaji) basic'P' tsscc(oldversion)
*****************************************************************************/
/* k_in k_out converter
16-may-1986 by T.Wada at Dept.of Information Engeneering of T.I.T */
#include
#define SB 0x1a
#define SH 0x01
#define ESC 0x1b
#define CNT 0 /* dummy node */
#define SUC -1 /* find kanji in(or out) */
#define FAI -2 /* cant found kanji in(or out) */
#define ROOT -3
struct tnode{
struct tnode *left;
struct tnode *right;
int val;
};
struct tnode success={& success,& success,SUC},failure={& failure,& failure,FAI};
struct tnode ki[]={
/*0*/ {& ki[1],& ki[7],ROOT},
/*1*/ {& ki[2],& ki[6],ESC},
/*2*/ {& ki[3],& ki[4],'$'},
/*3*/ {& success,& success,'@'},
/*4*/ {& ki[5],& success,CNT},
/*5*/ {& success,& success,'B'},
/*6*/ {& success,& success,'K'},
/*7*/ {& ki[8],& ki[10],CNT},
/*8*/ {& ki[9],& failure,SB},
/*9*/ {& success,& success,'p'},
/*10*/ {& success,& success,SH}
};
struct tnode kiodd={& ki[1],& ki[7],'^'};
struct tnode ko[]={
/*0*/ {& ko[1],& ko[10],ROOT},
/*1*/ {& ko[2],& ko[7],ESC},
/*2*/ {& ko[3],& ko[4],'('},
/*3*/ {& success,& success,'H'},
/*4*/ {& ko[5],& ko[6],CNT},
/*5*/ {& success,& success,'B'},
/*6*/ {& success,& success,'J'},
/*7*/ {& ko[8],& ko[9],CNT},
/*8*/ {& success,& success,'+'},
/*9*/ {& success,& success,'H'},
/*10*/ {& ko[11],& ko[13],CNT},
/*11*/ {& ko[12],& failure,SB},
/*12*/ {& success,& success,'q'},
/*13*/ {& success,& success,SH}
};
struct tnode koodd={& ko[1],& ko[10],'^'};
static int count=0,buf[10],overread;
main(argc,argv)
int argc;
char *argv[];
{
char termko[10],termki[10];
int k_mode=0;
if ((argc==2)& & (argv[1][0]=='-')) set_sw(argv[1][1],termki,termko);
else {
printf(" invalid switch\n" );
printf("usage:(1) kc -(terminal type)[!] [file2]\n");
printf("usage:(2) command | kc -(terminal type)[!] [> file2]\n");
printf(" (terminal type) is following\n\n" );
printf(" c: cpm type kin=^[$@ kout=^[(H\n" );
printf(" u: rtux type kin=^[$ kout=^[+\n" );
printf(" p: 98basic term P kin=^[K kout=^[H\n" );
printf(" i: 98basic term i kin=^Zp kout=^Zq\n" );
printf(" t: tsscc(old) kin=^A kout=^A\n" );
printf(" 7: jis(1978) kin=^[$@ kout=^(B\n" );
printf(" 8: jis(1983) kin=^[$B kout=^(B\n" );
printf(" \nif control characters like ESC SB SH... are transformed" );
printf(" into ^[ ^Z ^A you can use [!] option. but this option shares a little danger.\n" );
exit(0);
}
if (argv[1][2]=='!') oddversion();
/*--------------------- infinitive loop -------------------------------*/
for(;;)
if (k_mode) {
while(walktree(& ko[0])==FAI);
k_mode=0;
count=0;
scr_put(termko);
putchar(overread);
}
else {
while(walktree(& ki[0])==FAI);
k_mode=1;
count=0;
scr_put(termki);
putchar(overread);
}
}
oddversion()
{
ki[0].left= & kiodd;
ki[0].right= & failure;
ki[1].val='[';
ki[8].val='Z';
ki[10].val='A';
ko[0].left= & koodd;
ko[0].right= & failure;
ko[1].val='[';
ko[11].val='Z';
ko[13].val='A';
}
set_sw(sw,k_in,k_out)
char sw,k_in[],k_out[];
{
switch(sw){
case 'c':
k_in[0]=k_out[0]=ESC;
k_in[3]=k_out[3]=NULL;
k_in[1]='$';
k_in[2]='@';
k_out[1]='(';
k_out[2]='H';
break;
case 'u':
k_in[0]=k_out[0]=ESC;
k_in[2]=k_out[2]=NULL;
k_in[1]='$';
k_out[1]='+';
break;
case 'p':
k_in[0]=k_out[0]=ESC;
k_in[2]=k_out[2]=NULL;
k_in[1]='K';
k_out[1]='H';
break;
case 'i':
k_in[0]=k_out[0]=SB;
k_in[2]=k_out[2]=NULL;
k_in[1]='p';
k_out[1]='q';
break;
case 't':
k_in[0]=k_out[0]=SH;
k_in[1]=k_out[1]=NULL;
break;
case '8':
k_in[0]=k_out[0]=ESC;
k_in[3]=k_out[3]=NULL;
k_in[2]=k_out[2]='B';
k_in[1]='$';
k_out[1]='(';
break;
case '7':
k_in[0]=k_out[0]=ESC;
k_in[3]=k_out[3]=NULL;
k_in[1]='$';
k_in[2]='@';
k_out[1]='(';
k_out[2]='B';
break;
default:
printf(" undefined switch %c\n" ,sw);
exit(1);
}
}
scr_put(p)
char *p;
{
while(*p!=NULL)putchar(*p++);
}
wipeout()
{
int i;
for(i=0;i< count;i++) putchar(buf[i]);
count=0;
}
walktree(node,ch)
struct tnode *node;
int ch;
{
int v,a;
switch (v=(node-> val)){
case SUC:
overread=ch;
return SUC;
case FAI:
wipeout();
return FAI;
case CNT:
if ( walktree(node-> left,ch)==SUC ) return SUC;
else return walktree(node-> right,ch);
case ROOT:
if ((a=getchar())==EOF) exit(0);
buf[count++]=a;
if ( walktree(node-> left,a)==SUC ) return SUC;
else if (walktree(node-> right,a)==FAI) {wipeout();
return FAI;
}
else return SUC;
default:
if (ch==v){
if ((a=getchar())==EOF) {wipeout();
exit(0);
}
buf[count++]=a;
if ( walktree(node-> left,a)==SUC ) return SUC;
else if (walktree(node-> right,a)==FAI) {wipeout();
return FAI;
}
else return SUC;
}
else
return FAI;
}
}
Next
Continue