Blog/content/posts/2022/openbsd-indent-on-linux.md
2022-11-19 03:36:06 +03:00

3.5 KiB
Raw Blame History

title date draft tags
🧑🏻‍💻 indent из OpenBSD в Linux 2022-10-06T16:06:13+03:00 false
c
linux
openbsd

О утилите

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);

Работют они конечно по разному, но ничего сломаться в штатной обстановке не должно.

Итог

По факту код оказался полностью кросс-платформенным, за исключением нескольных моментов.

Бинарных сборок нет, собирайте сами!