/*
 * WebDict
 *
 * Copyright (C) 1997  Mikkun. All rights reserved.
 *
 * japan.c
 *   EUC,JIS,SJIS text convert module.
 *
 * History:
 *   Ver1.00  1997/09/07  リリース版とする.
 *   Ver0.01  1997/09/05  Created by Mikkun.
 */
#ident  "@(#) WebDict: Ver1.00 1997/09/07 japan.c"
#ident  "@(#) WebDict: Copyright (C) 1997 Mikkun. All rights reserved."

/*
 * ヘッダファイルの宣言
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * マクロの宣言
 */
#define SIZE_BUFF 256;

/* 
 * 外部変数の宣言
 */
static unsigned char *out_buff = NULL;    /* コード変換後の文字列を格納する */
static int out_size = 0;    /* バッファサイズを指定する。 */
static int out_len  = 0;    /* 文字を格納する配列番号を指定する。 */


/*
 * １バイト出力バッファに保存する
 */
static void
out (char c)
{
    /* バッファサイズが足りなければ拡張する */
    if (out_len >= out_size - 1)
    {
        out_size += SIZE_BUFF;
        out_buff = realloc (out_buff, out_size);
        if (out_buff == NULL)
        {
            fprintf (stderr, "out: Can't perform malloc(%d).\n", out_size);
            exit (1);
        }
    }
 
    /* バッファに格納する */
    out_buff[out_len] = c;
    out_len++;
    out_buff[out_len] = '\0';

    return;
}

/*
 * EUCコードをJISコードに変換する
 */
unsigned char *
euc2jis (unsigned char *in)
{
    int in_jp = 0;

   /* 格納バッファを初期化する */
    out_buff = NULL;
    out_size = 0;
    out_len  = 0;

    /* 文字がある間繰り返す */
    while (*in)
    {
        if (*in < 0x80)
        {
	    if(*in == 0x0A)
		{
		    out(0x0D);
		    out(0x0A);
		}
            if (in_jp)
            {
                out (0x1b);	/* ASCIIモード（半角記号）のエスケープシーケンス  */
                out (0x28);
                out (0x4a);
                in_jp = 0;    /* 先頭文字がASCIIの時はエスケープシーケンスがつかない */
            }
            out (*in); in++;
        }
        else
        {
            if (!in_jp)
            {
                out (0x1b);	/* 漢字（全角文字）のエスケープシーケンス */
                out (0x24);
                out (0x40);
                in_jp = 1;
            }
            out (*in - 0x80); in++;
            out (*in - 0x80); in++;
        }
    }

    /* 漢字で終った時はASCIIモードに戻しておく */
    if (in_jp)
    {
        out (0x1b);	/* KANJI OUT */
        out (0x28);
        out (0x4a);
    }

    /* 終端 */
    out('\0');
    return (out_buff);
}

/*
 * JISコードをShift-JISコードに変換する
 */
unsigned char *
jis2sjis (unsigned char *in)
{
    unsigned char c1, c2;
    unsigned char row_offset, cell_offset;

   /* 格納バッファを初期化する */
    out_buff = NULL;
    out_size = 0;
    out_len  = 0;

    /* 文字がある間繰り返す */
    while (*in)
    {
        if (*in == 0x1b)	/* 漢字か否か（最初は漢字で始まっているか） */
        {
            in += 3;
            while (*in != 0x1b)
            {
                c1 = *in++;
                c2 = *in++;
                row_offset  = c1 < 0x5f ? 0x70 : 0xb0;
                cell_offset = c1 % 2 ? (c2 > 0x5f ? 0x20 : 0x1f) : 0x7e;
                out (((int)(c1 + 1) >> 1) + row_offset);
                out (c2 + cell_offset);
            }
            in += 3;
        }
        else			/* ASCII文字列 */
        {
            out (*in); in++;
        }
    }

    /* 終端 */
    out ('\0');
    return (out_buff);
}

/*
 * eof
 */

