• R/O
  • HTTP
  • SSH
  • HTTPS

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

oga's tools


File Info

Révision 2b80abcdeb00aad07aa265bd434df3975aadbb9a
Taille 6,351 octets
l'heure 2024-12-10 04:54:07
Auteur hyperoga
Message de Log

add color() func

Content

/*
 *  subdecode : SubjectのISO-2022をデコードする
 *
 *      V1.01 98/11/19  ShiftINがある場合はShiftINをつけない
 *
 *  CFLAG : INTEL ... Intel byte order
 *
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define ISO2022	"=?ISO-2022-JP?B?"
#define iso2022	"=?iso-2022-jp?B?"

char kin[]  ={0x1b,0x24,0x42,0};      /* kanji mode in  */
char kout[] ={0x1b,0x28,0x42,0};      /* kanji mode out */

int vf = 0;

unsigned char tr[256]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,62, 0, 0, 0,63,
                       52,53,54,55,56,57,58,59,60,61, 0, 0, 0, 0, 0, 0,
                        0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
                       15,16,17,18,19,20,21,22,23,24,25, 0, 0, 0, 0, 0,
                        0,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
                       41,42,43,44,45,46,47,48,49,50,51, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

/* すでにJISのShift IN ESCシーケンスが存在するか? */
char *IsEscExist(buf)
char *buf;
{
    char SIN[16];
    sprintf(SIN, "%c%c%c",27,'$','B');
    return strstr(buf,SIN);
}

/* 文字列がJISか? */
int IsJIS(buf)
char *buf;
{
    int i;
    int st = 1;

    for (i = 0; i<strlen(buf); i++) {
	if (buf[i] & 0x80) {
	    st = 0;	/* SJIS/EUCを含む */
	    break;
	}
    }
    if (vf) printf("%s:[%s]\n", st?"JIS ":"SJIS", buf);
    return st;
}

void BinDisp(num,bit)
{
	unsigned int mask;
	int i;

	printf("[%3d]:",num);
	mask = (1 << (bit-1));
	for (i = 0; i<bit; i++) {
	    if (num & mask) {
		printf("1");
	    } else {
		printf("0");
	    }
	    mask >>= 1;
	}
	printf("\n");
}

void DecodeBase64(istr,ostr)
unsigned char *istr, *ostr;
{
	int wk4;
	int i;
	unsigned char *wk4s = (unsigned char *)&wk4;
	unsigned char *osv = ostr;

	if (vf) printf("Decode64 IN [%s]\n", istr);

	while (*istr != '\0' && *istr != '\n' ) {
	    wk4 = 0;
	    for (i = 0; i<4; i++) {
	        wk4 <<= 6;
	        if (*istr == '\0' || *istr == '\n') {
	            break;
	        }
#ifdef DEBUG
	        printf("[%c]",*istr);
	        BinDisp(tr[*istr],8);
#endif
	        wk4 |= tr[*istr];
	        ++istr;
	    }
#ifdef DEBUG
	    BinDisp(wk4,24);
#endif
#ifdef INTEL
	    ostr[0] = wk4s[2];
	    ostr[1] = wk4s[1];
	    ostr[2] = wk4s[0];
#else
	    memcpy(ostr,&wk4s[1],3);
#endif
	    ostr += 3;
	    if (*istr == '?' && *(istr+1) == '=') {
	        /* "?=" is terminate */
	        *istr += 2;
	        continue;
	    }
	}
	*ostr = '\0';
	if (vf) printf("Decode64 OUT[%s]\n", osv);

}

/*
 *   ISO2022...が含まれていたら、JISコードに変換する
 *
 *   IN   in : 	"...=?ISO-2022-JP?B?<str>?="
 *   OUT  out: 	<SI>JISコード<SO>
 *        ret: 	char *outを返す
 *
 */
