| 643 | */ |
| 644 | |
| 645 | static int |
| 646 | yaml_check_utf8(yaml_char_t *start, size_t length) |
| 647 | { |
| 648 | yaml_char_t *end = start+length; |
| 649 | yaml_char_t *pointer = start; |
| 650 | |
| 651 | while (pointer < end) { |
| 652 | unsigned char octet; |
| 653 | unsigned int width; |
| 654 | unsigned int value; |
| 655 | size_t k; |
| 656 | |
| 657 | octet = pointer[0]; |
| 658 | width = (octet & 0x80) == 0x00 ? 1 : |
| 659 | (octet & 0xE0) == 0xC0 ? 2 : |
| 660 | (octet & 0xF0) == 0xE0 ? 3 : |
| 661 | (octet & 0xF8) == 0xF0 ? 4 : 0; |
| 662 | value = (octet & 0x80) == 0x00 ? octet & 0x7F : |
| 663 | (octet & 0xE0) == 0xC0 ? octet & 0x1F : |
| 664 | (octet & 0xF0) == 0xE0 ? octet & 0x0F : |
| 665 | (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; |
| 666 | if (!width) return 0; |
| 667 | if (pointer+width > end) return 0; |
| 668 | for (k = 1; k < width; k ++) { |
| 669 | octet = pointer[k]; |
| 670 | if ((octet & 0xC0) != 0x80) return 0; |
| 671 | value = (value << 6) + (octet & 0x3F); |
| 672 | } |
| 673 | if (!((width == 1) || |
| 674 | (width == 2 && value >= 0x80) || |
| 675 | (width == 3 && value >= 0x800) || |
| 676 | (width == 4 && value >= 0x10000))) return 0; |
| 677 | |
| 678 | pointer += width; |
| 679 | } |
| 680 | |
| 681 | return 1; |
| 682 | } |
| 683 | |
| 684 | /* |
| 685 | * Create STREAM-START. |
no outgoing calls
no test coverage detected