Annotation of embedaddon/php/ext/mbstring/libmbfl/filters/mbfilter_koi8u.c, revision 1.1
1.1 ! misho 1: /*
! 2: * "streamable kanji code filter and converter"
! 3: * Copyright (c) 1998-2002 HappySize, Inc. All rights reserved.
! 4: *
! 5: * LICENSE NOTICES
! 6: *
! 7: * This file is part of "streamable kanji code filter and converter",
! 8: * which is distributed under the terms of GNU Lesser General Public
! 9: * License (version 2) as published by the Free Software Foundation.
! 10: *
! 11: * This software is distributed in the hope that it will be useful,
! 12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 14: * GNU Lesser General Public License for more details.
! 15: *
! 16: * You should have received a copy of the GNU Lesser General Public
! 17: * License along with "streamable kanji code filter and converter";
! 18: * if not, write to the Free Software Foundation, Inc., 59 Temple Place,
! 19: * Suite 330, Boston, MA 02111-1307 USA
! 20: *
! 21: * The author of this part: Maksym Veremeyenko <verem@m1.tv>
! 22: *
! 23: * Based on mbfilter_koi8r.c code
! 24: *
! 25: */
! 26:
! 27: #ifdef HAVE_CONFIG_H
! 28: #include "config.h"
! 29: #endif
! 30:
! 31: #include "mbfilter.h"
! 32: #include "mbfilter_koi8u.h"
! 33: #include "unicode_table_koi8u.h"
! 34:
! 35: static int mbfl_filt_ident_koi8u(int c, mbfl_identify_filter *filter);
! 36:
! 37: static const char *mbfl_encoding_koi8u_aliases[] = {"KOI8-U", "KOI8U", NULL};
! 38:
! 39: const mbfl_encoding mbfl_encoding_koi8u = {
! 40: mbfl_no_encoding_koi8u,
! 41: "KOI8-U",
! 42: "KOI8-U",
! 43: (const char *(*)[])&mbfl_encoding_koi8u_aliases,
! 44: NULL,
! 45: MBFL_ENCTYPE_SBCS
! 46: };
! 47:
! 48: const struct mbfl_identify_vtbl vtbl_identify_koi8u = {
! 49: mbfl_no_encoding_koi8u,
! 50: mbfl_filt_ident_common_ctor,
! 51: mbfl_filt_ident_common_dtor,
! 52: mbfl_filt_ident_koi8u
! 53: };
! 54:
! 55: const struct mbfl_convert_vtbl vtbl_wchar_koi8u = {
! 56: mbfl_no_encoding_wchar,
! 57: mbfl_no_encoding_koi8u,
! 58: mbfl_filt_conv_common_ctor,
! 59: mbfl_filt_conv_common_dtor,
! 60: mbfl_filt_conv_wchar_koi8u,
! 61: mbfl_filt_conv_common_flush
! 62: };
! 63:
! 64: const struct mbfl_convert_vtbl vtbl_koi8u_wchar = {
! 65: mbfl_no_encoding_koi8u,
! 66: mbfl_no_encoding_wchar,
! 67: mbfl_filt_conv_common_ctor,
! 68: mbfl_filt_conv_common_dtor,
! 69: mbfl_filt_conv_koi8u_wchar,
! 70: mbfl_filt_conv_common_flush
! 71: };
! 72:
! 73: #define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
! 74:
! 75: /*
! 76: * koi8u => wchar
! 77: */
! 78: int
! 79: mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter)
! 80: {
! 81: int s;
! 82:
! 83: if (c >= 0 && c < koi8u_ucs_table_min) {
! 84: s = c;
! 85: } else if (c >= koi8u_ucs_table_min && c < 0x100) {
! 86: s = koi8u_ucs_table[c - koi8u_ucs_table_min];
! 87: if (s <= 0) {
! 88: s = c;
! 89: s &= MBFL_WCSPLANE_MASK;
! 90: s |= MBFL_WCSPLANE_KOI8U;
! 91: }
! 92: } else {
! 93: s = c;
! 94: s &= MBFL_WCSGROUP_MASK;
! 95: s |= MBFL_WCSGROUP_THROUGH;
! 96: }
! 97:
! 98: CK((*filter->output_function)(s, filter->data));
! 99:
! 100: return c;
! 101: }
! 102:
! 103: /*
! 104: * wchar => koi8u
! 105: */
! 106: int
! 107: mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter)
! 108: {
! 109: int s, n;
! 110:
! 111: if (c < 0x80) {
! 112: s = c;
! 113: } else {
! 114: s = -1;
! 115: n = koi8u_ucs_table_len-1;
! 116: while (n >= 0) {
! 117: if (c == koi8u_ucs_table[n]) {
! 118: s = koi8u_ucs_table_min + n;
! 119: break;
! 120: }
! 121: n--;
! 122: }
! 123: if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8U) {
! 124: s = c & MBFL_WCSPLANE_MASK;
! 125: }
! 126: }
! 127:
! 128: if (s >= 0) {
! 129: CK((*filter->output_function)(s, filter->data));
! 130: } else {
! 131: if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
! 132: CK(mbfl_filt_conv_illegal_output(c, filter));
! 133: }
! 134: }
! 135:
! 136: return c;
! 137: }
! 138:
! 139: static int mbfl_filt_ident_koi8u(int c, mbfl_identify_filter *filter)
! 140: {
! 141: if (c >= 0x80 && c < 0xff)
! 142: filter->flag = 0;
! 143: else
! 144: filter->flag = 1; /* not it */
! 145: return c;
! 146: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>