@ProCxx

Страница 1936 из 2477
TriΔng3l
04.04.2018
14:29:46
TriΔng3l
04.04.2018
14:30:16
но там не один бит проверяется, а три, четыре или пять для первого байта, а для остальных — два

Google
Constantine
04.04.2018
14:31:19
да там очевидно всё, я просто для UTF-8 код пишу
скопипасть перекодировщик с фолли лол

TriΔng3l
04.04.2018
14:31:25
так что, там явно не test, а cmp

Constantine
04.04.2018
14:32:29
да там очевидно всё, я просто для UTF-8 код пишу
https://github.com/facebook/folly/blob/master/folly/Unicode.cpp

TriΔng3l
04.04.2018
14:33:53
о, кстати

if (!(fst & 0x80))

shr же ZF ставит?

хотя, без разницы, что shr, что test, оба с 8-битным immediate

Constantine
04.04.2018
14:34:56
ты на асме что ли пишешь

TriΔng3l
04.04.2018
14:35:07
или даже cmp с immediate, та же хрень

Constantine
04.04.2018
14:35:34
я полагаю, компилер поймет и оптимизирует тебе

хоть как ты напишешь

TriΔng3l
04.04.2018
14:35:42
блин, я тот самый сосед

Google
Constantine
04.04.2018
14:36:05
вычислить функцию unsigned char -> unsigned char на всех отсчетах не так сложно

и потом подставить табличку

какую из них как оптимально в асме делать

TriΔng3l
04.04.2018
14:44:22
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

Aidar
04.04.2018
14:56:43
а на функции разбить никак?

Vladislav
04.04.2018
14:57:47
Глаза вытекают

Aidar
04.04.2018
14:58:38
Глаза вытекают
так это же си

Nik
04.04.2018
14:59:19
а на си разве нельзя писать более...красиво?

Vladislav
04.04.2018
14:59:24
так это же си
Да это даже в студии выглядит просто pizdec

Igor
04.04.2018
15:02:08
по-моему битоёбство просто по своей природе такое, его можно улучшить разве что раздробив на однострочные функции с максимально понятными именами

Igor
04.04.2018
15:04:06
и каждому индексу и константе, да

Anatoly
04.04.2018
15:04:46
сколько комментариев не пиши, всё равно сегфолтнется

Vladislav
04.04.2018
15:05:16
и поехали страдать херней по памяти

TriΔng3l
04.04.2018
15:13:08
Да это даже в студии выглядит просто pizdec
ну u лишнее, конечно, но это я просто для себя такое правило сделал, как с f

чтобы уж наверняка, если там что-нибудь типа 0x80000000

а на функции разбить никак?
А зачем? Назначение у этой функции неделимое

Разве что валидация тут захардкодена

Aidar
04.04.2018
15:15:25
А зачем? Назначение у этой функции неделимое
Уверен? Что тогда значит тыща ифов?

Google
Aidar
04.04.2018
15:15:59
И коммент в середине

TriΔng3l
04.04.2018
15:16:38
И коммент в середине
Чтоб если вдруг когда-нибудь позже взгляну на этот код, не захотелось наделать вложенных ифов

Уверен? Что тогда значит тыща ифов?
Разбор записи самой базовой сущности в UTF-8

Aidar
04.04.2018
15:18:35
Ты разбор не можешь на подэтапы разбить?

TriΔng3l
04.04.2018
15:18:53
Ты разбор не можешь на подэтапы разбить?
Так эти подэтапы коротенькие совсем

Да и сама функция коротенькая

Aidar
04.04.2018
15:18:59
И что

TriΔng3l
04.04.2018
15:19:02
И фундаментальная

Aidar
04.04.2018
15:19:06
Охуеть коротенькая

Упоролся чтоль

TriΔng3l
04.04.2018
15:19:20
Зачем по всему файлу разбрасывать мелкие кусочки?

Aidar
04.04.2018
15:19:41
Затем что они имеют название и могут быть переиспользованы

TriΔng3l
04.04.2018
15:19:44
И потом путаться в том, что для чего предназначено и кому что можно использовать

Kirill
04.04.2018
15:19:48
я долго хотел что то написать по делу, но в общем. нужно ли давать функциям читаемые имена и делить ужасный пипец на более мелкие читаемые части это вроде вопрос для supapro

TriΔng3l
04.04.2018
15:19:48
Aidar
04.04.2018
15:19:53
Придумай нормальные названия

TriΔng3l
04.04.2018
15:20:37
Придумай нормальные названия
Какие названия? Тут название одно — последовательность в UTF-8

Pavel
04.04.2018
15:20:55
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
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; }

Kirill
04.04.2018
15:20:59
Google
TriΔng3l
04.04.2018
15:21:42
эмодзи
Так они же до 10ffff

4 байта вместе с первым

Pavel
04.04.2018
15:21:50
Так они же до 10ffff
не все вроде

TriΔng3l
04.04.2018
15:22:00
Свыше 10ffff уже невалидные

или валидные? O_O

Aidar
04.04.2018
15:22:06
4 байта вместе с первым
Ютф8 до шести байт

TriΔng3l
04.04.2018
15:23:05
Longer encodings are called overlong and are not valid UTF-8 representations of the code point.

а, стоп

это не про то

Но ограничение на 1114112 code points никто не отменял, вроде, и из них занято только чуть больше сотни тысяч

Constantine
04.04.2018
15:54:06
UTF-16 непредставимые запретили

Ютф8 до шести байт
UTF-8 позволяет записать много невалидных кодпоинтов, да

TriΔng3l
04.04.2018
15:55:28
немного переделал своё говно, убрал возврат символа замены три раза, заменил != || != на == && ==

Constantine
04.04.2018
15:56:24
лучше бы ты все-таки списывал с фолли

TriΔng3l
04.04.2018
15:56:32
Constantine
04.04.2018
15:56:41
А что там?
Там хитрые планы очень

Google
TriΔng3l
04.04.2018
15:56:44
Да я просто хочу, чтобы конкретно, если символ невалидный, мне выдавало '?'

Причём невалидный исключительно с точки зрения перевода между UTF-8, UTF-16 и UTF-32

На BOM всякие мне пофиг, это уже при чтении файлов надо рассматривать

TriΔng3l
04.04.2018
15:58:19
????
Именно так

Constantine
04.04.2018
15:58:20
U+FFFD замечательный символ

TriΔng3l
04.04.2018
15:59:06
U+FFFD замечательный символ
Он 3 байта занимает в UTF-8, нафиг

TriΔng3l
04.04.2018
15:59:39
Я бы за такое руки оторвал
Да мне только для отрисовки

Constantine
04.04.2018
15:59:57
Да мне только для отрисовки
а если UTF-8 последовательность для D800 ты мне U+D800 вернешь?

TriΔng3l
04.04.2018
16:00:15
а если UTF-8 последовательность для D800 ты мне U+D800 вернешь?
Вот это я и имею в виду под невалидностью с точки зрения конверсии

TriΔng3l
04.04.2018
16:00:52
а FFFE верну

Constantine
04.04.2018
16:01:11
наркоман шоле

а если я потом его в UTF16 впишу?

TriΔng3l
04.04.2018
16:01:49
наркоман шоле
Он не мешает

Страница 1936 из 2477