170 похожих чатов

AbTextU32 abTextU8_NextCP(abTextU8 const * * textCursor) { abTextU8 const

* text = *textCursor, first = *text;
if (first == '\0') { return 0u; }
if (first <= 127u) { ++(*textCursor); return first; }
// Doing || sequences in order is safe due to early exit.
if ((first >> 5u) == 6u) {
if ((text[1u] >> 6u) != 2u) { ++(*textCursor); return abText_InvalidSubstitute; }
*textCursor += 2u;
return ((abTextU32) (first & 31u) << 6u) | (text[1u] & 63u);
}
if ((first >> 4u) == 14u) {
if ((text[1u] >> 6u) != 2u || (text[2u] >> 6u) != 2u) { ++(*textCursor); return abText_InvalidSubstitute; }
*textCursor += 3u;
abTextU32 cp = ((abTextU32) (first & 15u) << 12u) | ((abTextU32) (text[1u] & 63u) << 6u) | (text[2u] & 63u);
return ((cp & ~((abTextU32) 0x7ffu)) != 0xd800u) ? cp : abText_InvalidSubstitute;
}
if ((first >> 3u) == 30u) {
if ((text[1u] >> 6u) != 2u || (text[2u] >> 6u) != 2u || (text[3u] >> 6u) != 2u) { ++(*textCursor); return abText_InvalidSubstitute; }
*textCursor += 4u;
abTextU32 cp = ((abTextU32) (first & 7u) << 18u) | ((abTextU32) (text[1u] & 63u) << 12u) | ((abTextU32) (text[2u] & 63u) << 6u) | (text[3u] & 63u);
return (cp <= 0x10ffff) ? cp : abText_InvalidSubstitute;
}
++(*textCursor); return abText_InvalidSubstitute;
}
как-то так :D

1 ответов

18 просмотров

uint32_t GetUtf8Char(uint32_t* i, const std::string &m_text){ static const char trailingBytesForUTF8[256] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; static const uint32_t offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; uint32_t first = (uint8_t)m_text[*i]; uint32_t ch = 0; int count = *i; unsigned short extraBytesToRead = trailingBytesForUTF8[first]; switch (extraBytesToRead) { case 5: ch += (uint8_t)m_text[count++]; ch <<= 6; case 4: ch += (uint8_t)m_text[count++]; ch <<= 6; case 3: ch += (uint8_t)m_text[count++]; ch <<= 6; case 2: ch += (uint8_t)m_text[count++]; ch <<= 6; case 1: ch += (uint8_t)m_text[count++]; ch <<= 6; case 0: ch += (uint8_t)m_text[count++]; } *i = count - 1; ch -= offsetsFromUTF8[extraBytesToRead]; return ch; }

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта