--- title: "indent из OpenBSD в Linux" date: 2022-10-06T16:06:13+03:00 draft: false tags: [c, linux, openbsd] --- ## О утилите [indent.1](https://man.openbsd.org/indent.1) — unix утилита для исправления отступов и форматирования исходного кода программ на Си. **Справочный материал:** [OpenBSD manual page](https://man.openbsd.org/indent.1) [Indent_(Unix) _Wikipedia_](https://en.wikipedia.org/wiki/Indent_(Unix)) Эта утилита своеобразный **code beautifier** для Си. ## GNU реализации В Linux существует [GNU Indent](https://www.gnu.org/software/indent/manual/), код доступен на серверах **savannah.gnu.org**: ```sh git clone https://git.savannah.gnu.org/git/indent.git ``` Версия 2.2.12 вышла 18 апреля 2021 года. Но ведь этоже GNU, бее. ## OpenBSD реализация В OpenBSD есть своя версия. Издавно известно, что разработчики OpenBSD _они пишут лучший C код в мире_ [[1](https://www.opennet.ru/openforum/vsluhforumID3/128533.html#57)]. Исходный код доступен по следующей ссылке: ```text https://github.com/openbsd/src/tree/master/usr.bin/indent ``` Однако собрать его не получится, без некоторых изменений :) ## Код Я клонировал исходный код на свой Git сервер и сделал изменений, которые позволяют собрать библиотеку в Linux. Коммит с изменениями доступен по [этой ссылке](https://git.a2s.su/iiiypuk/indent/commit/a250dd83d47981cf6ed9a4382aae120a7fb24468). Изменения коснулись следующих файлов: * Makefile * args.c * indent.c * lexi.c В файле `Makefile` я закоментировал строку с инклудом параметром для сборки OpenBSD. ```text .include ``` В файле `indent.c` убрал механизм безопасности OpenBSD [Pledge](https://man.openbsd.org/pledge.2). Оригинальный код: ```c if (pledge("stdio rpath wpath cpath", NULL) == -1) err(1, "pledge"); ``` Мои правки: ```text #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`: ```diff - strlcpy(ps.procname, token, sizeof ps.procname); + strncpy(ps.procname, token, sizeof ps.procname); ``` Работют они конечно по разному, но ничего сломаться в штатной обстановке не должно. ## Итог По факту код оказался полностью кросс-платформенным, за исключением нескольных моментов. Бинарных сборок нет, собирайте сами!