Blame src/gdkanji.c

Packit ed3af9
/* gdkanji.c (Kanji code converter)                            */
Packit ed3af9
/*                 written by Masahito Yamaga (ma@yama-ga.com) */
Packit ed3af9
Packit ed3af9
#ifdef HAVE_CONFIG_H
Packit ed3af9
#include "config.h"
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#include <stdio.h>
Packit ed3af9
#include <stdlib.h>
Packit ed3af9
#include <string.h>
Packit ed3af9
#include "gd.h"
Packit ed3af9
#include "gdhelpers.h"
Packit ed3af9
#include "gd_errors.h"
Packit ed3af9
Packit ed3af9
#ifdef HAVE_ERRNO_H
Packit ed3af9
#include <errno.h>
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#include <stdarg.h>
Packit ed3af9
#if defined(HAVE_ICONV_H)
Packit ed3af9
#include <iconv.h>
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#ifndef HAVE_ICONV_T_DEF
Packit ed3af9
typedef void *iconv_t;
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#ifndef HAVE_ICONV
Packit ed3af9
#define ICONV_CONST /**/
Packit ed3af9
iconv_t iconv_open (const char *, const char *);
Packit ed3af9
size_t iconv (iconv_t, ICONV_CONST char **, size_t *, char **, size_t *);
Packit ed3af9
int iconv_close (iconv_t);
Packit ed3af9
Packit ed3af9
iconv_t
Packit ed3af9
iconv_open (const char *tocode, const char *fromcode)
Packit ed3af9
{
Packit ed3af9
	(void)tocode;
Packit ed3af9
	(void)fromcode;
Packit ed3af9
	return (iconv_t) (-1);
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
size_t
Packit ed3af9
iconv (iconv_t cd, ICONV_CONST char **inbuf, size_t * inbytesleft,
Packit ed3af9
       char **outbuf, size_t * outbytesleft)
Packit ed3af9
{
Packit ed3af9
	(void)cd;
Packit ed3af9
	(void)inbuf;
Packit ed3af9
	(void)inbytesleft;
Packit ed3af9
	(void)outbuf;
Packit ed3af9
	(void)outbytesleft;
Packit ed3af9
	return 0;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
int
Packit ed3af9
iconv_close (iconv_t cd)
Packit ed3af9
{
Packit ed3af9
	(void)cd;
Packit ed3af9
	return 0;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
#endif /* !HAVE_ICONV */
Packit ed3af9
Packit ed3af9
#define LIBNAME "any2eucjp()"
Packit ed3af9
Packit ed3af9
#if defined(__MSC__) || defined(__BORLANDC__) || defined(__TURBOC__) || defined(_Windows) || defined(MSDOS)
Packit ed3af9
#ifndef SJISPRE
Packit ed3af9
#define SJISPRE 1
Packit ed3af9
#endif
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#ifdef TRUE
Packit ed3af9
#undef TRUE
Packit ed3af9
#endif
Packit ed3af9
#ifdef FALSE
Packit ed3af9
#undef FALSE
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
#define TRUE  1
Packit ed3af9
#define FALSE 0
Packit ed3af9
Packit ed3af9
#define NEW 1
Packit ed3af9
#define OLD 2
Packit ed3af9
#define ESCI 3
Packit ed3af9
#define NEC 4
Packit ed3af9
#define EUC 5
Packit ed3af9
#define SJIS 6
Packit ed3af9
#define EUCORSJIS 7
Packit ed3af9
#define ASCII 8
Packit ed3af9
Packit ed3af9
#define NEWJISSTR "JIS7"
Packit ed3af9
#define OLDJISSTR "jis"
Packit ed3af9
#define EUCSTR    "eucJP"
Packit ed3af9
#define SJISSTR   "SJIS"
Packit ed3af9
Packit ed3af9
#define ESC 27
Packit ed3af9
#define SS2 142
Packit ed3af9
Packit ed3af9
/* DetectKanjiCode() derived from DetectCodeType() by Ken Lunde. */
Packit ed3af9
Packit ed3af9
static int
Packit ed3af9
DetectKanjiCode (unsigned char *str)
Packit ed3af9
{
Packit ed3af9
	static int whatcode = ASCII;
Packit ed3af9
	int oldcode = ASCII;
Packit ed3af9
	int c, i;
Packit ed3af9
	char *lang = NULL;
Packit ed3af9
Packit ed3af9
	c = '\1';
Packit ed3af9
	i = 0;
Packit ed3af9
Packit ed3af9
	if (whatcode != EUCORSJIS && whatcode != ASCII) {
Packit ed3af9
		oldcode = whatcode;
Packit ed3af9
		whatcode = ASCII;
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	while ((whatcode == EUCORSJIS || whatcode == ASCII) && c != '\0') {
Packit ed3af9
		if ((c = str[i++]) != '\0') {
Packit ed3af9
			if (c == ESC) {
Packit ed3af9
				c = str[i++];
Packit ed3af9
				if (c == '$') {
Packit ed3af9
					c = str[i++];
Packit ed3af9
					if (c == 'B')
Packit ed3af9
						whatcode = NEW;
Packit ed3af9
					else if (c == '@')
Packit ed3af9
						whatcode = OLD;
Packit ed3af9
				} else if (c == '(') {
Packit ed3af9
					c = str[i++];
Packit ed3af9
					if (c == 'I')
Packit ed3af9
						whatcode = ESCI;
Packit ed3af9
				} else if (c == 'K')
Packit ed3af9
					whatcode = NEC;
Packit ed3af9
			} else if ((c >= 129 && c <= 141) || (c >= 143 && c <= 159))
Packit ed3af9
				whatcode = SJIS;
Packit ed3af9
			else if (c == SS2) {
Packit ed3af9
				c = str[i++];
Packit ed3af9
				if ((c >= 64 && c <= 126) || (c >= 128 && c <= 160)
Packit ed3af9
				        || (c >= 224 && c <= 252))
Packit ed3af9
					whatcode = SJIS;
Packit ed3af9
				else if (c >= 161 && c <= 223)
Packit ed3af9
					whatcode = EUCORSJIS;
Packit ed3af9
			} else if (c >= 161 && c <= 223) {
Packit ed3af9
				c = str[i++];
Packit ed3af9
				if (c >= 240 && c <= 254)
Packit ed3af9
					whatcode = EUC;
Packit ed3af9
				else if (c >= 161 && c <= 223)
Packit ed3af9
					whatcode = EUCORSJIS;
Packit ed3af9
				else if (c >= 224 && c <= 239) {
Packit ed3af9
					whatcode = EUCORSJIS;
Packit ed3af9
					while (c >= 64 && c != '\0' && whatcode == EUCORSJIS) {
Packit ed3af9
						if (c >= 129) {
Packit ed3af9
							if (c <= 141 || (c >= 143 && c <= 159))
Packit ed3af9
								whatcode = SJIS;
Packit ed3af9
							else if (c >= 253 && c <= 254)
Packit ed3af9
								whatcode = EUC;
Packit ed3af9
						}
Packit ed3af9
						c = str[i++];
Packit ed3af9
					}
Packit ed3af9
				} else if (c <= 159)
Packit ed3af9
					whatcode = SJIS;
Packit ed3af9
			} else if (c >= 240 && c <= 254)
Packit ed3af9
				whatcode = EUC;
Packit ed3af9
			else if (c >= 224 && c <= 239) {
Packit ed3af9
				c = str[i++];
Packit ed3af9
				if ((c >= 64 && c <= 126) || (c >= 128 && c <= 160))
Packit ed3af9
					whatcode = SJIS;
Packit ed3af9
				else if (c >= 253 && c <= 254)
Packit ed3af9
					whatcode = EUC;
Packit ed3af9
				else if (c >= 161 && c <= 252)
Packit ed3af9
					whatcode = EUCORSJIS;
Packit ed3af9
			}
Packit ed3af9
		}
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
#ifdef DEBUG
Packit ed3af9
	if (whatcode == ASCII)
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code not included.");
Packit ed3af9
	else if (whatcode == EUCORSJIS)
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code not detected.");
Packit ed3af9
	else
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code detected at %d byte.", i);
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
	if (whatcode == EUCORSJIS && oldcode != ASCII)
Packit ed3af9
		whatcode = oldcode;
Packit ed3af9
Packit ed3af9
	if (whatcode == EUCORSJIS) {
Packit ed3af9
		if (getenv ("LC_ALL"))
Packit ed3af9
			lang = getenv ("LC_ALL");
Packit ed3af9
		else if (getenv ("LC_CTYPE"))
Packit ed3af9
			lang = getenv ("LC_CTYPE");
Packit ed3af9
		else if (getenv ("LANG"))
Packit ed3af9
			lang = getenv ("LANG");
Packit ed3af9
Packit ed3af9
		if (lang) {
Packit ed3af9
			if (strcmp (lang, "ja_JP.SJIS") == 0 ||
Packit ed3af9
#ifdef hpux
Packit ed3af9
			        strcmp (lang, "japanese") == 0 ||
Packit ed3af9
#endif
Packit ed3af9
			        strcmp (lang, "ja_JP.mscode") == 0 ||
Packit ed3af9
			        strcmp (lang, "ja_JP.PCK") == 0)
Packit ed3af9
				whatcode = SJIS;
Packit ed3af9
			else if (strncmp (lang, "ja", 2) == 0)
Packit ed3af9
#ifdef SJISPRE
Packit ed3af9
				whatcode = SJIS;
Packit ed3af9
#else
Packit ed3af9
				whatcode = EUC;
Packit ed3af9
#endif
Packit ed3af9
		}
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (whatcode == EUCORSJIS)
Packit ed3af9
#ifdef SJISPRE
Packit ed3af9
		whatcode = SJIS;
Packit ed3af9
#else
Packit ed3af9
		whatcode = EUC;
Packit ed3af9
#endif
Packit ed3af9
Packit ed3af9
	return whatcode;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
/* SJIStoJIS() is sjis2jis() by Ken Lunde. */
Packit ed3af9
Packit ed3af9
static void
Packit ed3af9
SJIStoJIS (int *p1, int *p2)
Packit ed3af9
{
Packit ed3af9
	register unsigned char c1 = *p1;
Packit ed3af9
	register unsigned char c2 = *p2;
Packit ed3af9
	register int adjust = c2 < 159;
Packit ed3af9
	register int rowOffset = c1 < 160 ? 112 : 176;
Packit ed3af9
	register int cellOffset = adjust ? (31 + (c2 > 127)) : 126;
Packit ed3af9
Packit ed3af9
	*p1 = ((c1 - rowOffset) << 1) - adjust;
Packit ed3af9
	*p2 -= cellOffset;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
/* han2zen() was derived from han2zen() written by Ken Lunde. */
Packit ed3af9
Packit ed3af9
#define IS_DAKU(c) ((c >= 182 && c <= 196) || (c >= 202 && c <= 206) || (c == 179))
Packit ed3af9
#define IS_HANDAKU(c) (c >= 202 && c <= 206)
Packit ed3af9
Packit ed3af9
static void
Packit ed3af9
han2zen (int *p1, int *p2)
Packit ed3af9
{
Packit ed3af9
	int c = *p1;
Packit ed3af9
	int daku = FALSE;
Packit ed3af9
	int handaku = FALSE;
Packit ed3af9
	int mtable[][2] = {
Packit ed3af9
		{129, 66},
Packit ed3af9
		{129, 117},
Packit ed3af9
		{129, 118},
Packit ed3af9
		{129, 65},
Packit ed3af9
		{129, 69},
Packit ed3af9
		{131, 146},
Packit ed3af9
		{131, 64},
Packit ed3af9
		{131, 66},
Packit ed3af9
		{131, 68},
Packit ed3af9
		{131, 70},
Packit ed3af9
		{131, 72},
Packit ed3af9
		{131, 131},
Packit ed3af9
		{131, 133},
Packit ed3af9
		{131, 135},
Packit ed3af9
		{131, 98},
Packit ed3af9
		{129, 91},
Packit ed3af9
		{131, 65},
Packit ed3af9
		{131, 67},
Packit ed3af9
		{131, 69},
Packit ed3af9
		{131, 71},
Packit ed3af9
		{131, 73},
Packit ed3af9
		{131, 74},
Packit ed3af9
		{131, 76},
Packit ed3af9
		{131, 78},
Packit ed3af9
		{131, 80},
Packit ed3af9
		{131, 82},
Packit ed3af9
		{131, 84},
Packit ed3af9
		{131, 86},
Packit ed3af9
		{131, 88},
Packit ed3af9
		{131, 90},
Packit ed3af9
		{131, 92},
Packit ed3af9
		{131, 94},
Packit ed3af9
		{131, 96},
Packit ed3af9
		{131, 99},
Packit ed3af9
		{131, 101},
Packit ed3af9
		{131, 103},
Packit ed3af9
		{131, 105},
Packit ed3af9
		{131, 106},
Packit ed3af9
		{131, 107},
Packit ed3af9
		{131, 108},
Packit ed3af9
		{131, 109},
Packit ed3af9
		{131, 110},
Packit ed3af9
		{131, 113},
Packit ed3af9
		{131, 116},
Packit ed3af9
		{131, 119},
Packit ed3af9
		{131, 122},
Packit ed3af9
		{131, 125},
Packit ed3af9
		{131, 126},
Packit ed3af9
		{131, 128},
Packit ed3af9
		{131, 129},
Packit ed3af9
		{131, 130},
Packit ed3af9
		{131, 132},
Packit ed3af9
		{131, 134},
Packit ed3af9
		{131, 136},
Packit ed3af9
		{131, 137},
Packit ed3af9
		{131, 138},
Packit ed3af9
		{131, 139},
Packit ed3af9
		{131, 140},
Packit ed3af9
		{131, 141},
Packit ed3af9
		{131, 143},
Packit ed3af9
		{131, 147},
Packit ed3af9
		{129, 74},
Packit ed3af9
		{129, 75}
Packit ed3af9
	};
Packit ed3af9
Packit ed3af9
	if (*p2 == 222 && IS_DAKU (*p1))
Packit ed3af9
		daku = TRUE;		/* Daku-ten */
Packit ed3af9
	else if (*p2 == 223 && IS_HANDAKU (*p1))
Packit ed3af9
		handaku = TRUE;		/* Han-daku-ten */
Packit ed3af9
Packit ed3af9
	*p1 = mtable[c - 161][0];
Packit ed3af9
	*p2 = mtable[c - 161][1];
Packit ed3af9
Packit ed3af9
	if (daku) {
Packit ed3af9
		if ((*p2 >= 74 && *p2 <= 103) || (*p2 >= 110 && *p2 <= 122))
Packit ed3af9
			(*p2)++;
Packit ed3af9
		else if (*p2 == 131 || *p2 == 69)
Packit ed3af9
			*p2 = 148;
Packit ed3af9
	} else if (handaku && *p2 >= 110 && *p2 <= 122)
Packit ed3af9
		(*p2) += 2;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
/* Recast strcpy to handle unsigned chars used below. */
Packit ed3af9
Packit ed3af9
#define ustrcpy(A,B) (strcpy((char*)(A),(const char*)(B)))
Packit ed3af9
Packit ed3af9
#define ustrncpy(A,B, maxsize) (strncpy((char*)(A),(const char*)(B), maxsize))
Packit ed3af9
Packit ed3af9
static void
Packit ed3af9
do_convert (unsigned char **to_p, unsigned char **from_p, const char *code)
Packit ed3af9
{
Packit ed3af9
	unsigned char *to = *to_p;
Packit ed3af9
	unsigned char *from = *from_p;
Packit ed3af9
#ifdef HAVE_ICONV
Packit ed3af9
	iconv_t cd;
Packit ed3af9
	size_t from_len, to_len;
Packit ed3af9
Packit ed3af9
	if ((cd = iconv_open (EUCSTR, code)) == (iconv_t) - 1) {
Packit ed3af9
		gd_error ("iconv_open() error");
Packit ed3af9
#ifdef HAVE_ERRNO_H
Packit ed3af9
		if (errno == EINVAL)
Packit ed3af9
			gd_error ("invalid code specification: \"%s\" or \"%s\"", EUCSTR, code);
Packit ed3af9
#endif
Packit ed3af9
		ustrcpy (to, from);
Packit ed3af9
		return;
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	from_len = strlen ((const char *)from) + 1;
Packit ed3af9
	to_len = BUFSIZ;
Packit ed3af9
Packit ed3af9
	if ((int) (iconv (cd, (char **)from_p, &from_len, (char **)to_p, &to_len))
Packit ed3af9
	        == -1) {
Packit ed3af9
#ifdef HAVE_ERRNO_H
Packit ed3af9
		if (errno == EINVAL)
Packit ed3af9
			gd_error ("invalid end of input string");
Packit ed3af9
		else if (errno == EILSEQ)
Packit ed3af9
			gd_error ("invalid code in input string");
Packit ed3af9
		else if (errno == E2BIG)
Packit ed3af9
			gd_error ("output buffer overflow at do_convert()");
Packit ed3af9
		else
Packit ed3af9
#endif
Packit ed3af9
			gd_error ("something happen");
Packit ed3af9
		ustrcpy (to, from);
Packit ed3af9
		return;
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (iconv_close (cd) != 0) {
Packit ed3af9
		gd_error ("iconv_close() error");
Packit ed3af9
	}
Packit ed3af9
#else
Packit ed3af9
	int p1, p2, i, j;
Packit ed3af9
	int jisx0208 = FALSE;
Packit ed3af9
	int hankaku = FALSE;
Packit ed3af9
Packit ed3af9
	j = 0;
Packit ed3af9
	if (strcmp (code, NEWJISSTR) == 0 || strcmp (code, OLDJISSTR) == 0) {
Packit ed3af9
		for (i = 0; from[i] != '\0' && j < BUFSIZ; i++) {
Packit ed3af9
			if (from[i] == ESC) {
Packit ed3af9
				i++;
Packit ed3af9
				if (from[i] == '$') {
Packit ed3af9
					jisx0208 = TRUE;
Packit ed3af9
					hankaku = FALSE;
Packit ed3af9
					i++;
Packit ed3af9
				} else if (from[i] == '(') {
Packit ed3af9
					jisx0208 = FALSE;
Packit ed3af9
					i++;
Packit ed3af9
					if (from[i] == 'I')	/* Hankaku Kana */
Packit ed3af9
						hankaku = TRUE;
Packit ed3af9
					else
Packit ed3af9
						hankaku = FALSE;
Packit ed3af9
				}
Packit ed3af9
			} else {
Packit ed3af9
				if (jisx0208)
Packit ed3af9
					to[j++] = from[i] + 128;
Packit ed3af9
				else if (hankaku) {
Packit ed3af9
					to[j++] = SS2;
Packit ed3af9
					to[j++] = from[i] + 128;
Packit ed3af9
				} else
Packit ed3af9
					to[j++] = from[i];
Packit ed3af9
			}
Packit ed3af9
		}
Packit ed3af9
	} else if (strcmp (code, SJISSTR) == 0) {
Packit ed3af9
		for (i = 0; from[i] != '\0' && j < BUFSIZ; i++) {
Packit ed3af9
			p1 = from[i];
Packit ed3af9
			if (p1 < 127)
Packit ed3af9
				to[j++] = p1;
Packit ed3af9
			else if ((p1 >= 161) && (p1 <= 223)) {
Packit ed3af9
				/* Hankaku Kana */
Packit ed3af9
				to[j++] = SS2;
Packit ed3af9
				to[j++] = p1;
Packit ed3af9
			} else {
Packit ed3af9
				p2 = from[++i];
Packit ed3af9
				SJIStoJIS (&p1, &p2;;
Packit ed3af9
				to[j++] = p1 + 128;
Packit ed3af9
				to[j++] = p2 + 128;
Packit ed3af9
			}
Packit ed3af9
		}
Packit ed3af9
	} else {
Packit ed3af9
		gd_error ("invalid code specification: \"%s\"", code);
Packit ed3af9
		return;
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (j >= BUFSIZ) {
Packit ed3af9
		gd_error ("output buffer overflow at do_convert()");
Packit ed3af9
		ustrcpy (to, from);
Packit ed3af9
	} else
Packit ed3af9
		to[j] = '\0';
Packit ed3af9
#endif /* HAVE_ICONV */
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
static int
Packit ed3af9
do_check_and_conv (unsigned char *to, unsigned char *from)
Packit ed3af9
{
Packit ed3af9
	static unsigned char tmp[BUFSIZ];
Packit ed3af9
	unsigned char *tmp_p = &tmp[0];
Packit ed3af9
	int p1, p2, i, j;
Packit ed3af9
	int kanji = TRUE;
Packit ed3af9
	int copy_string = FALSE;
Packit ed3af9
Packit ed3af9
	switch (DetectKanjiCode (from)) {
Packit ed3af9
	case NEW:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code is New JIS.");
Packit ed3af9
		do_convert (&tmp_p, &from, NEWJISSTR);
Packit ed3af9
		break;
Packit ed3af9
	case OLD:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code is Old JIS.");
Packit ed3af9
		do_convert (&tmp_p, &from, OLDJISSTR);
Packit ed3af9
		break;
Packit ed3af9
	case ESCI:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "This string includes Hankaku-Kana (jisx0201) escape sequence [ESC] + ( + I.");
Packit ed3af9
		do_convert (&tmp_p, &from, NEWJISSTR);
Packit ed3af9
		break;
Packit ed3af9
	case NEC:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code is NEC Kanji.");
Packit ed3af9
		gd_error("cannot convert NEC Kanji.");
Packit ed3af9
		copy_string = TRUE;
Packit ed3af9
		kanji = FALSE;
Packit ed3af9
		break;
Packit ed3af9
	case EUC:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code is EUC.");
Packit ed3af9
		copy_string = TRUE;
Packit ed3af9
		break;
Packit ed3af9
	case SJIS:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code is SJIS.");
Packit ed3af9
		do_convert (&tmp_p, &from, SJISSTR);
Packit ed3af9
		break;
Packit ed3af9
	case EUCORSJIS:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "Kanji code is EUC or SJIS.");
Packit ed3af9
		copy_string = TRUE;
Packit ed3af9
		kanji = FALSE;
Packit ed3af9
		break;
Packit ed3af9
	case ASCII:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "This is ASCII string.");
Packit ed3af9
		copy_string = TRUE;
Packit ed3af9
		kanji = FALSE;
Packit ed3af9
		break;
Packit ed3af9
	default:
Packit ed3af9
		gd_error_ex(GD_DEBUG, "This string includes unknown code.");
Packit ed3af9
		copy_string = TRUE;
Packit ed3af9
		kanji = FALSE;
Packit ed3af9
		break;
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	if (copy_string) {
Packit ed3af9
		ustrncpy (tmp, from, BUFSIZ);
Packit ed3af9
		tmp[BUFSIZ-1] = '\0';
Packit ed3af9
	}
Packit ed3af9
Packit ed3af9
	/* Hankaku Kana ---> Zenkaku Kana */
Packit ed3af9
	if (kanji) {
Packit ed3af9
		j = 0;
Packit ed3af9
		for (i = 0; tmp[i] != '\0' && j < BUFSIZ; i++) {
Packit ed3af9
			if (tmp[i] == SS2) {
Packit ed3af9
				p1 = tmp[++i];
Packit ed3af9
				if (tmp[i + 1] == SS2) {
Packit ed3af9
					p2 = tmp[i + 2];
Packit ed3af9
					if (p2 == 222 || p2 == 223)
Packit ed3af9
						i += 2;
Packit ed3af9
					else
Packit ed3af9
						p2 = 0;
Packit ed3af9
				} else
Packit ed3af9
					p2 = 0;
Packit ed3af9
				han2zen (&p1, &p2;;
Packit ed3af9
				SJIStoJIS (&p1, &p2;;
Packit ed3af9
				to[j++] = p1 + 128;
Packit ed3af9
				to[j++] = p2 + 128;
Packit ed3af9
			} else
Packit ed3af9
				to[j++] = tmp[i];
Packit ed3af9
		}
Packit ed3af9
Packit ed3af9
		if (j >= BUFSIZ) {
Packit ed3af9
			gd_error("output buffer overflow at Hankaku --> Zenkaku");
Packit ed3af9
			ustrcpy (to, tmp);
Packit ed3af9
		} else
Packit ed3af9
			to[j] = '\0';
Packit ed3af9
	} else
Packit ed3af9
		ustrcpy (to, tmp);
Packit ed3af9
Packit ed3af9
	return kanji;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
int
Packit ed3af9
any2eucjp (unsigned char *dest, unsigned char *src, unsigned int dest_max)
Packit ed3af9
{
Packit ed3af9
	static unsigned char tmp_dest[BUFSIZ];
Packit ed3af9
	int ret;
Packit ed3af9
Packit ed3af9
	if (strlen ((const char *) src) >= BUFSIZ) {
Packit ed3af9
		gd_error("input string too large");
Packit ed3af9
		return -1;
Packit ed3af9
	}
Packit ed3af9
	if (dest_max > BUFSIZ) {
Packit ed3af9
		gd_error
Packit ed3af9
		("invalid maximum size of destination\nit should be less than %d.",
Packit ed3af9
		 BUFSIZ);
Packit ed3af9
		return -1;
Packit ed3af9
	}
Packit ed3af9
	ret = do_check_and_conv (tmp_dest, src);
Packit ed3af9
	if (strlen ((const char *) tmp_dest) >= dest_max) {
Packit ed3af9
		gd_error("output buffer overflow");
Packit ed3af9
		ustrcpy (dest, src);
Packit ed3af9
		return -1;
Packit ed3af9
	}
Packit ed3af9
	ustrcpy (dest, tmp_dest);
Packit ed3af9
	return ret;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
#if 0
Packit ed3af9
unsigned int
Packit ed3af9
strwidth (unsigned char *s)
Packit ed3af9
{
Packit ed3af9
	unsigned char *t;
Packit ed3af9
	unsigned int i;
Packit ed3af9
Packit ed3af9
	t = (unsigned char *) gdMalloc (BUFSIZ);
Packit ed3af9
	any2eucjp (t, s, BUFSIZ);
Packit ed3af9
	i = strlen (t);
Packit ed3af9
	gdFree (t);
Packit ed3af9
	return i;
Packit ed3af9
}
Packit ed3af9
Packit ed3af9
#ifdef DEBUG
Packit ed3af9
int
Packit ed3af9
main ()
Packit ed3af9
{
Packit ed3af9
	unsigned char input[BUFSIZ];
Packit ed3af9
	unsigned char *output;
Packit ed3af9
	unsigned char *str;
Packit ed3af9
	int c, i = 0;
Packit ed3af9
Packit ed3af9
	while ((c = fgetc (stdin)) != '\n' && i < BUFSIZ)
Packit ed3af9
		input[i++] = c;
Packit ed3af9
	input[i] = '\0';
Packit ed3af9
Packit ed3af9
	printf ("input : %d bytes\n", strlen ((const char *) input));
Packit ed3af9
	printf ("output: %d bytes\n", strwidth (input));
Packit ed3af9
Packit ed3af9
	output = (unsigned char *) gdMalloc (BUFSIZ);
Packit ed3af9
	any2eucjp (output, input, BUFSIZ);
Packit ed3af9
	str = output;
Packit ed3af9
	while (*str != '\0')
Packit ed3af9
		putchar (*(str++));
Packit ed3af9
	putchar ('\n');
Packit ed3af9
	gdFree (output);
Packit ed3af9
Packit ed3af9
	return 0;
Packit ed3af9
}
Packit ed3af9
#endif
Packit ed3af9
#endif