MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / yaml_check_utf8

Function yaml_check_utf8

xs/tools/yaml/api.c:645–682  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

643 */
644
645static int
646yaml_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.

Calls

no outgoing calls

Tested by

no test coverage detected