1078 |
} |
} |
1079 |
|
|
1080 |
|
|
1081 |
|
/* Fixme: deal with surrogates? */ |
1082 |
static void |
static void |
1083 |
decode_coding_utf_8 (coding) |
decode_coding_utf_8 (coding) |
1084 |
struct coding_system *coding; |
struct coding_system *coding; |
1127 |
if (! UTF_8_EXTRA_OCTET_P (c2)) |
if (! UTF_8_EXTRA_OCTET_P (c2)) |
1128 |
goto invalid_code; |
goto invalid_code; |
1129 |
if (UTF_8_2_OCTET_LEADING_P (c1)) |
if (UTF_8_2_OCTET_LEADING_P (c1)) |
1130 |
c = ((c1 & 0x1F) << 6) | (c2 & 0x3F); |
{ |
1131 |
|
c = ((c1 & 0x1F) << 6) | (c2 & 0x3F); |
1132 |
|
/* Reject overlong sequences here and below. Encoders |
1133 |
|
producing them are incorrect, they can be misleading, |
1134 |
|
and they mess up read/write invariance. */ |
1135 |
|
if (c < 128) |
1136 |
|
goto invalid_code; |
1137 |
|
} |
1138 |
else |
else |
1139 |
{ |
{ |
1140 |
ONE_MORE_BYTE (c3); |
ONE_MORE_BYTE (c3); |
1141 |
if (! UTF_8_EXTRA_OCTET_P (c3)) |
if (! UTF_8_EXTRA_OCTET_P (c3)) |
1142 |
goto invalid_code; |
goto invalid_code; |
1143 |
if (UTF_8_3_OCTET_LEADING_P (c1)) |
if (UTF_8_3_OCTET_LEADING_P (c1)) |
1144 |
c = (((c1 & 0xF) << 12) |
{ |
1145 |
| ((c2 & 0x3F) << 6) | (c3 & 0x3F)); |
c = (((c1 & 0xF) << 12) |
1146 |
|
| ((c2 & 0x3F) << 6) | (c3 & 0x3F)); |
1147 |
|
if (c < 0x800) |
1148 |
|
goto invalid_code; |
1149 |
|
} |
1150 |
else |
else |
1151 |
{ |
{ |
1152 |
ONE_MORE_BYTE (c4); |
ONE_MORE_BYTE (c4); |
1153 |
if (! UTF_8_EXTRA_OCTET_P (c4)) |
if (! UTF_8_EXTRA_OCTET_P (c4)) |
1154 |
goto invalid_code; |
goto invalid_code; |
1155 |
if (UTF_8_4_OCTET_LEADING_P (c1)) |
if (UTF_8_4_OCTET_LEADING_P (c1)) |
1156 |
|
{ |
1157 |
c = (((c1 & 0x7) << 18) | ((c2 & 0x3F) << 12) |
c = (((c1 & 0x7) << 18) | ((c2 & 0x3F) << 12) |
1158 |
| ((c3 & 0x3F) << 6) | (c4 & 0x3F)); |
| ((c3 & 0x3F) << 6) | (c4 & 0x3F)); |
1159 |
|
if (c < 0x10000) |
1160 |
|
goto invalid_code; |
1161 |
|
} |
1162 |
else |
else |
1163 |
{ |
{ |
1164 |
ONE_MORE_BYTE (c5); |
ONE_MORE_BYTE (c5); |
1169 |
c = (((c1 & 0x3) << 24) | ((c2 & 0x3F) << 18) |
c = (((c1 & 0x3) << 24) | ((c2 & 0x3F) << 18) |
1170 |
| ((c3 & 0x3F) << 12) | ((c4 & 0x3F) << 6) |
| ((c3 & 0x3F) << 12) | ((c4 & 0x3F) << 6) |
1171 |
| (c5 & 0x3F)); |
| (c5 & 0x3F)); |
1172 |
if (c > MAX_CHAR) |
if ((c > MAX_CHAR) || (c < 0x200000)) |
1173 |
goto invalid_code; |
goto invalid_code; |
1174 |
} |
} |
1175 |
else |
else |