1 /**********************************************************************
2 windows_1250.c - Oniguruma (regular expression library)
3 **********************************************************************/
5 * Copyright (c) 2006-2007 Byte <byte AT mail DOT kna DOT ru>
6 * K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #define ENC_CP1250_TO_LOWER_CASE(c) EncCP1250_ToLowerCaseTable[c]
35 #define ENC_IS_CP1250_CTYPE(code,ctype) \
36 ((EncCP1250_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)
38 static const UChar EncCP1250_ToLowerCaseTable
[256] = {
39 '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
40 '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
41 '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
42 '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
43 '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
44 '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
45 '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
46 '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
47 '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
48 '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
49 '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
50 '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
51 '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
52 '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
53 '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
54 '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
55 '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
56 '\210', '\211', '\232', '\213', '\234', '\235', '\236', '\237',
57 '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
58 '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
59 '\240', '\241', '\242', '\263', '\244', '\271', '\246', '\247',
60 '\250', '\251', '\272', '\253', '\254', '\255', '\256', '\277',
61 '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
62 '\270', '\271', '\272', '\273', '\276', '\275', '\276', '\277',
63 '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
64 '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
65 '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
66 '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\337',
67 '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
68 '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
69 '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
70 '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
73 static const unsigned short EncCP1250_CtypeTable
[256] = {
74 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,
75 0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,
76 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,
77 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,
78 0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,
79 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,
80 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,
81 0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,
82 0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,
83 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,
84 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,
85 0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,
86 0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,
87 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,
88 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,
89 0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,
90 0x00a0, 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,/* 8 */
91 0x0008, 0x0008, 0x34a2, 0x0008, 0x34a2, 0x34a2, 0x34a2, 0x34a2,
92 0x0000, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,/* 9 */
93 0x0008, 0x0008, 0x30e2, 0x0008, 0x30e2, 0x30e2, 0x30e2, 0x30e2,
94 0x0284, 0x01a0, 0x00a0, 0x34a2, 0x00a0, 0x34a2, 0x00a0, 0x00a0,/* A */
95 0x00a0, 0x00a0, 0x34a2, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x34a2,
96 0x00a0, 0x00a0, 0x10a0, 0x30e2, 0x00a0, 0x30e2, 0x00a0, 0x01a0,/* B */
97 0x00a0, 0x30e2, 0x30e2, 0x01a0, 0x34a2, 0x10a0, 0x30e2, 0x30e2,
98 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,/* C */
99 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,
100 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,/* D */
101 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,
102 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,/* E */
103 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,
104 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,/* F */
105 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,
109 cp1250_mbc_case_fold(OnigCaseFoldType flag ARG_UNUSED
,
110 const UChar
** pp
, const UChar
* end ARG_UNUSED
, UChar
* lower
, OnigEncoding enc ARG_UNUSED
)
112 const UChar
* p
= *pp
;
114 *lower
= ENC_CP1250_TO_LOWER_CASE(*p
);
120 cp1250_is_code_ctype(OnigCodePoint code
, unsigned int ctype
, OnigEncoding enc ARG_UNUSED
)
123 return ENC_IS_CP1250_CTYPE(code
, ctype
);
128 static const OnigPairCaseFoldCodes CaseFoldMap
[] = {
176 cp1250_apply_all_case_fold(OnigCaseFoldType flag
,
177 OnigApplyAllCaseFoldFunc f
, void* arg
, OnigEncoding enc ARG_UNUSED
)
179 return onigenc_apply_all_case_fold_with_map(
180 sizeof(CaseFoldMap
)/sizeof(OnigPairCaseFoldCodes
), CaseFoldMap
, 1,
185 cp1250_get_case_fold_codes_by_str(OnigCaseFoldType flag
,
186 const OnigUChar
* p
, const OnigUChar
* end
, OnigCaseFoldCodeItem items
[], OnigEncoding enc ARG_UNUSED
)
188 return onigenc_get_case_fold_codes_by_str_with_map(
189 sizeof(CaseFoldMap
)/sizeof(OnigPairCaseFoldCodes
), CaseFoldMap
, 1,
190 flag
, p
, end
, items
);
194 case_map(OnigCaseFoldType
* flagP
, const OnigUChar
** pp
,
195 const OnigUChar
* end
, OnigUChar
* to
, OnigUChar
* to_end
,
196 const struct OnigEncodingTypeST
* enc
)
199 OnigUChar
*to_start
= to
;
200 OnigCaseFoldType flags
= *flagP
;
202 while (*pp
< end
&& to
< to_end
) {
204 if (code
== SHARP_s
) {
205 if (flags
& ONIGENC_CASE_UPCASE
) {
206 flags
|= ONIGENC_CASE_MODIFIED
;
208 code
= (flags
& ONIGENC_CASE_TITLECASE
) ? 's' : 'S';
210 else if (flags
& ONIGENC_CASE_FOLD
) {
211 flags
|= ONIGENC_CASE_MODIFIED
;
216 else if ((EncCP1250_CtypeTable
[code
] & BIT_CTYPE_UPPER
)
217 && (flags
& (ONIGENC_CASE_DOWNCASE
| ONIGENC_CASE_FOLD
))) {
218 flags
|= ONIGENC_CASE_MODIFIED
;
219 code
= ENC_CP1250_TO_LOWER_CASE(code
);
221 else if (code
== 0xB5)
223 else if ((EncCP1250_CtypeTable
[code
]&BIT_CTYPE_LOWER
)
224 && (flags
& ONIGENC_CASE_UPCASE
)) {
225 flags
|= ONIGENC_CASE_MODIFIED
;
228 else if (code
== 0xBE)
230 else if (code
>= 0x8A && code
<= 0xBF && code
!=0xB9)
236 if (flags
& ONIGENC_CASE_TITLECASE
) /* switch from titlecase to lowercase for capitalize */
237 flags
^= (ONIGENC_CASE_UPCASE
| ONIGENC_CASE_DOWNCASE
| ONIGENC_CASE_TITLECASE
);
240 return (int )(to
- to_start
);
243 OnigEncodingDefine(windows_1250
, Windows_1250
) = {
244 onigenc_single_byte_mbc_enc_len
,
245 "Windows-1250", /* name */
246 1, /* max enc length */
247 1, /* min enc length */
248 onigenc_is_mbc_newline_0x0a
,
249 onigenc_single_byte_mbc_to_code
,
250 onigenc_single_byte_code_to_mbclen
,
251 onigenc_single_byte_code_to_mbc
,
252 cp1250_mbc_case_fold
,
253 cp1250_apply_all_case_fold
,
254 cp1250_get_case_fold_codes_by_str
,
255 onigenc_minimum_property_name_to_ctype
,
256 cp1250_is_code_ctype
,
257 onigenc_not_support_get_ctype_code_range
,
258 onigenc_single_byte_left_adjust_char_head
,
259 onigenc_always_true_is_allowed_reverse_match
,
267 * Link: http://www.iana.org/assignments/character-sets
268 * Link: http://www.microsoft.com/globaldev/reference/sbcs/1250.mspx
269 * Link: https://en.wikipedia.org/wiki/Windows-1250
271 ENC_ALIAS("CP1250", "Windows-1250")