| 1106 | } |
| 1107 | |
| 1108 | PUGI__FN xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) |
| 1109 | { |
| 1110 | // look for BOM in first few bytes |
| 1111 | if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be; |
| 1112 | if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le; |
| 1113 | if (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be; |
| 1114 | if (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le; |
| 1115 | if (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8; |
| 1116 | |
| 1117 | // look for <, <? or <?xm in various encodings |
| 1118 | if (d0 == 0 && d1 == 0 && d2 == 0 && d3 == 0x3c) return encoding_utf32_be; |
| 1119 | if (d0 == 0x3c && d1 == 0 && d2 == 0 && d3 == 0) return encoding_utf32_le; |
| 1120 | if (d0 == 0 && d1 == 0x3c && d2 == 0 && d3 == 0x3f) return encoding_utf16_be; |
| 1121 | if (d0 == 0x3c && d1 == 0 && d2 == 0x3f && d3 == 0) return encoding_utf16_le; |
| 1122 | if (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d) return encoding_utf8; |
| 1123 | |
| 1124 | // look for utf16 < followed by node name (this may fail, but is better than utf8 since it's zero terminated so early) |
| 1125 | if (d0 == 0 && d1 == 0x3c) return encoding_utf16_be; |
| 1126 | if (d0 == 0x3c && d1 == 0) return encoding_utf16_le; |
| 1127 | |
| 1128 | // no known BOM detected, assume utf8 |
| 1129 | return encoding_utf8; |
| 1130 | } |
| 1131 | |
| 1132 | PUGI__FN xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size) |
| 1133 | { |
nothing calls this directly
no outgoing calls
no test coverage detected