История изменений
Исправление firkax, (текущая версия) :
то там не полстраницы. Там много кейсов
Поскольку непонятно какой там интерфейс, оставим его в свободной форме. Примерно так:
parse_utf8(uchar const *src, size_t srcsz) {
uchar c1, c2, c3, c4;
uint32 uc;
while(srcsz) {
c1 = *src;
if(c1<=0x7F) { printf("Symbol: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xBF || c1>0xF7) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(srcsz<2) { printf("Truncated input: %02X\n", c1); break; }
if(((c2=src[1])&0xC0)!=0x80) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xDF) { uc = ((c1&0x1F)<<6) | (c2&0x3F); len = 2; }
else {
if(srcsz<3) { printf("Truncated input: %02X %02X\n", c1, c2); break; }
if(((c3=src[2])&0xC0)!=0x80) { printf("Invalid input: %02X %02X\n", c1, c2); src+=2; srcsz-=2; continue; }
if(c1<=0xEF) { uc = ((c1&0x0F)<<12) | ((c2&0x3F)<<6) | (c3&0x3F); len = 3; }
else {
if(srcsz<4) { printf("Truncated input: %02X %02X %02X\n", c1, c2, c3); break; }
if(((c4=src[3])&0xC0)!=0x80) { printf("Invalid input: %02X %02X %02X\n", c1, c2, c3); src+=3; srcsz-=3; continue; }
uc = ((((uint32)c1)&7)<<18) | ((((uint32)c2)&0x3F)<<12) | ((c3&0x3F)<<6) | (c4&0x3F); len = 4;
}
}
if(uc<=0x7F || uc<=0x7FF && len>2 || uc<=0xFFFF && len>3 || uc>0x10FFFF || uc>=0xFDD0 && uc<=0xFDEF || (uc&0xFFFE)==0xFFFE || uc>=0xD800 && uc<=0xDFFF)
printf("Malformed symbol: %08lX\n", (ulong)uc);
else
printf("Symbol: %08lX\n", (ulong)uc);
src+=len; srcsz-=len;
}
}
Исправление firkax, :
то там не полстраницы. Там много кейсов
Поскольку непонятно какой там интерфейс, оставим его в свободной форме. Примерно так:
parse_utf8(uchar const *src, size_t srcsz) {
uchar c1, c2, c3, c4;
uint32 uc;
while(srcsz) {
c1 = *src;
if(c1<=0x7F) { printf("Symbol: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xBF || c1>0xF7) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(srcsz<2) { printf("Truncated input: %02X\n", c1); break; }
if(((c2=src[1])&0xC0)!=0x80) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xDF) { uc = ((c1&0x1F)<<6) | (c2&0x3F); len = 2; }
else {
if(srcsz<3) { printf("Truncated input: %02X %02X\n", c1, c2); break; }
if(((c3=src[2])&0xC0)!=0x80) { printf("Invalid input: %02X %02X\n", c1, c2); src+=2; srcsz-=2; continue; }
if(c1<=0xEF) { uc = ((c1&0x0F)<<12) | ((c2&0x3F)<<6) | (c3&0x3F); len = 3; }
else {
if(srcsz<4) { printf("Truncated input: %02X %02X %02X\n", c1, c2, c3); break; }
if(((c4=src[3])&0xC0)!=0x80) { printf("Invalid input: %02X %02X %02X\n", c1, c2, c3); src+=3; srcsz-=3; continue; }
uc = ((((uint32)c1)&0x0F)<<18) | ((((uint32)c2)&0x3F)<<12) | ((c3&0x3F)<<6) | (c4&0x3F); len = 4;
}
}
if(uc<=0x7F || uc<=0x7FF && len>2 || uc<=0xFFFF && len>3 || uc>0x10FFFF || uc>=0xFDD0 && uc<=0xFDEF || (uc&0xFFFE)==0xFFFE || uc>=0xD800 && uc<=0xDFFF)
printf("Malformed symbol: %08lX\n", (ulong)uc);
else
printf("Symbol: %08lX\n", (ulong)uc);
src+=len; srcsz-=len;
}
}
Исправление firkax, :
то там не полстраницы. Там много кейсов
Поскольку непонятно какой там интерфейс, оставим его в свободной форме. Примерно так:
parse_utf8(uchar const *src, size_t srcsz) {
uchar c1, c2, c3, c4;
uint32 uc;
while(srcsz) {
c1 = *src;
if(c1<=0x7F) { printf("Symbol: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xBF || c1>0xF7) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(srcsz<2) { printf("Truncated input: %02X\n", c1); break; }
if(((c2=src[1])&0xC0)!=0x80) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xDF) { uc = ((c1&0x1F)<<6) | (c2&0x3F); len = 2; }
else {
if(srcsz<3) { printf("Truncated input: %02X %02X\n", c1, c2); break; }
if(((c3=src[2])&0xC0)!=0x80) { printf("Invalid input: %02X %02X\n", c1, c2); src+=2; srcsz-=2; continue; }
if(c1<=0xEF) { uc = ((c1&0x0F)<<12) | ((c2&0x3F)<<6) | (c3&0x3F); len = 3; }
else {
if(srcsz<4) { printf("Truncated input: %02X %02X %02X\n", c1, c2, c3); break; }
if(((c4=src[3])&0xC0)!=0x80) { printf("Invalid input: %02X %02X %02X\n", c1, c2, c3); src+=3; srcsz-=3; continue; }
uc = ((c1&0x0F)<<18) | ((c2&0x3F)<<12) | ((c3&0x3F)<<6) | (c4&0x3F); len = 4;
}
}
if(uc<=0x7F || uc<=0x7FF && len>2 || uc<=0xFFFF && len>3 || uc>0x10FFFF || uc>=0xFDD0 && uc<=0xFDEF || (uc&0xFFFE)==0xFFFE || uc>=0xD800 && uc<=0xDFFF)
printf("Malformed symbol: %08lX\n", (ulong)uc);
else
printf("Symbol: %08lX\n", (ulong)uc);
src+=len; srcsz-=len;
}
}
Исправление firkax, :
то там не полстраницы. Там много кейсов
Поскольку непонятно какой там интерфейс, оставим его в свободной форме. Примерно так:
parse_utf8(uchar const *src, size_t srcsz) {
uchar c1, c2, c3, c4;
uint32 uc;
while(srcsz) {
c1 = *src;
if(c1<=0x7F) { printf("Symbol: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xBF || c1>0xF7) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(srcsz<2) { printf("Truncated input: %02X\n", c1); break; }
if(((c2=src[1])&0xC0)!=0x80) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xDF) { uc = ((c1&0x1F)<<6) | (c2&0x3F); len = 2; }
else {
if(srcsz<3) { printf("Truncated input: %02X %02X\n", c1, c2); break; }
if(((c3=src[2])&0xC0)!=0x80) { printf("Invalid input: %02X %02X\n", c1, c2); src+=2; srcsz-=2; continue; }
if(c1<=0xEF) { uc = ((c1&0x0F)<<12) | ((c2&0x3F)<<6) | (c3&0x3F); len = 3; }
else {
if(srcsz<4) { printf("Truncated input: %02X %02X %02X\n", c1, c2, c3); break; }
if(((c4=src[3])&0xC0)!=0x80) { printf("Invalid input: %02X %02X %02X\n", c1, c2, c3); src+=3; srcsz-=3; continue; }
uc = ((c1&0x0F)<<18) | ((c2&0x3F)<<12) | ((c3&0x3F)<<6) | (c4&0x3F); len = 4;
}
}
if(uc<=0x7F || uc<=0x7FF && len>2 || uc<=0xFFFF && len>3 || uc>0x10FFFF || uc>=0xFDD0 && uc<=0xFDEF || (uc&0xFFFE)==0xFFFE || uc>=0xD800 && uc<=0xDFFF)
printf("Malformed symbol: %08lX\n", (ulong)uc);
else
printf("Symbol: %08lX\n", (ulong)uc);
}
}
Исходная версия firkax, :
Поскольку непонятно какой там интерфейс, оставим его в свободной форме. Примерно так:
parse_utf8(uchar const *src, size_t srcsz) {
uchar c1, c2, c3, c4;
uint32 uc;
while(srcsz) {
c1 = *src;
if(c1<=0x7F) { printf("Symbol: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xBF || c1>0xF7) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(srcsz<2) { printf("Truncated input: %02X\n", c1); break; }
if(((c2=src[1])&0xC0)!=0x80) { printf("Invalid input: %02X\n", c1); src++; srcsz--; continue; }
if(c1<=0xDF) { uc = ((c1&0x1F)<<6) | (c2&0x3F); len = 2; }
else {
if(srcsz<3) { printf("Truncated input: %02X %02X\n", c1, c2); break; }
if(((c3=src[2])&0xC0)!=0x80) { printf("Invalid input: %02X %02X\n", c1, c2); src+=2; srcsz-=2; continue; }
if(c1<=0xEF) { uc = ((c1&0x0F)<<12) | ((c2&0x3F)<<6) | (c3&0x3F); len = 3; }
else {
if(srcsz<4) { printf("Truncated input: %02X %02X %02X\n", c1, c2, c3); break; }
if(((c4=src[3])&0xC0)!=0x80) { printf("Invalid input: %02X %02X %02X\n", c1, c2, c3); src+=3; srcsz-=3; continue; }
uc = ((c1&0x0F)<<18) | ((c2&0x3F)<<12) | ((c3&0x3F)<<6) | (c4&0x3F); len = 4;
}
}
if(uc<=0x7F || uc<=0x7FF && len>2 || uc<=0xFFFF && len>3 || uc>0x10FFFF || uc>=0xFDD0 && uc<=0xFDEF || (uc&0xFFFE)==0xFFFE || uc>=0xD800 && uc<=0xDFFF)
printf("Malformed symbol: %08lX\n", (ulong)uc);
else
printf("Symbol: %08lX\n", (ulong)uc);
}
}