37 template<
typename T,
typename Transform>
41 size_t avail =
s.size();
42 const char *ptr =
s.data();
48 if ((*ptr & 0x80) == 0)
53 else if ((*ptr & 0xe0) == 0xc0)
56 throw std::runtime_error(
"Invalid UTF-8");
57 cp = (*ptr++ & 0x1f) << 6;
62 else if ((*ptr & 0xf0) == 0xe0)
65 throw std::runtime_error(
"Invalid UTF-8");
66 cp = (*ptr++ & 0xf) << 12;
67 cp |= (*ptr++ & 0x3f) << 6;
72 else if ((*ptr & 0xf8) == 0xf0)
75 throw std::runtime_error(
"Invalid UTF-8");
76 cp = (*ptr++ & 0x7) << 18;
77 cp |= (*ptr++ & 0x3f) << 12;
78 cp |= (*ptr++ & 0x3f) << 6;
84 throw std::runtime_error(
"Invalid UTF-8");
91 else if (cp <= 0xffff)
93 else if (cp <= 0x10ffff)
96 throw std::runtime_error(
"Invalid code point UTF-8 transformation");
101 case 1: *wptr++ = cp;
break;
102 case 2: *wptr++ = 0xc0 | (cp >> 6); *wptr++ = 0x80 | (cp & 0x3f);
break;
103 case 3: *wptr++ = 0xe0 | (cp >> 12); *wptr++ = 0x80 | ((cp >> 6) & 0x3f); *wptr++ = 0x80 | (cp & 0x3f);
break;
104 case 4: *wptr++ = 0xf0 | (cp >> 18); *wptr++ = 0x80 | ((cp >> 12) & 0x3f); *wptr++ = 0x80 | ((cp >> 6) & 0x3f); *wptr++ = 0x80 | (cp & 0x3f);
break;
105 default:
throw std::runtime_error(
"Invalid UTF-8");
108 sc.append(wbuf, bytes);
#define s(x, c)
Definition: aesb.c:47
static void Transform(hashState *ctx, const uint8_t *input, int msglen)
Definition: groestl.c:171
const uint32_t T[512]
Definition: groestl_tables.h:36