Return to mbfilter_koi8r.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mbstring / libmbfl / filters |
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: Den V. Tsopa <tdv@edisoft.ru> 22: * 23: */ 24: /* 25: * The source code included in this files was separated from mbfilter_ru.c 26: * by moriyoshi koizumi <moriyoshi@php.net> on 4 dec 2002. 27: * 28: */ 29: 30: #ifdef HAVE_CONFIG_H 31: #include "config.h" 32: #endif 33: 34: #include "mbfilter.h" 35: #include "mbfilter_koi8r.h" 36: #include "unicode_table_koi8r.h" 37: 38: static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter); 39: 40: static const char *mbfl_encoding_koi8r_aliases[] = {"KOI8-R", "KOI8R", NULL}; 41: 42: const mbfl_encoding mbfl_encoding_koi8r = { 43: mbfl_no_encoding_koi8r, 44: "KOI8-R", 45: "KOI8-R", 46: (const char *(*)[])&mbfl_encoding_koi8r_aliases, 47: NULL, 48: MBFL_ENCTYPE_SBCS 49: }; 50: 51: const struct mbfl_identify_vtbl vtbl_identify_koi8r = { 52: mbfl_no_encoding_koi8r, 53: mbfl_filt_ident_common_ctor, 54: mbfl_filt_ident_common_dtor, 55: mbfl_filt_ident_koi8r 56: }; 57: 58: const struct mbfl_convert_vtbl vtbl_wchar_koi8r = { 59: mbfl_no_encoding_wchar, 60: mbfl_no_encoding_koi8r, 61: mbfl_filt_conv_common_ctor, 62: mbfl_filt_conv_common_dtor, 63: mbfl_filt_conv_wchar_koi8r, 64: mbfl_filt_conv_common_flush 65: }; 66: 67: const struct mbfl_convert_vtbl vtbl_koi8r_wchar = { 68: mbfl_no_encoding_koi8r, 69: mbfl_no_encoding_wchar, 70: mbfl_filt_conv_common_ctor, 71: mbfl_filt_conv_common_dtor, 72: mbfl_filt_conv_koi8r_wchar, 73: mbfl_filt_conv_common_flush 74: }; 75: 76: #define CK(statement) do { if ((statement) < 0) return (-1); } while (0) 77: 78: /* 79: * koi8r => wchar 80: */ 81: int 82: mbfl_filt_conv_koi8r_wchar(int c, mbfl_convert_filter *filter) 83: { 84: int s; 85: 86: if (c >= 0 && c < koi8r_ucs_table_min) { 87: s = c; 88: } else if (c >= koi8r_ucs_table_min && c < 0x100) { 89: s = koi8r_ucs_table[c - koi8r_ucs_table_min]; 90: if (s <= 0) { 91: s = c; 92: s &= MBFL_WCSPLANE_MASK; 93: s |= MBFL_WCSPLANE_KOI8R; 94: } 95: } else { 96: s = c; 97: s &= MBFL_WCSGROUP_MASK; 98: s |= MBFL_WCSGROUP_THROUGH; 99: } 100: 101: CK((*filter->output_function)(s, filter->data)); 102: 103: return c; 104: } 105: 106: /* 107: * wchar => koi8r 108: */ 109: int 110: mbfl_filt_conv_wchar_koi8r(int c, mbfl_convert_filter *filter) 111: { 112: int s, n; 113: 114: if (c < 0x80) { 115: s = c; 116: } else { 117: s = -1; 118: n = koi8r_ucs_table_len-1; 119: while (n >= 0) { 120: if (c == koi8r_ucs_table[n]) { 121: s = koi8r_ucs_table_min + n; 122: break; 123: } 124: n--; 125: } 126: if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8R) { 127: s = c & MBFL_WCSPLANE_MASK; 128: } 129: } 130: 131: if (s >= 0) { 132: CK((*filter->output_function)(s, filter->data)); 133: } else { 134: if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) { 135: CK(mbfl_filt_conv_illegal_output(c, filter)); 136: } 137: } 138: 139: return c; 140: } 141: 142: static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filter) 143: { 144: if (c >= 0x80 && c < 0xff) 145: filter->flag = 0; 146: else 147: filter->flag = 1; /* not it */ 148: return c; 149: }