root/ext/mbstring/libmbfl/filters/mbfilter_tl_jisx0201_jisx0208.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. mbfl_filt_tl_jisx0201_jisx0208_init
  2. mbfl_filt_tl_jisx0201_jisx0208_cleanup
  3. mbfl_filt_tl_jisx0201_jisx0208
  4. mbfl_filt_tl_jisx0201_jisx0208_flush

/*
 * "streamable kanji code filter and converter"
 * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
 *
 * LICENSE NOTICES
 *
 * This file is part of "streamable kanji code filter and converter",
 * which is distributed under the terms of GNU Lesser General Public 
 * License (version 2) as published by the Free Software Foundation.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with "streamable kanji code filter and converter";
 * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 * Suite 330, Boston, MA  02111-1307  USA
 *
 * The author of this file: Moriyoshi Koizumi <koizumi@gree.co.jp>
 *
 */

#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) {
                /* all except <"> <'> <\> <~> */
                s = c + 0xfee0;
        } else if ((mode & MBFL_FILT_TL_HAN2ZEN_ALPHA) &&
                        ((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a))) {
                /* alpha */
                s = c + 0xfee0;
        } else if ((mode & MBFL_FILT_TL_HAN2ZEN_NUMERIC) &&
                        c >= 0x30 && c <= 0x39) {
                /* num */
                s = c + 0xfee0;
        } else if ((mode & MBFL_FILT_TL_HAN2ZEN_SPACE) && c == 0x20) {
                /* space */
                s = 0x3000;
        }

        if (mode &
                        (MBFL_FILT_TL_HAN2ZEN_KATAKANA | MBFL_FILT_TL_HAN2ZEN_HIRAGANA)) {
                /* hankaku kana to zenkaku kana */
                if ((mode & MBFL_FILT_TL_HAN2ZEN_KATAKANA) &&
                                (mode & MBFL_FILT_TL_HAN2ZEN_GLUE)) {
                        /* hankaku kana to zenkaku katakana and glue voiced sound mark */
                        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)) {
                        /* hankaku kana to zenkaku hirangana and glue voiced sound mark */
                        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) {
                        /* hankaku kana to zenkaku katakana */
                        s = 0x3000 + hankana2zenkana_table[c - 0xff60];
                } else if ((mode & MBFL_FILT_TL_HAN2ZEN_HIRAGANA)
                                && c >= 0xff61 && c <= 0xff9f) {
                        /* hankaku kana to zenkaku hirangana */
                        s = 0x3000 + hankana2zenhira_table[c - 0xff60];
                }
        }

        if (mode & MBFL_FILT_TL_HAN2ZEN_COMPAT1) {
                /* special ascii to symbol */
                if (c == 0x5c) {
                        s = 0xffe5;                             /* FULLWIDTH YEN SIGN */
                } else if (c == 0xa5) {         /* YEN SIGN */
                        s = 0xffe5;                             /* FULLWIDTH YEN SIGN */
                } else if (c == 0x7e) {
                        s = 0xffe3;                             /* FULLWIDTH MACRON */
                } else if (c == 0x203e) {       /* OVERLINE */
                        s = 0xffe3;                             /* FULLWIDTH MACRON */
                } else if (c == 0x27) {
                        s = 0x2019;                             /* RIGHT SINGLE QUOTATION MARK */
                } else if (c == 0x22) {
                        s = 0x201d;                             /* RIGHT DOUBLE QUOTATION MARK */
                }
        } else if (mode & MBFL_FILT_TL_HAN2ZEN_COMPAT2) {
                /* special ascii to symbol */
                if (c == 0x5c) {
                        s = 0xff3c;                             /* FULLWIDTH REVERSE SOLIDUS */
                } else if (c == 0x7e) {
                        s = 0xff5e;                             /* FULLWIDTH TILDE */
                } else if (c == 0x27) {
                        s = 0xff07;                             /* FULLWIDTH APOSTROPHE */
                } else if (c == 0x22) {
                        s = 0xff02;                             /* FULLWIDTH QUOTATION MARK */
                }
        }

        if (mode & 0xf0) { /* zenkaku to hankaku */
                if ((mode & 0x10) && c >= 0xff01 && c <= 0xff5d && c != 0xff02 && c != 0xff07 && c!= 0xff3c) {  /* all except <"> <'> <\> <~> */
                        s = c - 0xfee0;
                } else if ((mode & 0x20) && ((c >= 0xff21 && c <= 0xff3a) || (c >= 0xff41 && c <= 0xff5a))) {   /* alpha */
                        s = c - 0xfee0;
                } else if ((mode & 0x40) && (c >= 0xff10 && c <= 0xff19)) {     /* num */
                        s = c - 0xfee0;
                } else if ((mode & 0x80) && (c == 0x3000)) {    /* spase */
                        s = 0x20;
                } else if ((mode & 0x10) && (c == 0x2212)) {    /* MINUS SIGN */
                        s = 0x2d;
                }
        }

        if (mode &
                        (MBFL_FILT_TL_ZEN2HAN_KATAKANA | MBFL_FILT_TL_ZEN2HAN_HIRAGANA)) {
                /* Zenkaku kana to hankaku kana */
                if ((mode & MBFL_FILT_TL_ZEN2HAN_KATAKANA) &&
                                c >= 0x30a1 && c <= 0x30f4) {
                        /* Zenkaku katakana to hankaku kana */
                        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) {
                        /* Zenkaku hirangana to hankaku kana */
                        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;                             /* HALFWIDTH IDEOGRAPHIC COMMA */
                } else if (c == 0x3002) {
                        s = 0xff61;                             /* HALFWIDTH IDEOGRAPHIC FULL STOP */
                } else if (c == 0x300c) {
                        s = 0xff62;                             /* HALFWIDTH LEFT CORNER BRACKET */
                } else if (c == 0x300d) {
                        s = 0xff63;                             /* HALFWIDTH RIGHT CORNER BRACKET */
                } else if (c == 0x309b) {
                        s = 0xff9e;                             /* HALFWIDTH KATAKANA VOICED SOUND MARK */
                } else if (c == 0x309c) {
                        s = 0xff9f;                             /* HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK */
                } else if (c == 0x30fc) {
                        s = 0xff70;                             /* HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK */
                } else if (c == 0x30fb) {
                        s = 0xff65;                             /* HALFWIDTH KATAKANA MIDDLE DOT */
                }
        } else if (mode & (MBFL_FILT_TL_ZEN2HAN_HIRA2KANA
                        | MBFL_FILT_TL_ZEN2HAN_KANA2HIRA)) { 
                if ((mode & MBFL_FILT_TL_ZEN2HAN_HIRA2KANA) &&
                                c >= 0x3041 && c <= 0x3093) {
                        /* Zenkaku hirangana to Zenkaku katakana */
                        s = c + 0x60;
                } else if ((mode & MBFL_FILT_TL_ZEN2HAN_KANA2HIRA) &&
                                c >= 0x30a1 && c <= 0x30f3) {
                        /* Zenkaku katakana to Zenkaku hirangana */
                        s = c - 0x60;
                }
        }

        if (mode & MBFL_FILT_TL_ZEN2HAN_COMPAT1) {      /* special symbol to ascii */
                if (c == 0xffe5) {                      /* FULLWIDTH YEN SIGN */
                        s = 0x5c;
                } else if (c == 0xff3c) {       /* FULLWIDTH REVERSE SOLIDUS */
                        s = 0x5c;
                } else if (c == 0xffe3) {       /* FULLWIDTH MACRON */
                        s = 0x7e;
                } else if (c == 0x203e) {       /* OVERLINE */
                        s = 0x7e;
                } else if (c == 0x2018) {       /* LEFT SINGLE QUOTATION MARK*/
                        s = 0x27;
                } else if (c == 0x2019) {       /* RIGHT SINGLE QUOTATION MARK */
                        s = 0x27;
                } else if (c == 0x201c) {       /* LEFT DOUBLE QUOTATION MARK */
                        s = 0x22;
                } else if (c == 0x201d) {       /* RIGHT DOUBLE QUOTATION MARK */
                        s = 0x22;
                }
        }

        if (mode & MBFL_FILT_TL_ZEN2HAN_COMPAT2) {      /* special symbol to ascii */
                if (c == 0xff3c) {                      /* FULLWIDTH REVERSE SOLIDUS */
                        s = 0x5c;
                } else if (c == 0xff5e) {       /* FULLWIDTH TILDE */
                        s = 0x7e;
                } else if (c == 0xff07) {       /* FULLWIDTH APOSTROPHE */
                        s = 0x27;
                } else if (c == 0xff02) {       /* FULLWIDTH QUOTATION MARK */
                        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) {     /* hankaku kana to zenkaku katakana */
                        ret = (*filt->output_function)(0x3000 + hankana2zenkana_table[n], filt->data);
                } else if (mode & 0x200) {      /* hankaku kana to zenkaku hirangana */
                        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
};


/* [<][>][^][v][top][bottom][index][help] */