@@ -966,91 +966,95 @@ static size_t mb_sjismac_to_wchar(unsigned char **in, size_t *in_len, uint32_t *
966
966
break ;
967
967
}
968
968
unsigned char c2 = * p ++ ;
969
+ uint32_t w = sjis_decode_tbl1 [c ] + sjis_decode_tbl2 [c2 ];
969
970
970
- if (c2 >= 0x40 && c2 <= 0xFC && c2 != 0x7F ) {
971
- unsigned int w = 0 , s1 = 0 , s2 = 0 ;
972
- SJIS_DECODE (c , c2 , s1 , s2 );
973
- unsigned int s = (s1 - 0x21 )* 94 + s2 - 0x21 ;
974
-
975
- if (s <= 0x89 ) {
976
- if (s == 0x1C ) {
977
- w = 0x2014 ; /* EM DASH */
978
- } else if (s == 0x1F ) {
979
- w = 0xFF3C ; /* FULLWIDTH REVERSE SOLIDUS */
980
- } else if (s == 0x20 ) {
981
- w = 0x301C ; /* FULLWIDTH TILDE */
982
- } else if (s == 0x21 ) {
983
- w = 0x2016 ; /* PARALLEL TO */
984
- } else if (s == 0x3C ) {
985
- w = 0x2212 ; /* FULLWIDTH HYPHEN-MINUS */
986
- } else if (s == 0x50 ) {
987
- w = 0xA2 ; /* FULLWIDTH CENT SIGN */
988
- } else if (s == 0x51 ) {
989
- w = 0xA3 ; /* FULLWIDTH POUND SIGN */
990
- } else if (s == 0x89 ) {
991
- w = 0xAC ; /* FULLWIDTH NOT SIGN */
992
- }
993
- if (w ) {
994
- * out ++ = w ;
995
- continue ;
996
- }
971
+ if (w <= 0x89 ) {
972
+ if (w == 0x1C ) {
973
+ * out ++ = 0x2014 ; /* EM DASH */
974
+ continue ;
975
+ } else if (w == 0x1F ) {
976
+ * out ++ = 0xFF3C ; /* FULLWIDTH REVERSE SOLIDUS */
977
+ continue ;
978
+ } else if (w == 0x20 ) {
979
+ * out ++ = 0x301C ; /* FULLWIDTH TILDE */
980
+ continue ;
981
+ } else if (w == 0x21 ) {
982
+ * out ++ = 0x2016 ; /* PARALLEL TO */
983
+ continue ;
984
+ } else if (w == 0x3C ) {
985
+ * out ++ = 0x2212 ; /* FULLWIDTH HYPHEN-MINUS */
986
+ continue ;
987
+ } else if (w == 0x50 ) {
988
+ * out ++ = 0xA2 ; /* FULLWIDTH CENT SIGN */
989
+ continue ;
990
+ } else if (w == 0x51 ) {
991
+ * out ++ = 0xA3 ; /* FULLWIDTH POUND SIGN */
992
+ continue ;
993
+ } else if (w == 0x89 ) {
994
+ * out ++ = 0xAC ; /* FULLWIDTH NOT SIGN */
995
+ continue ;
997
996
}
998
-
999
- for (int i = 0 ; i < 7 ; i ++ ) {
1000
- if (s >= code_tbl [i ][0 ] && s <= code_tbl [i ][1 ]) {
1001
- * out ++ = s - code_tbl [i ][0 ] + code_tbl [i ][2 ];
1002
- goto next_iteration ;
997
+ } else {
998
+ if (w >= 0x2F0 && w <= 0x3A3 ) {
999
+ for (int i = 0 ; i < 7 ; i ++ ) {
1000
+ if (w >= code_tbl [i ][0 ] && w <= code_tbl [i ][1 ]) {
1001
+ * out ++ = w - code_tbl [i ][0 ] + code_tbl [i ][2 ];
1002
+ goto next_iteration ;
1003
+ }
1003
1004
}
1004
1005
}
1005
1006
1006
- for (int i = 0 ; i < code_tbl_m_len ; i ++ ) {
1007
- if (s == code_tbl_m [i ][0 ]) {
1008
- int n = 5 ;
1009
- if (code_tbl_m [i ][1 ] == 0xF860 ) {
1010
- n = 3 ;
1011
- } else if (code_tbl_m [i ][1 ] == 0xF861 ) {
1012
- n = 4 ;
1013
- }
1014
- if ((limit - out ) < n ) {
1015
- p -= 2 ;
1016
- goto finished ;
1017
- }
1018
- for (int j = 1 ; j <= n ; j ++ ) {
1019
- * out ++ = code_tbl_m [i ][j ];
1007
+ if (w >= 0x340 && w <= 0x523 ) {
1008
+ for (int i = 0 ; i < code_tbl_m_len ; i ++ ) {
1009
+ if (w == code_tbl_m [i ][0 ]) {
1010
+ int n = 5 ;
1011
+ if (code_tbl_m [i ][1 ] == 0xF860 ) {
1012
+ n = 3 ;
1013
+ } else if (code_tbl_m [i ][1 ] == 0xF861 ) {
1014
+ n = 4 ;
1015
+ }
1016
+ if ((limit - out ) < n ) {
1017
+ p -= 2 ;
1018
+ goto finished ;
1019
+ }
1020
+ for (int j = 1 ; j <= n ; j ++ ) {
1021
+ * out ++ = code_tbl_m [i ][j ];
1022
+ }
1023
+ goto next_iteration ;
1020
1024
}
1021
- goto next_iteration ;
1022
1025
}
1023
1026
}
1024
1027
1025
- for (int i = 0 ; i < 8 ; i ++ ) {
1026
- if (s >= code_ofst_tbl [i ][0 ] && s <= code_ofst_tbl [i ][1 ]) {
1027
- w = code_map [i ][s - code_ofst_tbl [i ][0 ]];
1028
- if (!w ) {
1029
- * out ++ = MBFL_BAD_INPUT ;
1028
+ if (w >= 0x3AC && w <= 0x20A5 ) {
1029
+ for (int i = 0 ; i < 8 ; i ++ ) {
1030
+ if (w >= code_ofst_tbl [i ][0 ] && w <= code_ofst_tbl [i ][1 ]) {
1031
+ uint32_t w2 = code_map [i ][w - code_ofst_tbl [i ][0 ]];
1032
+ if (!w2 ) {
1033
+ * out ++ = MBFL_BAD_INPUT ;
1034
+ goto next_iteration ;
1035
+ }
1036
+ if ((limit - out ) < 2 ) {
1037
+ p -= 2 ;
1038
+ goto finished ;
1039
+ }
1040
+ * out ++ = w2 ;
1041
+ if (w >= 0x43E && w <= 0x441 ) {
1042
+ * out ++ = 0xF87A ;
1043
+ } else if (w == 0x3B1 || w == 0x3B7 ) {
1044
+ * out ++ = 0xF87F ;
1045
+ } else if (w == 0x4B8 || w == 0x4B9 || w == 0x4C4 ) {
1046
+ * out ++ = 0x20DD ;
1047
+ } else if (w == 0x1ED9 || w == 0x1EDA || w == 0x1EE8 || w == 0x1EF3 || (w >= 0x1EF5 && w <= 0x1EFB ) || w == 0x1F05 || w == 0x1F06 || w == 0x1F18 || (w >= 0x1FF2 && w <= 0x20A5 )) {
1048
+ * out ++ = 0xF87E ;
1049
+ }
1030
1050
goto next_iteration ;
1031
1051
}
1032
- if ((limit - out ) < 2 ) {
1033
- p -= 2 ;
1034
- goto finished ;
1035
- }
1036
- * out ++ = w ;
1037
- if (s >= 0x43E && s <= 0x441 ) {
1038
- * out ++ = 0xF87A ;
1039
- } else if (s == 0x3B1 || s == 0x3B7 ) {
1040
- * out ++ = 0xF87F ;
1041
- } else if (s == 0x4B8 || s == 0x4B9 || s == 0x4C4 ) {
1042
- * out ++ = 0x20DD ;
1043
- } else if (s == 0x1ED9 || s == 0x1EDA || s == 0x1EE8 || s == 0x1EF3 || (s >= 0x1EF5 && s <= 0x1EFB ) || s == 0x1F05 || s == 0x1F06 || s == 0x1F18 || (s >= 0x1FF2 && s <= 0x20A5 )) {
1044
- * out ++ = 0xF87E ;
1045
- }
1046
- goto next_iteration ;
1047
1052
}
1048
1053
}
1054
+ }
1049
1055
1050
- if (s < jisx0208_ucs_table_size ) {
1051
- w = jisx0208_ucs_table [s ];
1052
- }
1053
-
1056
+ if (w < jisx0208_ucs_table_size ) {
1057
+ w = jisx0208_ucs_table [w ];
1054
1058
if (!w )
1055
1059
w = MBFL_BAD_INPUT ;
1056
1060
* out ++ = w ;
0 commit comments