Return to mbfilter_koi8u.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: 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: }