From: Nikita Popov Date: Wed, 22 Nov 2017 22:47:18 +0000 (+0100) Subject: Fix cp950 pua check X-Git-Tag: php-7.3.0alpha1~967 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d21c902841676070d57fec8e158d9b1d9de30793;p=php Fix cp950 pua check One set of parenthesis was missing, causing a legitimate compiler warnings. In the end it doesn't actually matter, because it just ends up doing an unnecessary check in the w > 0 case. This fixes the logic and moves it out into a separate functions, to be a bit more readable. --- diff --git a/ext/mbstring/libmbfl/filters/mbfilter_big5.c b/ext/mbstring/libmbfl/filters/mbfilter_big5.c index 21aac8ea7b..6b845f2bf9 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_big5.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_big5.c @@ -142,6 +142,17 @@ static unsigned short cp950_pua_tbl[][4] = { {0xf70f,0xf848,0xc740,0xc8fe}, }; +static inline int is_in_cp950_pua(int c1, int c) { + if ((c1 >= 0xfa && c1 <= 0xfe) || (c1 >= 0x8e && c1 <= 0xa0) || + (c1 >= 0x81 && c1 <= 0x8d) || (c1 >= 0xc7 && c1 <= 0xc8)) { + return (c > 0x39 && c < 0x7f) || (c > 0xa0 && c < 0xff); + } + if (c1 == 0xc6) { + return c > 0xa0 && c < 0xff; + } + return 0; +} + /* * Big5 => wchar */ @@ -190,11 +201,7 @@ mbfl_filt_conv_big5_wchar(int c, mbfl_convert_filter *filter) if (filter->from->no_encoding == mbfl_no_encoding_cp950) { /* PUA for CP950 */ - if (w <= 0 && - (((c1 >= 0xfa && c1 <= 0xfe) || (c1 >= 0x8e && c1 <= 0xa0) || - (c1 >= 0x81 && c1 <= 0x8d) ||(c1 >= 0xc7 && c1 <= 0xc8)) - && ((c > 0x39 && c < 0x7f) || (c > 0xa0 && c < 0xff))) || - ((c1 == 0xc6) && (c > 0xa0 && c < 0xff))) { + if (w <= 0 && is_in_cp950_pua(c1, c)) { c2 = c1 << 8 | c; for (k = 0; k < sizeof(cp950_pua_tbl)/(sizeof(unsigned short)*4); k++) { if (c2 >= cp950_pua_tbl[k][2] && c2 <= cp950_pua_tbl[k][3]) {