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