История изменений
Исправление SZT, (текущая версия) :
Окей, ты блестяще доказал, что на Си можно написать парсер GIF. Тебя спрашивали о другом, но ты всё равно молодец.
Не вопрос, могу и на Ragel. Просто Ragel не будет выигрышно смотреться в такой ситуации. Он тут явно избыточен. Ведь что тут требуется - требуется заматчить байты в некую структурку, потом в зависимости от того, какой битик вот в таком-то поле, мы разбираем следующий кусок байтов через эту или эту структуру. Это все отлично решается средствами С, без каких-либо вспомогательных инструментов. Хотя есть некоторые вещи, которые бы добавили мне проблем. Например:
- Нестандартные смещения чисел и нестандартные битности чисел, когда часть числа лежит в одном байте, часть в другом, при этом оно занимает больше бит, чем самый большой доступный в Си целочисленный тип. И обычные битфилды в пролете:
Для решения такой задачи мне б пришлось через маски и сдвиги вычленять биты из типов меньшей разрядности, потом переводить в десятичную систему, используя длинную арифметику. Это бы сильно усложнило задачу
typedef struct { uint64_t field65bit:65; unsigned __int128 field129bit:129; } Structure;
- Использование нестандартной https://en.wikipedia.org/wiki/Signed_number_representations (но это не такая уж большая проблема)
- Если бы применялись коды Рида-Соломона или нечто подобное, и стояла бы задача декодировать и поисправлять ошибки в этом битовом потоке, да и потом еще распарсить восстановленный после этого поток байтиков.
Почему ты ищешь ее там? Ищи в сгенерированном коде или рантайме.
Рантайм и сгенерированный код не знает о формате GIF ничего кроме того, что описано в самом .ksy
файле для разбора этого GIF. И единственая валидация, которую можно сделать по данному описанию, это «unexpected end of file» и «GIF magic bytes not found». На сегодняшний день сушествует только два варианта: GIF89a
GIF87a
. Если посмотреть описание, то там вот эта вот часть 89a
и 87a
вообще не проверяется. Там далеко не полный разбор GIF формата производится. Например, если взять анимированный GIF, то туда будут упакованы несколько картинок, и у каждой картинки может быть свой color map (палитра), там этого попросту не учитывают. См. http://www.onicos.com/staff/iz/formats/gif.html
Исходная версия SZT, :
Окей, ты блестяще доказал, что на Си можно написать парсер GIF. Тебя спрашивали о другом, но ты всё равно молодец.
Не вопрос, могу и на Ragel. Просто Ragel не будет выигрышно смотреться в такой ситуации. Он тут явно избыточен. Ведь что тут требуется - требуется заматчить байты в некую структурку, потом в зависимости от того, какой битик вот в таком-то поле, мы разбираем следующий кусок байтов через эту или эту структуру. Это все отлично решается средствами С, без каких-либо вспомогательных инструментов. Хотя есть некоторые вещи, которые бы добавили мне проблем. Например:
- Нестандартные смещения чисел и нестандартные битности чисел, когда часть числа лежит в одном байте, часть в другом, при этом оно занимает больше бит, чем самый большой доступный в Си целочисленный тип. И обычные битфилды в пролете:
Для решения такой задачи мне б пришлось через маски и сдвиги вычленять биты, потом переводить в десятичную систему, используя длинную арифметику. Это бы сильно усложнило задачу
typedef struct { uint64_t field65bit:65; unsigned __int128 field129bit:129; } Structure;
- Использование нестандартной https://en.wikipedia.org/wiki/Signed_number_representations (но это не такая уж большая проблема)
- Если бы применялись коды Рида-Соломона или нечто подобное, и стояла бы задача декодировать и поисправлять ошибки в этом битовом потоке, да и потом еще распарсить восстановленный после этого поток байтиков.
Почему ты ищешь ее там? Ищи в сгенерированном коде или рантайме.
Рантайм и сгенерированный код не знает о формате GIF ничего кроме того, что описано в самом .ksy
файле для разбора этого GIF. И единственая валидация, которую можно сделать по данному описанию, это «unexpected end of file» и «GIF magic bytes not found». На сегодняшний день сушествует только два варианта: GIF89a
GIF87a
. Если посмотреть описание, то там вот эта вот часть 89a
и 87a
вообще не проверяется. Там далеко не полный разбор GIF формата производится. Например, если взять анимированный GIF, то туда будут упакованы несколько картинок, и у каждой картинки может быть свой color map (палитра), там этого попросту не учитывают.