| 1002 | } |
| 1003 | |
| 1004 | xml_encoding guess_buffer_encoding(uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3) |
| 1005 | { |
| 1006 | // look for BOM in first few bytes |
| 1007 | if (d0 == 0 && d1 == 0 && d2 == 0xfe && d3 == 0xff) return encoding_utf32_be; |
| 1008 | if (d0 == 0xff && d1 == 0xfe && d2 == 0 && d3 == 0) return encoding_utf32_le; |
| 1009 | if (d0 == 0xfe && d1 == 0xff) return encoding_utf16_be; |
| 1010 | if (d0 == 0xff && d1 == 0xfe) return encoding_utf16_le; |
| 1011 | if (d0 == 0xef && d1 == 0xbb && d2 == 0xbf) return encoding_utf8; |
| 1012 | |
| 1013 | // look for <, <? or <?xm in various encodings |
| 1014 | if (d0 == 0 && d1 == 0 && d2 == 0 && d3 == 0x3c) return encoding_utf32_be; |
| 1015 | if (d0 == 0x3c && d1 == 0 && d2 == 0 && d3 == 0) return encoding_utf32_le; |
| 1016 | if (d0 == 0 && d1 == 0x3c && d2 == 0 && d3 == 0x3f) return encoding_utf16_be; |
| 1017 | if (d0 == 0x3c && d1 == 0 && d2 == 0x3f && d3 == 0) return encoding_utf16_le; |
| 1018 | if (d0 == 0x3c && d1 == 0x3f && d2 == 0x78 && d3 == 0x6d) return encoding_utf8; |
| 1019 | |
| 1020 | // look for utf16 < followed by node name (this may fail, but is better than utf8 since it's zero terminated so early) |
| 1021 | if (d0 == 0 && d1 == 0x3c) return encoding_utf16_be; |
| 1022 | if (d0 == 0x3c && d1 == 0) return encoding_utf16_le; |
| 1023 | |
| 1024 | // no known BOM detected, assume utf8 |
| 1025 | return encoding_utf8; |
| 1026 | } |
| 1027 | |
| 1028 | xml_encoding get_buffer_encoding(xml_encoding encoding, const void* contents, size_t size) |
| 1029 | { |
no outgoing calls
no test coverage detected