/*
 *  codeconv.c -- 文字コードの変換
 *
 *  revision history
 *	0.0: 雑多なコードから
 *      1.0: Apr. 15, 2018 by Dai ISHIJIMA (for lccvt)
 */

#include <stdio.h>
#include "codeconv.h"


/* シフトJIS -> JIS 変換 */
int sjistojis(int sjis)
{
    int x, y;
    int hi, lo;

    hi = hibyte(sjis);
    lo = lobyte(sjis);
    if (hi >= 0xe0) {
	hi -= (0xe0 - 0xa0);
    }
    if (lo > 0x9e) {
	x = (hi - 0x80) * 2 + 0x20;
	y = lo + 0x20 - 0x9e;
    }
    else {
	x = (hi - 0x80) * 2 + 0x20 - 1;
	if (lo > 0x7f) {
	    --lo;
	}
	y = lo - 0x1f;
    }
    return(hilo(x, y));
}


int euctojis(int euc)
{
    return(euc & 0x7f7f);	/* 超手抜き */
}


int isjis(int jis)
{
    int hi, lo;

    hi = hibyte(jis);
    lo = lobyte(jis);
    if (((0x21 <= hi) && (hi <= 0x7e)) &&  ((0x21 <= lo) && (lo <= 0x7e))) {
	/* 超手抜き */
	return(YES);
    }
    return(NO);
}


int u16toutf8(int u16, int *len)
{
    int lo, mid, hi;
    
    if (u16 <= 0x7f) {
	if (len != NULL) {
	    *len = 1;
	}
	return(u16);
    }
    else if (u16 <= 0x7ff) {
	/* 110yyyxx 10xxxxxx */
	hi = u16 & 0x07c0;
	lo = u16 & 0x003f;
	if (len != NULL) {
	    *len = 2;
	}
	return(
	       ((hi << 2) | 0xc000) | (0x80 | lo)
	       );
    }
    else if (u16 <= 0xffff) {
	lo =  u16 & 0x003f;
	mid = u16 & 0x0fc0;
	hi =  u16 & 0xf000;
	if (len != NULL) {
	    *len = 3;
	}
	return(
	       ((hi << 4) | 0xe00000) | ((mid << 2) | 0x8000) | (lo | 0x0080)
	       );
    }
    if (len != NULL) {
	*len = 0;
    }
    return(-1);
}
	

#ifdef MAIN
int main()
{
    int ch1, ch2;
    int jis, euc, u16, utf8, len;

    tblinit();
    while ((ch1 = getchar()) > 0) {
	if (ch1 > 0x80) {
	    ch2 = getchar();
	    euc = (ch1 << 8) | ch2;
	    jis = euctojis(euc);
	    u16 = jistou16[jis];
	    utf8 = u16toutf8(u16, &len);
	    printf("%04x %04x %04x %06x\n", euc, jis, u16, utf8);
	    if (utf8 > 0xffff) {
		putchar((utf8 & 0x00ffffff) >> 16);
	    }
	    if (utf8 > 0x00ff) {
		putchar((utf8 & 0x0000ffff) >> 8);
	    }
	    putchar(utf8 & 0x00ff);
	}
	else {
	    putchar(ch1);
	}
    }
    return(0);
}

/* Local Variables: */
/* compile-command:"gcc -DMAIN -g -Wall -o codeconv codeconv.c tbl.c" */
/* End: */

#endif
