sj4/lib/sj3rkcv/sj3_rkcv.c

793 lines
17 KiB
C
Raw Normal View History

2008-01-11 11:57:08 +00:00
/*
* Copyright (c) 1994 Sony Corporation
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL SONY CORPORATION BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2026-06-19 01:49:53 +09:00
*
2008-01-11 11:57:08 +00:00
* Except as contained in this notice, the name of Sony Corporation
* shall not be used in advertising or otherwise to promote the sale, use
* or other dealings in this Software without prior written authorization
* from Sony Corporation.
*
*/
/*
2026-06-19 01:49:53 +09:00
* $SonyRCSfile: sj3_rkcv.c,v $
* $SonyRevision: 1.3 $
2008-01-11 11:57:08 +00:00
* $SonyDate: 1995/02/10 06:02:25 $
*/
#include <stdlib.h>
#include <string.h>
#include "wchar16.h"
#include "kana.h"
#include "rk.h"
#include "kctype.h"
#include "sj3rkcv.h"
#if defined(__sony_news) && (SVR4)
#define wscmp sj3_wscmp16
#define wsncmp sj3_wsncmp16
#define wsncpy sj3_wsncpy16
#define wscpy sj3_wscpy16
#define wslen sj3_wslen16
#define mbstowcs sj3_mbstowcs16
#define wcstombs sj3_wcstombs16
2026-06-19 01:49:53 +09:00
#endif
2008-01-11 11:57:08 +00:00
extern int current_locale;
#define sj_iskata(c) (c >= 0xa5a1 && c <= 0xa5f6)
#define sj_ishira(c) (c >= 0xa4a1 && c <= 0xa4f3)
static wchar16_t intmp[MAXLLEN];
static wchar16_t outtmp[MAXLLEN];
2026-06-19 01:49:53 +09:00
static u_char mtmp[MAXLLEN];
2008-01-11 11:57:08 +00:00
static u_short HKtable[ZKATAn] = {
2026-06-19 01:49:53 +09:00
KANA_XA, KANA_A,
KANA_XA + 1, KANA_A + 1,
KANA_XA + 2, KANA_A + 2,
KANA_XA + 3, KANA_A + 3,
KANA_XA + 4, KANA_A + 4,
KANA_KA, KANA_GA,
KANA_KA + 1, KANA_GA + (1 << 8),
KANA_KA + 2, KANA_GA + (2 << 8),
KANA_KA + 3, KANA_GA + (3 << 8),
KANA_KA + 4, KANA_GA + (4 << 8),
KANA_SA, KANA_ZA,
KANA_SA + 1, KANA_ZA + (1 << 8),
KANA_SA + 2, KANA_ZA + (2 << 8),
KANA_SA + 3, KANA_ZA + (3 << 8),
KANA_SA + 4, KANA_ZA + (4 << 8),
KANA_TA, KANA_DA,
KANA_TA + 1, KANA_DA + (1 << 8),
KANA_XTSU, KANA_TA + 2, KANA_DA + (2 << 8),
KANA_TA + 3, KANA_DA + (3 << 8),
KANA_TA + 4, KANA_DA + (4 << 8),
KANA_NA,
KANA_NA + 1,
KANA_NA + 2,
KANA_NA + 3,
KANA_NA + 4,
KANA_HA, KANA_BA, KANA_PA,
KANA_HA + 1, KANA_BA + (1 << 8), KANA_PA + (1 << 8),
KANA_HA + 2, KANA_BA + (2 << 8), KANA_PA + (2 << 8),
KANA_HA + 3, KANA_BA + (3 << 8), KANA_PA + (3 << 8),
KANA_HA + 4, KANA_BA + (4 << 8), KANA_PA + (4 << 8),
KANA_MA,
KANA_MA + 1,
KANA_MA + 2,
KANA_MA + 3,
KANA_MA + 4,
KANA_XYA, KANA_YA,
KANA_XYA + 1, KANA_YA + 1,
KANA_XYA + 2, KANA_YA + 2,
KANA_RA,
KANA_RA + 1,
KANA_RA + 2,
KANA_RA + 3,
KANA_RA + 4,
KANA_WA, KANA_WA,
KANA_A + 1,
KANA_A + 3,
KANA_WO,
KANA_WA + 1,
((KANA_A + 2) << 8) + KANA_DTEN,
KANA_KA,
KANA_KA + 3};
2008-01-11 11:57:08 +00:00
static struct ztohkktbl {
u_short zen;
u_short han;
} HKKtbl[8] = {
2026-06-19 01:49:53 +09:00
ZEN_KTEN, KANA_KTEN,
ZEN_FKAKKO, KANA_FKAKKO,
ZEN_EKAKKO, KANA_EKAKKO,
ZEN_TTEN, KANA_TTEN,
ZEN_CTEN, KANA_CTEN,
ZEN_CHOUON, KANA_CHOUON,
ZEN_DTEN, KANA_DTEN,
ZEN_HDTEN, KANA_HDTEN};
2008-01-11 11:57:08 +00:00
static struct hzkigoutbl {
wchar16_t han;
2026-06-19 01:49:53 +09:00
u_short zen;
2008-01-11 11:57:08 +00:00
} HZKtbl[6] = {
2026-06-19 01:49:53 +09:00
',', ZEN_TTEN,
'.', ZEN_KTEN,
'-', ZEN_CHOUON,
'@', ZEN_CTEN,
'[', ZEN_FKAKKO,
']', ZEN_EKAKKO};
2008-01-11 11:57:08 +00:00
static u_short HZtbl[95] = {
2026-06-19 01:49:53 +09:00
0xa1a1, 0xa1aa, 0xa1c9, 0xa1f4, 0xa1f0, 0xa1f3, 0xa1f5, 0xa1c7,
0xa1ca, 0xa1cb, 0xa1f6, 0xa1dc, 0xa1a4, 0xa1dd, 0xa1a5, 0xa1bf,
0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7,
0xa3b8, 0xa3b9, 0xa1a7, 0xa1a8, 0xa1e3, 0xa1e1, 0xa1e4, 0xa1a9,
0xa1f7, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7,
0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf,
0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7,
0xa3d8, 0xa3d9, 0xa3da, 0xa1ce, 0xa1ef, 0xa1cf, 0xa1b0, 0xa1b2,
0xa1c6, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7,
0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef,
0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7,
0xa3f8, 0xa3f9, 0xa3fa, 0xa1d0, 0xa1c3, 0xa1d1, 0xa1b1};
2008-01-11 11:57:08 +00:00
#ifdef ADDHK
2026-06-19 01:49:53 +09:00
void setl_hktozh() {
int i;
u_short c, zen1;
wchar16_t rstr[2];
wchar16_t kstr[2];
2008-01-11 11:57:08 +00:00
RkTablW16 *rktp, *mktable();
2026-06-19 01:49:53 +09:00
zen1 = (ZHIRA1 << 8);
2008-01-11 11:57:08 +00:00
rstr[1] = '\0';
kstr[1] = 0;
for(i = 0; i < ZKATAn - 3; i++) {
c = HKtable[i];
2026-06-19 01:49:53 +09:00
if(!(c & RKZEN)) {
2008-01-11 11:57:08 +00:00
rstr[0] = c;
2026-06-19 01:49:53 +09:00
if((rktp = mktable(rstr, 1)) == NULL)
2008-01-11 11:57:08 +00:00
break;
2026-06-19 01:49:53 +09:00
if(rktp->k_yomi != NULL)
2008-01-11 11:57:08 +00:00
continue;
kstr[0] = zen1 + (ZHIRAF2 + i);
2026-06-19 01:49:53 +09:00
if(kstradd(&(rktp->k_yomi), kstr, 2) == -1)
2008-01-11 11:57:08 +00:00
break;
}
}
2026-06-19 01:49:53 +09:00
for(i = 0; i < 8; i++) {
2008-01-11 11:57:08 +00:00
rstr[0] = HKKtbl[i].han;
2026-06-19 01:49:53 +09:00
if((rktp = mktable(rstr, 1)) == NULL)
2008-01-11 11:57:08 +00:00
break;
2026-06-19 01:49:53 +09:00
if(rktp->k_yomi != NULL)
2008-01-11 11:57:08 +00:00
continue;
kstr[0] = HKKtbl[i].zen;
2026-06-19 01:49:53 +09:00
if(kstradd(&(rktp->k_yomi), kstr, 2) == -1)
2008-01-11 11:57:08 +00:00
break;
}
}
#endif
2026-06-19 01:49:53 +09:00
void mkkigou() {
int i;
wchar16_t rstr[2];
wchar16_t kstr[2];
2008-01-11 11:57:08 +00:00
RkTablW16 *rktp, *mktable();
rstr[1] = '\0';
kstr[1] = 0;
2026-06-19 01:49:53 +09:00
for(i = 0; i < 6; i++) {
2008-01-11 11:57:08 +00:00
rstr[0] = HZKtbl[i].han;
2026-06-19 01:49:53 +09:00
if((rktp = mktable(rstr, 1)) == NULL)
2008-01-11 11:57:08 +00:00
break;
2026-06-19 01:49:53 +09:00
if(rktp->k_yomi != NULL)
2008-01-11 11:57:08 +00:00
continue;
kstr[0] = HZKtbl[i].zen;
2026-06-19 01:49:53 +09:00
if(kstradd(&(rktp->k_yomi), kstr, 2) == -1)
2008-01-11 11:57:08 +00:00
break;
}
}
2026-06-19 01:49:53 +09:00
int sj_addten(u_short prefix, u_short c) {
2008-01-11 11:57:08 +00:00
u_short c1, cc;
cc = 0;
2026-06-19 01:49:53 +09:00
if((c == ZEN_DTEN || c == ZEN_HDTEN) &&
(sj_ishira(prefix) || sj_iskata(prefix))) {
2008-01-11 11:57:08 +00:00
c1 = sj_zen2han(prefix);
2026-06-19 01:49:53 +09:00
if((c1 >= KANA_KA && c1 < KANA_NA) ||
(c1 >= KANA_HA && c1 < KANA_MA)) {
if(c == ZEN_DTEN)
2008-01-11 11:57:08 +00:00
cc = prefix + 1;
2026-06-19 01:49:53 +09:00
else if(c == ZEN_HDTEN && c1 >= KANA_HA)
2008-01-11 11:57:08 +00:00
cc = prefix + 2;
2026-06-19 01:49:53 +09:00
} else if(c1 == KANA_A + 2 && sj_iskata(prefix) && c == ZEN_DTEN)
2008-01-11 11:57:08 +00:00
cc = ZEN_VU;
}
2026-06-19 01:49:53 +09:00
return (cc);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj_han2zen(u_short c) {
int i;
2008-01-11 11:57:08 +00:00
u_short cc;
2026-06-19 01:49:53 +09:00
if(WcIsHANKAKU(c) && iskana2(c)) {
for(i = 0; i < ZKATAn; i++) {
if(c == HKtable[i]) {
if(i >= ZKATAn - 3) {
2008-01-11 11:57:08 +00:00
cc = (ZKATA1 << 8) + (ZKATAF2 + i + 1);
2026-06-19 01:49:53 +09:00
} else {
2008-01-11 11:57:08 +00:00
cc = (ZHIRA1 << 8) + (ZHIRAF2 + i);
2026-06-19 01:49:53 +09:00
if(c == KANA_WA)
2008-01-11 11:57:08 +00:00
cc++;
}
break;
}
}
2026-06-19 01:49:53 +09:00
if(i >= ZKATAn) {
for(i = 0; i < 8; i++) {
if(c == HKKtbl[i].han) {
2008-01-11 11:57:08 +00:00
cc = HKKtbl[i].zen;
break;
}
}
2026-06-19 01:49:53 +09:00
if(i >= 8)
2008-01-11 11:57:08 +00:00
cc = ZEN_SPACE;
}
} else {
2026-06-19 01:49:53 +09:00
if(c >= 0x20 && c <= 0x7e)
2008-01-11 11:57:08 +00:00
cc = HZtbl[c - 0x20];
else
cc = c;
}
2026-06-19 01:49:53 +09:00
return (cc);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj3_hantozen(u_char* out, u_char* in) {
2008-01-11 11:57:08 +00:00
wchar16_t *winstr, *woutstr;
2026-06-19 01:49:53 +09:00
u_char* mstr;
int inlen, outlen, imflag = 0, omflag = 0, mmflag = 0, ret;
2008-01-11 11:57:08 +00:00
inlen = strlen(in) + 1;
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
if(inlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(inlen);
2008-01-11 11:57:08 +00:00
mmflag = 1;
} else {
mstr = mtmp;
}
2026-06-19 01:49:53 +09:00
if(sjistoeuc(mstr, inlen, in, inlen) < 0) {
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
} else {
mstr = in;
}
2026-06-19 01:49:53 +09:00
if((inlen * sizeof(wchar16_t)) > sizeof(intmp)) {
winstr = (wchar16_t*)malloc(inlen * sizeof(wchar16_t));
if(!winstr) {
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
imflag = 1;
} else {
2026-06-19 01:49:53 +09:00
winstr = (wchar16_t*)intmp;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mbstowcs(winstr, (char*)mstr, inlen) == -1) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
outlen = inlen;
2026-06-19 01:49:53 +09:00
if((outlen * sizeof(wchar16_t)) > sizeof(outtmp)) {
woutstr = (wchar16_t*)malloc(outlen * sizeof(wchar16_t));
if(!woutstr) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
omflag = 1;
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
woutstr = (wchar16_t*)outtmp;
2008-01-11 11:57:08 +00:00
}
ret = sj3_hantozen_w16(woutstr, winstr);
2026-06-19 01:49:53 +09:00
if(mmflag) {
2008-01-11 11:57:08 +00:00
free(mstr);
mmflag = 0;
}
2026-06-19 01:49:53 +09:00
if(ret == 0 || ret == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return ret;
}
outlen = ret * 3;
2026-06-19 01:49:53 +09:00
if(outlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(outlen);
if(!mstr) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return -1;
}
mmflag = 1;
} else {
mstr = mtmp;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mstr, woutstr, outlen) == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
2008-01-11 11:57:08 +00:00
inlen = euctosjis(out, outlen, mstr, outlen);
} else {
2026-06-19 01:49:53 +09:00
(void)memcpy(out, mstr, strlen(mstr) + 1);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
if(inlen > 0) {
2008-01-11 11:57:08 +00:00
return ret;
} else {
return inlen;
}
}
2026-06-19 01:49:53 +09:00
int sj3_hantozen_euc(u_char* out, u_char* in) {
2008-01-11 11:57:08 +00:00
wchar16_t *winstr, *woutstr;
2026-06-19 01:49:53 +09:00
u_char* mstr;
int inlen, outlen, imflag = 0, omflag = 0, mmflag = 0, ret;
2008-01-11 11:57:08 +00:00
inlen = strlen(in) + 1;
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
2008-01-11 11:57:08 +00:00
mstr = in;
} else {
2026-06-19 01:49:53 +09:00
if(inlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(inlen);
2008-01-11 11:57:08 +00:00
mmflag = 1;
} else {
mstr = mtmp;
}
2026-06-19 01:49:53 +09:00
if(euctosjis(mstr, inlen, in, inlen) < 0) {
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
}
2026-06-19 01:49:53 +09:00
if((inlen * sizeof(wchar16_t)) > sizeof(intmp)) {
winstr = (wchar16_t*)malloc(inlen * sizeof(wchar16_t));
if(!winstr) {
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
imflag = 1;
} else {
2026-06-19 01:49:53 +09:00
winstr = (wchar16_t*)intmp;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mbstowcs(winstr, (char*)mstr, inlen) == -1) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
outlen = inlen;
2026-06-19 01:49:53 +09:00
if((outlen * sizeof(wchar16_t)) > sizeof(outtmp)) {
woutstr = (wchar16_t*)malloc(outlen * sizeof(wchar16_t));
if(!woutstr) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
omflag = 1;
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
woutstr = (wchar16_t*)outtmp;
2008-01-11 11:57:08 +00:00
}
ret = sj3_hantozen_w16(woutstr, winstr);
2026-06-19 01:49:53 +09:00
if(mmflag) {
2008-01-11 11:57:08 +00:00
free(mstr);
mmflag = 0;
}
2026-06-19 01:49:53 +09:00
if(ret == 0 || ret == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return ret;
}
outlen = ret * 3;
2026-06-19 01:49:53 +09:00
if(outlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(outlen);
if(!mstr) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return -1;
}
mmflag = 1;
} else {
mstr = mtmp;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mstr, woutstr, outlen) == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
(void)memcpy(out, mstr, strlen(mstr) + 1);
2008-01-11 11:57:08 +00:00
} else {
inlen = sjistoeuc(out, outlen, mstr, outlen);
}
2026-06-19 01:49:53 +09:00
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
2026-06-19 01:49:53 +09:00
if(inlen > 0) {
2008-01-11 11:57:08 +00:00
return ret;
} else {
return inlen;
}
}
2026-06-19 01:49:53 +09:00
int sj3_hantozen_mb(u_char* s1, u_char* s2) {
if(current_locale == LC_CTYPE_EUC)
return sj3_hantozen_euc(s1, s2);
2008-01-11 11:57:08 +00:00
else
2026-06-19 01:49:53 +09:00
return sj3_hantozen(s1, s2);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj3_hantozen_w16(wchar16_t* s1, wchar16_t* s2) {
2008-01-11 11:57:08 +00:00
return sj_hantozen(s1, s2, wslen(s2));
}
2026-06-19 01:49:53 +09:00
int sj_hantozen(wchar16_t* s1, wchar16_t* s2, int len) {
u_short c1, cc, prefix;
2008-01-11 11:57:08 +00:00
wchar16_t c;
2026-06-19 01:49:53 +09:00
int i;
int rlen;
2008-01-11 11:57:08 +00:00
prefix = 0;
2026-06-19 01:49:53 +09:00
rlen = 0;
for(i = 0; i < len && *s2 != '\0'; i++) {
c = *s2++;
2008-01-11 11:57:08 +00:00
cc = sj_han2zen(c);
2026-06-19 01:49:53 +09:00
if(cc & RKZEN) {
if(prefix != 0 && (c1 = sj_addten(prefix, cc)) != 0) {
2008-01-11 11:57:08 +00:00
s1 -= 1;
rlen -= 1;
2026-06-19 01:49:53 +09:00
cc = c1;
2008-01-11 11:57:08 +00:00
prefix = 0;
2026-06-19 01:49:53 +09:00
} else
2008-01-11 11:57:08 +00:00
prefix = cc;
*s1++ = cc;
2026-06-19 01:49:53 +09:00
rlen++;
2008-01-11 11:57:08 +00:00
} else {
*s1++ = cc;
rlen++;
prefix = 0;
}
}
*s1 = '\0';
2026-06-19 01:49:53 +09:00
return (rlen);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj_zen2han(u_short c) {
int i;
2008-01-11 11:57:08 +00:00
u_short cc;
2026-06-19 01:49:53 +09:00
i = ZKATAn;
2008-01-11 11:57:08 +00:00
cc = c & MASK;
2026-06-19 01:49:53 +09:00
if(sj_ishira(c))
2008-01-11 11:57:08 +00:00
i = cc - ZHIRAF2;
2026-06-19 01:49:53 +09:00
else if(sj_iskata(c)) {
2008-01-11 11:57:08 +00:00
i = cc - ZKATAF2;
}
2026-06-19 01:49:53 +09:00
if(i < ZKATAn)
2008-01-11 11:57:08 +00:00
cc = HKtable[i];
else {
2026-06-19 01:49:53 +09:00
for(i = 0; i < 8; i++) {
if(c == HKKtbl[i].zen) {
2008-01-11 11:57:08 +00:00
cc = HKKtbl[i].han;
break;
}
}
2026-06-19 01:49:53 +09:00
if(i >= 8) {
2008-01-11 11:57:08 +00:00
cc = c;
2026-06-19 01:49:53 +09:00
for(i = 0; i < 95; i++) {
if(c == HZtbl[i]) {
2008-01-11 11:57:08 +00:00
cc = i + 0x20;
break;
}
}
}
}
2026-06-19 01:49:53 +09:00
return (cc);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj3_zentohan(u_char* out, u_char* in) {
2008-01-11 11:57:08 +00:00
wchar16_t *winstr, *woutstr;
2026-06-19 01:49:53 +09:00
u_char* mstr;
int inlen, outlen, imflag = 0, omflag = 0, mmflag = 0, ret;
2008-01-11 11:57:08 +00:00
inlen = strlen(in) + 1;
2026-06-19 01:49:53 +09:00
if(inlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(inlen);
if(!mstr) {
2008-01-11 11:57:08 +00:00
return -1;
}
mmflag = 1;
} else {
mstr = mtmp;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
(void)euctosjis(mstr, inlen, in, inlen);
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
(void)memcpy(mstr, in, inlen);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(inlen > sizeof(intmp)) {
winstr = (wchar16_t*)malloc(((inlen / 2) + 1) * sizeof(wchar16_t));
if(!winstr) {
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
imflag = 1;
} else {
2026-06-19 01:49:53 +09:00
winstr = (wchar16_t*)intmp;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mbstowcs(winstr, (char*)mstr, inlen) == -1) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(mmflag) {
2008-01-11 11:57:08 +00:00
free(mstr);
mmflag = 0;
}
outlen = ((inlen - 1) / 2) + 1;
2026-06-19 01:49:53 +09:00
if(outlen * sizeof(wchar16_t) > sizeof(outtmp)) {
woutstr = (wchar16_t*)malloc(outlen * sizeof(wchar16_t));
if(!woutstr) {
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
omflag = 1;
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
woutstr = (wchar16_t*)outtmp;
2008-01-11 11:57:08 +00:00
}
ret = sj3_zentohan_w16(woutstr, winstr);
2026-06-19 01:49:53 +09:00
if(ret == 0 || ret == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return ret;
}
outlen = ret * 3;
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
if(outlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(outlen);
2008-01-11 11:57:08 +00:00
mmflag = 1;
} else {
mstr = mtmp;
}
} else {
mstr = out;
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mstr, woutstr, outlen) == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
if(euctosjis(out, outlen, mstr, outlen) < 0) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
}
2026-06-19 01:49:53 +09:00
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return ret;
}
2026-06-19 01:49:53 +09:00
int sj3_zentohan_euc(u_char* out, u_char* in) {
2008-01-11 11:57:08 +00:00
wchar16_t *winstr, *woutstr;
2026-06-19 01:49:53 +09:00
u_char* mstr;
int inlen, outlen, imflag = 0, omflag = 0, mmflag = 0, ret;
2008-01-11 11:57:08 +00:00
inlen = strlen(in) + 1;
2026-06-19 01:49:53 +09:00
if(inlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(inlen);
if(!mstr) {
2008-01-11 11:57:08 +00:00
return -1;
}
mmflag = 1;
} else {
mstr = mtmp;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
(void)euctosjis(mstr, inlen, in, inlen);
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
(void)memcpy(mstr, in, inlen);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(inlen > sizeof(intmp)) {
winstr = (wchar16_t*)malloc(((inlen / 2) + 1) * sizeof(wchar16_t));
if(!winstr) {
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
imflag = 1;
} else {
2026-06-19 01:49:53 +09:00
winstr = (wchar16_t*)intmp;
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
if(mbstowcs(winstr, (char*)mstr, inlen) == -1) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(mmflag) {
2008-01-11 11:57:08 +00:00
free(mstr);
mmflag = 0;
}
outlen = ((inlen - 1) / 2) + 1;
2026-06-19 01:49:53 +09:00
if(outlen * sizeof(wchar16_t) > sizeof(outtmp)) {
woutstr = (wchar16_t*)malloc(outlen * sizeof(wchar16_t));
if(!woutstr) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
omflag = 1;
2008-01-11 11:57:08 +00:00
} else {
2026-06-19 01:49:53 +09:00
woutstr = (wchar16_t*)outtmp;
2008-01-11 11:57:08 +00:00
}
ret = sj3_zentohan_w16(woutstr, winstr);
2026-06-19 01:49:53 +09:00
if(ret == 0 || ret == -1) {
if(mmflag) free(mstr);
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return ret;
}
outlen = ret * 3;
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_EUC) {
2008-01-11 11:57:08 +00:00
mstr = out;
} else {
2026-06-19 01:49:53 +09:00
if(outlen > sizeof(mtmp)) {
mstr = (u_char*)malloc(outlen);
2008-01-11 11:57:08 +00:00
mmflag = 1;
} else {
mstr = mtmp;
}
}
2026-06-19 01:49:53 +09:00
if(wcstombs((char*)mstr, woutstr, outlen) == -1) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
2008-01-11 11:57:08 +00:00
return -1;
}
2026-06-19 01:49:53 +09:00
if(current_locale == LC_CTYPE_SHIFTJIS) {
if(sjistoeuc(out, outlen, mstr, outlen) < 0) {
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return -1;
}
}
2026-06-19 01:49:53 +09:00
if(imflag) free(winstr);
if(omflag) free(woutstr);
if(mmflag) free(mstr);
2008-01-11 11:57:08 +00:00
return ret;
}
2026-06-19 01:49:53 +09:00
int sj3_zentohan_mb(u_char* s1, u_char* s2) {
if(current_locale == LC_CTYPE_EUC)
return sj3_zentohan_euc(s1, s2);
else
return sj3_zentohan(s1, s2);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj3_zentohan_w16(wchar16_t* s1, wchar16_t* s2) {
2008-01-11 11:57:08 +00:00
return sj_zentohan(s1, s2, wslen(s2));
}
2026-06-19 01:49:53 +09:00
int sj_zentohan(wchar16_t* s1, wchar16_t* s2, int len) {
u_short cc;
2008-01-11 11:57:08 +00:00
wchar16_t c;
2026-06-19 01:49:53 +09:00
int i, rlen;
2008-01-11 11:57:08 +00:00
rlen = 0;
2026-06-19 01:49:53 +09:00
for(i = 0; i < len && *s2 != (wchar16_t)'\0'; i++) {
2008-01-11 11:57:08 +00:00
c = *s2++;
2026-06-19 01:49:53 +09:00
if(WcIsZENKAKU(c)) {
2008-01-11 11:57:08 +00:00
cc = sj_zen2han(c);
2026-06-19 01:49:53 +09:00
if((cc >> 8) && (cc != c)) {
2008-01-11 11:57:08 +00:00
*s1++ = (cc >> 8);
rlen++;
*s1++ = cc & 0xff;
2026-06-19 01:49:53 +09:00
rlen++;
2008-01-11 11:57:08 +00:00
continue;
}
2026-06-19 01:49:53 +09:00
} else
2008-01-11 11:57:08 +00:00
cc = c;
2026-06-19 01:49:53 +09:00
if(cc & RKZEN) {
2008-01-11 11:57:08 +00:00
*s1++ = (cc >> 8);
rlen++;
}
*s1++ = (wchar16_t)cc;
rlen++;
}
2026-06-19 01:49:53 +09:00
*s1 = (wchar16_t)'\0';
return (rlen);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj_tokata(wchar16_t c) {
if(sj_ishira(c)) {
2008-01-11 11:57:08 +00:00
c += 0x0100;
}
2026-06-19 01:49:53 +09:00
return (c);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj_tohira(wchar16_t c) {
if(sj_iskata(c) && (short)c <= (short)0xa5f3) {
2008-01-11 11:57:08 +00:00
c -= 0x0100;
}
2026-06-19 01:49:53 +09:00
return (c);
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj_htok(wchar16_t* s1, wchar16_t* s2) {
2008-01-11 11:57:08 +00:00
wchar16_t cc;
wchar16_t c;
2026-06-19 01:49:53 +09:00
while((c = *s2++) != (wchar16_t)'\0') {
if(WcIsX0208(c)) {
cc = sj_tokata(c);
2008-01-11 11:57:08 +00:00
*s1++ = cc;
} else
*s1++ = c;
}
2026-06-19 01:49:53 +09:00
*s1 = (wchar16_t)'\0';
2008-01-11 11:57:08 +00:00
}
2026-06-19 01:49:53 +09:00
int sj_ktoh(wchar16_t* s1, wchar16_t* s2) {
2008-01-11 11:57:08 +00:00
wchar16_t cc;
wchar16_t c;
2026-06-19 01:49:53 +09:00
while((c = *s2++) != (wchar16_t)'\0') {
if(WcIsX0208(c)) {
cc = sj_tohira(c);
2008-01-11 11:57:08 +00:00
*s1++ = cc;
} else
*s1++ = c;
}
2026-06-19 01:49:53 +09:00
*s1 = (wchar16_t)'\0';
2008-01-11 11:57:08 +00:00
}