char *chg_iso2022(in, out)
char *in,*out;
{
    char wk[4096];
    int  pt = 0;
    int  i;

    if (vf) printf("IN [%s]\n",in);
    if (strstr(in,ISO2022) || strstr(in, iso2022)) {
	i = 0;
	while (strncasecmp(&in[i],ISO2022,strlen(ISO2022))) {
	    out[pt++] = in[i++];
	}
	i += strlen(ISO2022);
	/* printf("decode start = [%s]\n",&in[i]); */
	DecodeBase64(&in[i],wk);
	if (IsEscExist(wk)) {
	    sprintf(&out[pt],"%s",wk);
	} else {
	    sprintf(&out[pt],"%c%c%c%s%c%c%c",27,'$','B',wk,27,'(','B');
	}
    } else {
        strcpy(out,in);
    }
    if (vf) printf("OUT[%s]\n",out);
    return out;
}

/*
 *  j2s(in,out);
 *
 *  IN  : in  JISコード(2バイト)
 *  OUT : out SJISコード(2バイト)
 *
 */
void j2s(unsigned char *in, unsigned char *out)
{
    if (in[0] % 2) {
        out[0] = in[0]/2 + 0x71;
        out[1] = in[1] + 0x1f;
        if (out[1] > 0x7f) {  /* or >= */
            out[1]++;
        }
    } else {
        out[0] = in[0]/2 + 0x70;
        out[1] = in[1] + 0x7e;
    }
#if 0
    printf("IN 0x%04x / OUT 0x%04x\n",htons(*(unsigned short *)in),
    				      htons(*(unsigned short *)out));
#endif
}


/*
 *   unsigned char *jis2sjis((u_char *)buf, (u_char *)obuf, int* sisof)
 *
 *   kanji IN/OUT付き
 *
 *   IN  : buf   変換元文字列(SJIS)
 *         siso  現在のSI/SOの状態     1:SI 0:SO
 *   OUT : obuf  変換後文字列(JIS)
 *         ret   obufのアドレス
 */

unsigned char *jis2sjis(buf,obuf,siso)
unsigned char *buf, *obuf;
int *siso;
{
    int ip=0, op=0;
    if (vf) printf("IN =[%s]\n",buf);
    for (ip = 0; ip<strlen(buf); ) {
        if (*siso) {
            /* Under Shift In */
            if (!memcmp(&buf[ip],kin,3)) {
                ip += 3;
                continue;
            }
            if (!memcmp(&buf[ip],kout,3)) {
                /* Shift Out */
                if (vf != vf) printf("Shift OUT!!\n");
                *siso = 0;
                ip += 3;
            } else {
                j2s(&buf[ip],&obuf[op]);
                ip += 2;
                op += 2;
            }
        } else {
            /* Under Shift Out */
            if (!memcmp(&buf[ip],kout,3)) {
                ip += 3;
                continue;
            }
            if (!memcmp(&buf[ip],kin,3)) {
                /* Shift In */
                if (vf != vf) printf("Shift IN!!\n");
                *siso = 1;
                ip += 3;
            } else {
                obuf[op] = buf[ip]; 
                ++ip;
                ++op;
            }
        }
    }
    obuf[op] = '\0';
    if (vf) printf("OUT=[%s]\n",obuf);
    return obuf;
}

main(a,b)
int a;
char *b[];
{

	FILE	*fp;
	int	i, siso = 0;
	char	buf[2048], wk[2048];

	if (a == 1) {
	    fp = stdin;
	} else {
	    if (!(fp = fopen(b[1],"r"))) {
		perror("fopen");
		exit(1);
	    }
	}

        if (a > 2 && !strcmp(b[2], "-v")) {
	    vf = 1;
	}

	while (fgets(buf,sizeof(buf),fp)) {
#if 0
	    printf("%s\n",chg_iso2022(buf,wk));
#else
	    chg_iso2022(buf,wk);
	    printf("%s\n",jis2sjis(wk,buf,&siso));
#endif
	}
}