mbfilter_tl_jisx0201_jisx0208.c [plain text]
#include "mbfl_allocators.h"
#include "mbfilter_tl_jisx0201_jisx0208.h"
#include "translit_kana_jisx0201_jisx0208.h"
void
mbfl_filt_tl_jisx0201_jisx0208_init(mbfl_convert_filter *filt)
{
mbfl_filt_conv_common_ctor(filt);
}
void
mbfl_filt_tl_jisx0201_jisx0208_cleanup(mbfl_convert_filter *filt)
{
}
int
mbfl_filt_tl_jisx0201_jisx0208(int c, mbfl_convert_filter *filt)
{
int s, n;
int mode = ((mbfl_filt_tl_jisx0201_jisx0208_param *)filt->opaque)->mode;
s = c;
if ((mode & MBFL_FILT_TL_HAN2ZEN_ALL)
&& c >= 0x21 && c <= 0x7d && c != 0x22 && c != 0x27 && c != 0x5c) {
s = c + 0xfee0;
} else if ((mode & MBFL_FILT_TL_HAN2ZEN_ALPHA) &&
((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a))) {
s = c + 0xfee0;
} else if ((mode & MBFL_FILT_TL_HAN2ZEN_NUMERIC) &&
c >= 0x30 && c <= 0x39) {
s = c + 0xfee0;
} else if ((mode & MBFL_FILT_TL_HAN2ZEN_SPACE) && c == 0x20) {
s = 0x3000;
}
if (mode &
(MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_HIRAGANA)) {
if ((mode & MBFL_FILT_TL_HAN2ZEN_KATAKANA) &&
(mode & MBFL_FILT_TL_HAN2ZEN_GLUE)) {
if (c >= 0xff61 && c <= 0xff9f) {
if (filt->status) {
n = (filt->cache - 0xff60) & 0x3f;
if (c == 0xff9e && ((n >= 22 && n <= 36) || (n >= 42 && n <= 46))) {
filt->status = 0;
s = 0x3001 + hankana2zenkana_table[n];
} else if (c == 0xff9e && n == 19) {
filt->status = 0;
s = 0x30f4;
} else if (c == 0xff9f && (n >= 42 && n <= 46)) {
filt->status = 0;
s = 0x3002 + hankana2zenkana_table[n];
} else {
filt->status = 1;
filt->cache = c;
s = 0x3000 + hankana2zenkana_table[n];
}
} else {
filt->status = 1;
filt->cache = c;
return c;
}
} else {
if (filt->status) {
n = (filt->cache - 0xff60) & 0x3f;
filt->status = 0;
(*filt->output_function)(0x3000 + hankana2zenkana_table[n], filt->data);
}
}
} else if ((mode & MBFL_FILT_TL_HAN2ZEN_HIRAGANA) &&
(mode & MBFL_FILT_TL_HAN2ZEN_GLUE)) {
if (c >= 0xff61 && c <= 0xff9f) {
if (filt->status) {
n = (filt->cache - 0xff60) & 0x3f;
if (c == 0xff9e && ((n >= 22 && n <= 36) || (n >= 42 && n <= 46))) {
filt->status = 0;
s = 0x3001 + hankana2zenhira_table[n];
} else if (c == 0xff9f && (n >= 42 && n <= 46)) {
filt->status = 0;
s = 0x3002 + hankana2zenhira_table[n];
} else {
filt->status = 1;
filt->cache = c;
s = 0x3000 + hankana2zenhira_table[n];
}
} else {
filt->status = 1;
filt->cache = c;
return c;
}
} else {
if (filt->status) {
n = (filt->cache - 0xff60) & 0x3f;
filt->status = 0;
(*filt->output_function)(0x3000 + hankana2zenhira_table[n], filt->data);
}
}
} else if ((mode & MBFL_FILT_TL_HAN2ZEN_KATAKANA) &&
c >= 0xff61 && c <= 0xff9f) {
s = 0x3000 + hankana2zenkana_table[c - 0xff60];
} else if ((mode & MBFL_FILT_TL_HAN2ZEN_HIRAGANA)
&& c >= 0xff61 && c <= 0xff9f) {
s = 0x3000 + hankana2zenhira_table[c - 0xff60];
}
}
if (mode & MBFL_FILT_TL_HAN2ZEN_COMPAT1) {
if (c == 0x5c) {
s = 0xffe5;
} else if (c == 0xa5) {
s = 0xffe5;
} else if (c == 0x7e) {
s = 0xffe3;
} else if (c == 0x203e) {
s = 0xffe3;
} else if (c == 0x27) {
s = 0x2019;
} else if (c == 0x22) {
s = 0x201d;
}
} else if (mode & MBFL_FILT_TL_HAN2ZEN_COMPAT2) {
if (c == 0x5c) {
s = 0xff3c;
} else if (c == 0x7e) {
s = 0xff5e;
} else if (c == 0x27) {
s = 0xff07;
} else if (c == 0x22) {
s = 0xff02;
}
}
if (mode & 0xf0) {
if ((mode & 0x10) && c >= 0xff01 && c <= 0xff5d && c != 0xff02 && c != 0xff07 && c!= 0xff3c) {
s = c - 0xfee0;
} else if ((mode & 0x20) && ((c >= 0xff21 && c <= 0xff3a) || (c >= 0xff41 && c <= 0xff5a))) {
s = c - 0xfee0;
} else if ((mode & 0x40) && (c >= 0xff10 && c <= 0xff19)) {
s = c - 0xfee0;
} else if ((mode & 0x80) && (c == 0x3000)) {
s = 0x20;
} else if ((mode & 0x10) && (c == 0x2212)) {
s = 0x2d;
}
}
if (mode &
(MBFL_FILT_TL_ZEN2HAN_KATAKANA | MBFL_FILT_TL_ZEN2HAN_HIRAGANA)) {
if ((mode & MBFL_FILT_TL_ZEN2HAN_KATAKANA) &&
c >= 0x30a1 && c <= 0x30f4) {
n = c - 0x30a1;
if (zenkana2hankana_table[n][1] != 0) {
(filt->output_function)(0xff00 + zenkana2hankana_table[n][0], filt->data);
s = 0xff00 + zenkana2hankana_table[n][1];
} else {
s = 0xff00 + zenkana2hankana_table[n][0];
}
} else if ((mode & MBFL_FILT_TL_ZEN2HAN_HIRAGANA) &&
c >= 0x3041 && c <= 0x3093) {
n = c - 0x3041;
if (zenkana2hankana_table[n][1] != 0) {
(filt->output_function)(0xff00 + zenkana2hankana_table[n][0], filt->data);
s = 0xff00 + zenkana2hankana_table[n][1];
} else {
s = 0xff00 + zenkana2hankana_table[n][0];
}
} else if (c == 0x3001) {
s = 0xff64;
} else if (c == 0x3002) {
s = 0xff61;
} else if (c == 0x300c) {
s = 0xff62;
} else if (c == 0x300d) {
s = 0xff63;
} else if (c == 0x309b) {
s = 0xff9e;
} else if (c == 0x309c) {
s = 0xff9f;
} else if (c == 0x30fc) {
s = 0xff70;
} else if (c == 0x30fb) {
s = 0xff65;
}
} else if (mode & (MBFL_FILT_TL_ZEN2HAN_HIRA2KANA
| MBFL_FILT_TL_ZEN2HAN_KANA2HIRA)) {
if ((mode & MBFL_FILT_TL_ZEN2HAN_HIRA2KANA) &&
c >= 0x3041 && c <= 0x3093) {
s = c + 0x60;
} else if ((mode & MBFL_FILT_TL_ZEN2HAN_KANA2HIRA) &&
c >= 0x30a1 && c <= 0x30f3) {
s = c - 0x60;
}
}
if (mode & MBFL_FILT_TL_ZEN2HAN_COMPAT1) {
if (c == 0xffe5) {
s = 0x5c;
} else if (c == 0xff3c) {
s = 0x5c;
} else if (c == 0xffe3) {
s = 0x7e;
} else if (c == 0x203e) {
s = 0x7e;
} else if (c == 0x2018) {
s = 0x27;
} else if (c == 0x2019) {
s = 0x27;
} else if (c == 0x201c) {
s = 0x22;
} else if (c == 0x201d) {
s = 0x22;
}
}
if (mode & MBFL_FILT_TL_ZEN2HAN_COMPAT2) {
if (c == 0xff3c) {
s = 0x5c;
} else if (c == 0xff5e) {
s = 0x7e;
} else if (c == 0xff07) {
s = 0x27;
} else if (c == 0xff02) {
s = 0x22;
}
}
return (*filt->output_function)(s, filt->data);
}
int
mbfl_filt_tl_jisx0201_jisx0208_flush(mbfl_convert_filter *filt)
{
int ret, n;
int mode = ((mbfl_filt_tl_jisx0201_jisx0208_param *)filt->opaque)->mode;
ret = 0;
if (filt->status) {
n = (filt->cache - 0xff60) & 0x3f;
if (mode & 0x100) {
ret = (*filt->output_function)(0x3000 + hankana2zenkana_table[n], filt->data);
} else if (mode & 0x200) {
ret = (*filt->output_function)(0x3000 + hankana2zenhira_table[n], filt->data);
}
filt->status = 0;
}
if (filt->flush_function != NULL) {
return (*filt->flush_function)(filt->data);
}
return ret;
}
const struct mbfl_convert_vtbl vtbl_tl_jisx0201_jisx0208 = {
mbfl_no_encoding_wchar,
mbfl_no_encoding_wchar,
mbfl_filt_tl_jisx0201_jisx0208_init,
mbfl_filt_tl_jisx0201_jisx0208_cleanup,
mbfl_filt_tl_jisx0201_jisx0208,
mbfl_filt_tl_jisx0201_jisx0208_flush
};