🧑🏻💻 indent из OpenBSD в Linux
О утилите
indent.1 — unix утилита для исправления отступов и форматирования исходного кода программ на Си.
Справочный материал:
OpenBSD manual page
Indent_(Unix) Wikipedia
Эта утилита своеобразный code beautifier для Си.
GNU реализации
В Linux существует GNU Indent, код доступен на серверах savannah.gnu.org:
git clone https://git.savannah.gnu.org/git/indent.git
Версия 2.2.12 вышла 18 апреля 2021 года.
Но ведь этоже GNU, бее.
OpenBSD реализация
В OpenBSD есть своя версия. Издавно известно, что разработчики OpenBSD они пишут лучший C код в мире [1].
Исходный код доступен по следующей ссылке:
https://github.com/openbsd/src/tree/master/usr.bin/indent
Однако собрать его не получится, без некоторых изменений :)
Код
Я клонировал исходный код на свой Git сервер и сделал изменений, которые позволяют собрать библиотеку в Linux.
Коммит с изменениями доступен по этой ссылке.
Изменения коснулись следующих файлов:
- Makefile
- args.c
- indent.c
- lexi.c
В файле Makefile
я закоментировал строку с инклудом параметром для сборки OpenBSD.
.include <bsd.prog.mk>
В файле indent.c
убрал механизм безопасности OpenBSD
Pledge.
Оригинальный код:
if (pledge("stdio rpath wpath cpath", NULL) == -1)
err(1, "pledge");
Мои правки:
#if defined(__linux__)
//
#else
if (pledge("stdio rpath wpath cpath", NULL) == -1)
err(1, "pledge");
#endif
В файлах args.c
и indent.c
я сколхозил, заменив OpenBSD специфичные функции
errc
и warnc
на функцию printf
.
По хорошему нужно изучить работу функций, похоже что они возвращают ещё код ошибки, но на текущий момент и так сойдёт.
В файле lexi.c
заменил функцию strlcpy
на strncpy
:
- strlcpy(ps.procname, token, sizeof ps.procname);
+ strncpy(ps.procname, token, sizeof ps.procname);
Работют они конечно по разному, но ничего сломаться в штатной обстановке не должно.
Итог
По факту код оказался полностью кросс-платформенным, за исключением нескольных моментов.
Бинарных сборок нет, собирайте сами!