@MuffinLover

Что по смыслу делает этот if?

https://pastebin.com/2WgAs6k0
Что за странный if на 63 строчке? и в чем трюк с ifdef FIND_LIB_NAME
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Мы тут считываем текстовый файл, и разбор файла по строкам происходит так.
1. Считываем кусок файла.
2. Находим \n, если он не в начале буфера.
3. Движемся назад, пока не увидим начало буфера или другой \n. Отсюль досюль — это строка текстового файла.
4. Если при компиляции включено FIND_LIB_NAME — пропусти четыре поля, отделённых пробелом, затем кучу пробелов (один или больше), и всё, что до \n — это имя библиотеки. Прямо в буфере заменяем символ конца строки текстового файла на символ конца Си-строки, обрабатываем и возвращаем как было.

Вообще мне этот исходник не нравится — он сильно завязан на устройство конкретного MAP-файла.
1. Работа с offset подозрительная — то ли длина каждой строчки является степенью двойки и всё оказывается в порядке, то ли не понимаю что.
По идее, должны быть два дополнительных блока: 1) если мы упёрлись в конец и хоть один \n считали — всё, что осталось, мы переносим в начало буфера и продолжаем считывание дальше. 2) Если ни одного \n не считали — файл совсем уж странный, слишком длинная строка, выкидываем ошибку.
2. Если попадёт файл, чей формат совсем другой, система, конечно, не вылезет за пределы буфера, но будет читать непонятно что непонятно откуда. Границами чтения должно быть «отсюль досюль», а не весь буфер. Попытался выяснить, откуда взялся файл — не удивительно, что последний его коммит — это тупая защита от чтения за пределами буфера.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Griboks
@Griboks
Новая строка и ненулевое i.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы