Return to iso8859_3.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / mbstring / oniguruma / enc |
1.1 misho 1: /********************************************************************** 2: iso8859_3.c - Oniguruma (regular expression library) 3: **********************************************************************/ 4: /*- 5: * Copyright (c) 2002-2006 K.Kosako <sndgk393 AT ybb DOT ne DOT jp> 6: * All rights reserved. 7: * 8: * Redistribution and use in source and binary forms, with or without 9: * modification, are permitted provided that the following conditions 10: * are met: 11: * 1. Redistributions of source code must retain the above copyright 12: * notice, this list of conditions and the following disclaimer. 13: * 2. Redistributions in binary form must reproduce the above copyright 14: * notice, this list of conditions and the following disclaimer in the 15: * documentation and/or other materials provided with the distribution. 16: * 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27: * SUCH DAMAGE. 28: */ 29: 30: #include "regenc.h" 31: 32: #define ENC_ISO_8859_3_TO_LOWER_CASE(c) EncISO_8859_3_ToLowerCaseTable[c] 33: #define ENC_IS_ISO_8859_3_CTYPE(code,ctype) \ 34: ((EncISO_8859_3_CtypeTable[code] & ctype) != 0) 35: 36: static const UChar EncISO_8859_3_ToLowerCaseTable[256] = { 37: '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', 38: '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', 39: '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', 40: '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', 41: '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047', 42: '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057', 43: '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067', 44: '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077', 45: '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147', 46: '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', 47: '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', 48: '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137', 49: '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147', 50: '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157', 51: '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167', 52: '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177', 53: '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207', 54: '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217', 55: '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227', 56: '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237', 57: '\240', '\261', '\242', '\243', '\244', '\245', '\266', '\247', 58: '\250', '\271', '\272', '\273', '\274', '\255', '\256', '\277', 59: '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', 60: '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277', 61: '\340', '\341', '\342', '\303', '\344', '\345', '\346', '\347', 62: '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', 63: '\320', '\361', '\362', '\363', '\364', '\365', '\366', '\327', 64: '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\337', 65: '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347', 66: '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357', 67: '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367', 68: '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377' 69: }; 70: 71: static const unsigned short EncISO_8859_3_CtypeTable[256] = { 72: 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 73: 0x2008, 0x220c, 0x2209, 0x2208, 0x2208, 0x2208, 0x2008, 0x2008, 74: 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 75: 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 0x2008, 76: 0x2284, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 77: 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 78: 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 0x38b0, 79: 0x38b0, 0x38b0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 80: 0x21a0, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x3ca2, 0x34a2, 81: 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 82: 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 83: 0x34a2, 0x34a2, 0x34a2, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x31a0, 84: 0x21a0, 0x38e2, 0x38e2, 0x38e2, 0x38e2, 0x38e2, 0x38e2, 0x30e2, 85: 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 86: 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 87: 0x30e2, 0x30e2, 0x30e2, 0x21a0, 0x21a0, 0x21a0, 0x21a0, 0x2008, 88: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 89: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 90: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 91: 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 92: 0x0284, 0x14a2, 0x00a0, 0x00a0, 0x00a0, 0x0000, 0x14a2, 0x00a0, 93: 0x00a0, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x01a0, 0x0000, 0x14a2, 94: 0x00a0, 0x10e2, 0x10a0, 0x10a0, 0x00a0, 0x10e2, 0x10e2, 0x01a0, 95: 0x00a0, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x11a0, 0x0000, 0x10e2, 96: 0x14a2, 0x14a2, 0x14a2, 0x0000, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 97: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 98: 0x0000, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x00a0, 99: 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x14a2, 0x10e2, 100: 0x10e2, 0x10e2, 0x10e2, 0x0000, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 101: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 102: 0x0000, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x00a0, 103: 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x10e2, 0x00a0 104: }; 105: 106: static int 107: iso_8859_3_mbc_to_normalize(OnigAmbigType flag, 108: const UChar** pp, const UChar* end, UChar* lower) 109: { 110: const UChar* p = *pp; 111: 112: if (((flag & ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) != 0 && 113: ONIGENC_IS_MBC_ASCII(p)) || 114: ((flag & ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) != 0 && 115: !ONIGENC_IS_MBC_ASCII(p))) { 116: *lower = ENC_ISO_8859_3_TO_LOWER_CASE(*p); 117: } 118: else { 119: *lower = *p; 120: } 121: (*pp)++; 122: return 1; /* return byte length of converted char to lower */ 123: } 124: 125: static int 126: iso_8859_3_is_mbc_ambiguous(OnigAmbigType flag, 127: const UChar** pp, const UChar* end) 128: { 129: const UChar* p = *pp; 130: 131: (*pp)++; 132: if (((flag & ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) != 0 && 133: ONIGENC_IS_MBC_ASCII(p)) || 134: ((flag & ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) != 0 && 135: !ONIGENC_IS_MBC_ASCII(p))) { 136: int v = (EncISO_8859_3_CtypeTable[*p] & 137: (ONIGENC_CTYPE_UPPER | ONIGENC_CTYPE_LOWER)); 138: 139: if ((v | ONIGENC_CTYPE_LOWER) != 0) { 140: /* 0xdf, 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */ 141: if (*p == 0xdf || *p == 0xb5) 142: return FALSE; 143: else 144: return TRUE; 145: } 146: 147: return (v != 0 ? TRUE : FALSE); 148: } 149: return FALSE; 150: } 151: 152: static int 153: iso_8859_3_is_code_ctype(OnigCodePoint code, unsigned int ctype) 154: { 155: if (code < 256) 156: return ENC_IS_ISO_8859_3_CTYPE(code, ctype); 157: else 158: return FALSE; 159: } 160: 161: static int 162: iso_8859_3_get_all_pair_ambig_codes(OnigAmbigType flag, 163: const OnigPairAmbigCodes** ccs) 164: { 165: static const OnigPairAmbigCodes cc[] = { 166: { 0xa1, 0xb1 }, 167: { 0xa6, 0xb6 }, 168: { 0xa9, 0xb9 }, 169: { 0xaa, 0xba }, 170: { 0xab, 0xbb }, 171: { 0xac, 0xbc }, 172: { 0xaf, 0xbf }, 173: { 0xb1, 0xa1 }, 174: { 0xb6, 0xa6 }, 175: { 0xb9, 0xa9 }, 176: { 0xba, 0xaa }, 177: { 0xbb, 0xab }, 178: { 0xbc, 0xac }, 179: { 0xbf, 0xaf }, 180: 181: { 0xc0, 0xe0 }, 182: { 0xc1, 0xe1 }, 183: { 0xc2, 0xe2 }, 184: { 0xc4, 0xe4 }, 185: { 0xc5, 0xe5 }, 186: { 0xc6, 0xe6 }, 187: { 0xc7, 0xe7 }, 188: { 0xc8, 0xe8 }, 189: { 0xc9, 0xe9 }, 190: { 0xca, 0xea }, 191: { 0xcb, 0xeb }, 192: { 0xcc, 0xec }, 193: { 0xcd, 0xed }, 194: { 0xce, 0xee }, 195: { 0xcf, 0xef }, 196: 197: { 0xd1, 0xf1 }, 198: { 0xd2, 0xf2 }, 199: { 0xd3, 0xf3 }, 200: { 0xd4, 0xf4 }, 201: { 0xd5, 0xf5 }, 202: { 0xd6, 0xf6 }, 203: { 0xd8, 0xf8 }, 204: { 0xd9, 0xf9 }, 205: { 0xda, 0xfa }, 206: { 0xdb, 0xfb }, 207: { 0xdc, 0xfc }, 208: { 0xdd, 0xfd }, 209: { 0xde, 0xfe }, 210: 211: { 0xe0, 0xc0 }, 212: { 0xe1, 0xc1 }, 213: { 0xe2, 0xc2 }, 214: { 0xe4, 0xc4 }, 215: { 0xe5, 0xc5 }, 216: { 0xe6, 0xc6 }, 217: { 0xe7, 0xc7 }, 218: { 0xe8, 0xc8 }, 219: { 0xe9, 0xc9 }, 220: { 0xea, 0xca }, 221: { 0xeb, 0xcb }, 222: { 0xec, 0xcc }, 223: { 0xed, 0xcd }, 224: { 0xee, 0xce }, 225: { 0xef, 0xcf }, 226: 227: { 0xf1, 0xd1 }, 228: { 0xf2, 0xd2 }, 229: { 0xf3, 0xd3 }, 230: { 0xf4, 0xd4 }, 231: { 0xf5, 0xd5 }, 232: { 0xf6, 0xd6 }, 233: { 0xf8, 0xd8 }, 234: { 0xf9, 0xd9 }, 235: { 0xfa, 0xda }, 236: { 0xfb, 0xdb }, 237: { 0xfc, 0xdc }, 238: { 0xfd, 0xdd }, 239: { 0xfe, 0xde } 240: }; 241: 242: if (flag == ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE) { 243: *ccs = OnigAsciiPairAmbigCodes; 244: return 52; 245: } 246: if (flag == ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE) { 247: *ccs = cc; 248: return sizeof(cc) / sizeof(OnigPairAmbigCodes); 249: } 250: else 251: return 0; 252: } 253: 254: OnigEncodingType OnigEncodingISO_8859_3 = { 255: onigenc_single_byte_mbc_enc_len, 256: "ISO-8859-3", /* name */ 257: 1, /* max enc length */ 258: 1, /* min enc length */ 259: (ONIGENC_AMBIGUOUS_MATCH_ASCII_CASE | 260: ONIGENC_AMBIGUOUS_MATCH_NONASCII_CASE ), 261: { 262: (OnigCodePoint )'\\' /* esc */ 263: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.' */ 264: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*' */ 265: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */ 266: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */ 267: , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */ 268: }, 269: onigenc_is_mbc_newline_0x0a, 270: onigenc_single_byte_mbc_to_code, 271: onigenc_single_byte_code_to_mbclen, 272: onigenc_single_byte_code_to_mbc, 273: iso_8859_3_mbc_to_normalize, 274: iso_8859_3_is_mbc_ambiguous, 275: iso_8859_3_get_all_pair_ambig_codes, 276: onigenc_ess_tsett_get_all_comp_ambig_codes, 277: iso_8859_3_is_code_ctype, 278: onigenc_not_support_get_ctype_code_range, 279: onigenc_single_byte_left_adjust_char_head, 280: onigenc_always_true_is_allowed_reverse_match 281: };