О FUSE для WAD-файлов

Вчера вдруг вспомнил о своей давней идее освоить FUSE (библиотеку для работы с файловыми системами из userspace). Когда-то я разбирал основы и тогда задумался над тем, чтобы написать модуль для монтирования WAD-файлов, которые использовались в старом добром Doom и ему подобных играх, так как у них довольно простая внутренняя структура.
И вот вчера внезапно произошло то самое складывание в голове всего в единую цельную картину. И это сразу же дало мотивацию сесть и начать писать. Сначала я сделал простую утилиту для извлечения отдельного элемента из WAD-файла для тестирования. Потом пришлось прерваться — мы с Tellой договорились прогуляться по городу. Прогулка прошла хорошо, если не считать, что чуть было не попали под дождь. Но своевременно это поняли и добрались до моста Богдана Хмельницкого буквально в момент начала дождя, где и спрятались. А перед дождем удалось сделать несколько весьма атмосферных фото.
Вернулся я достаточно поздно и занялся переделкой написанной утилиты для работы с FUSE. И тут меня ждала первая неприятность: я долго не мог понять, как правильно передавать имя файла, который требуется смонтировать. Потом выяснилось, что у FUSE есть собственные инструменты для разбора параметров командной строки, и нужно использовать их. Но с этим я разобрался только сегодня, и то далеко не сразу. И вот наконец, первый запуск программы, не приведший к ошибке. Захожу в подкаталог монтирования и с радостью вижу там имена элементов из WAD-файла! Правда, сначала они выводились криво из-за того, что я забыл добавить нулевой байт. Но это я исправил быстро. А вот с другой ошибкой — тем, что список файлов получить удалось, а прочитать какой-либо из них — нет, провозился долго. А ошибка там оказалась довольно примитивная. Я давно не писал на C и благополучно забыл, что функция fread возвращает не число прочитанных байт, а число прочитанных блоков указанного размера. Причем сначала я думал, что проблемы в поиске нужного элемента в WAD или определении его размера. Но сделал отладочный вывод — там было все нормально. И только когда вывел вообще все что можно, и обнаружил, что fread возвращает единицу, понял, откуда берется проблема.
После этого все заработало. Но не обошлось без last-minute bug. Решил сделать по-нормальному: вынести некоторые процедуры из h-файла в c-файл, а в заголовочном оставить только их объявления. Но ошибочно в спешке одну из процедур принял за структуру (ввело в заблуждение слово struct в начале), и оставил ее в h-файле. А потом долго не мог понять, почему линковщик ругается на дважды определенный символ, который к тому же вообще экспортироваться не должен. Потом еще какое-то время ушло на то, чтобы выгрузить получившееся на GitHub и написать краткое описание.
Но все это было не зря: снова удалось почувствовать себя Настоящим Компьютерщиком, который может творить то, что не каждому доступно!
А еще обнаружил, что кто-то поставил звездочку (GitHubовский аналог like) моей другой разработке — JavaScript-библиотеке CondiLoader для асинхронной загрузки JavaScript и CSS. Что ж, хоть кто-то ее заметил!