blob: fe41e7ad7c824947260f2dd75a3f6a2aa2018c1e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include "internal.h"
int
utf8ยทbytetorune(rune* r, byte* s)
{
int c[UTFmax], i;
rune l;
c[0] = *(ubyte*)(s);
if(c[0] < Tx) {
*r = c[0];
return 1;
}
l = c[0];
for(i = 1; i < UTFmax; i++) {
c[i] = *(ubyte*)(s+i);
c[i] ^= Tx;
if (c[i] & Testx) goto bad;
l = (l << Bitx) | c[i];
if(c[0] < Tbyte(i + 2)) {
l &= RuneX(i + 1);
if (i == 1) {
if (c[0] < Tbyte(2) || l <= Rune1)
goto bad;
} else if (l <= RuneX(i) || l > RuneMax)
goto bad;
if (i == 2 && SurrogateMin <= l && l <= SurrogateMax)
goto bad;
*r = l;
return i + 1;
}
}
bad:
*r = RuneErr;
return 1;
}
|