2022-10-06 16:37:18 +03:00
|
|
|
|
---
|
2022-11-19 03:36:06 +03:00
|
|
|
|
title: "🧑🏻💻 indent из OpenBSD в Linux"
|
2022-10-06 16:37:18 +03:00
|
|
|
|
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 <bsd.prog.mk>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
В файле `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);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Работют они конечно по разному, но ничего сломаться в штатной обстановке не должно.
|
|
|
|
|
|
|
|
|
|
## Итог
|
|
|
|
|
|
|
|
|
|
По факту код оказался полностью кросс-платформенным,
|
|
|
|
|
за исключением нескольных моментов.
|
|
|
|
|
|
|
|
|
|
Бинарных сборок нет, собирайте сами!
|