#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; }