MCPcopy Create free account
hub / github.com/commonmark/cmark / utf8proc_valid

Function utf8proc_valid

src/utf8.c:49–108  ·  view source on GitHub ↗

Validate a single UTF-8 character according to RFC 3629.

Source from the content-addressed store, hash-verified

47
48// Validate a single UTF-8 character according to RFC 3629.
49static int utf8proc_valid(const uint8_t *str, bufsize_t str_len) {
50 int length = utf8proc_utf8class[str[0]];
51
52 if (!length)
53 return -1;
54
55 if ((bufsize_t)length > str_len)
56 return -str_len;
57
58 switch (length) {
59 case 2:
60 if ((str[1] & 0xC0) != 0x80)
61 return -1;
62 if (str[0] < 0xC2) {
63 // Overlong
64 return -length;
65 }
66 break;
67
68 case 3:
69 if ((str[1] & 0xC0) != 0x80)
70 return -1;
71 if ((str[2] & 0xC0) != 0x80)
72 return -2;
73 if (str[0] == 0xE0) {
74 if (str[1] < 0xA0) {
75 // Overlong
76 return -length;
77 }
78 } else if (str[0] == 0xED) {
79 if (str[1] >= 0xA0) {
80 // Surrogate
81 return -length;
82 }
83 }
84 break;
85
86 case 4:
87 if ((str[1] & 0xC0) != 0x80)
88 return -1;
89 if ((str[2] & 0xC0) != 0x80)
90 return -2;
91 if ((str[3] & 0xC0) != 0x80)
92 return -3;
93 if (str[0] == 0xF0) {
94 if (str[1] < 0x90) {
95 // Overlong
96 return -length;
97 }
98 } else if (str[0] >= 0xF4) {
99 if (str[0] > 0xF4 || str[1] >= 0x90) {
100 // Above 0x10FFFF
101 return -length;
102 }
103 }
104 break;
105 }
106

Callers 1

cmark_utf8proc_checkFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected