LINUX.ORG.RU

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

Исправление SZT, (текущая версия) :

Окей, ты блестяще доказал, что на Си можно написать парсер GIF. Тебя спрашивали о другом, но ты всё равно молодец.

Не вопрос, могу и на Ragel. Просто Ragel не будет выигрышно смотреться в такой ситуации. Он тут явно избыточен. Ведь что тут требуется - требуется заматчить байты в некую структурку, потом в зависимости от того, какой битик вот в таком-то поле, мы разбираем следующий кусок байтов через эту или эту структуру. Это все отлично решается средствами С, без каких-либо вспомогательных инструментов. Хотя есть некоторые вещи, которые бы добавили мне проблем. Например:

  1. Нестандартные смещения чисел и нестандартные битности чисел, когда часть числа лежит в одном байте, часть в другом, при этом оно занимает больше бит, чем самый большой доступный в Си целочисленный тип. И обычные битфилды в пролете:
    typedef struct {
      uint64_t field65bit:65;
      unsigned __int128 field129bit:129;
    } Structure;
    
    Для решения такой задачи мне б пришлось через маски и сдвиги вычленять биты из типов меньшей разрядности, потом переводить в десятичную систему, используя длинную арифметику. Это бы сильно усложнило задачу
  2. Использование нестандартной https://en.wikipedia.org/wiki/Signed_number_representations (но это не такая уж большая проблема)
  3. Если бы применялись коды Рида-Соломона или нечто подобное, и стояла бы задача декодировать и поисправлять ошибки в этом битовом потоке, да и потом еще распарсить восстановленный после этого поток байтиков.

Почему ты ищешь ее там? Ищи в сгенерированном коде или рантайме.

Рантайм и сгенерированный код не знает о формате 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 не будет выигрышно смотреться в такой ситуации. Он тут явно избыточен. Ведь что тут требуется - требуется заматчить байты в некую структурку, потом в зависимости от того, какой битик вот в таком-то поле, мы разбираем следующий кусок байтов через эту или эту структуру. Это все отлично решается средствами С, без каких-либо вспомогательных инструментов. Хотя есть некоторые вещи, которые бы добавили мне проблем. Например:

  1. Нестандартные смещения чисел и нестандартные битности чисел, когда часть числа лежит в одном байте, часть в другом, при этом оно занимает больше бит, чем самый большой доступный в Си целочисленный тип. И обычные битфилды в пролете:
    typedef struct {
      uint64_t field65bit:65;
      unsigned __int128 field129bit:129;
    } Structure;
    
    Для решения такой задачи мне б пришлось через маски и сдвиги вычленять биты, потом переводить в десятичную систему, используя длинную арифметику. Это бы сильно усложнило задачу
  2. Использование нестандартной https://en.wikipedia.org/wiki/Signed_number_representations (но это не такая уж большая проблема)
  3. Если бы применялись коды Рида-Соломона или нечто подобное, и стояла бы задача декодировать и поисправлять ошибки в этом битовом потоке, да и потом еще распарсить восстановленный после этого поток байтиков.

Почему ты ищешь ее там? Ищи в сгенерированном коде или рантайме.

Рантайм и сгенерированный код не знает о формате GIF ничего кроме того, что описано в самом .ksy файле для разбора этого GIF. И единственая валидация, которую можно сделать по данному описанию, это «unexpected end of file» и «GIF magic bytes not found». На сегодняшний день сушествует только два варианта: GIF89a GIF87a. Если посмотреть описание, то там вот эта вот часть 89a и 87a вообще не проверяется. Там далеко не полный разбор GIF формата производится. Например, если взять анимированный GIF, то туда будут упакованы несколько картинок, и у каждой картинки может быть свой color map (палитра), там этого попросту не учитывают.