LINUX.ORG.RU

История изменений

Исправление 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);
  }
}