Compare commits

...

4 Commits

Author SHA1 Message Date
39a35b8da4
hide header flags on <MD screens 2022-10-06 16:45:20 +03:00
7e4db498e8
add nowrap to date in list 2022-10-06 16:41:12 +03:00
332c042b30
add white color to header 2022-10-06 16:39:57 +03:00
027e3f5ace
openbsd indent 2022-10-06 16:37:18 +03:00
3 changed files with 119 additions and 5 deletions

View File

@ -0,0 +1,108 @@
---
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 <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);
```
Работют они конечно по разному, но ничего сломаться в штатной обстановке не должно.
## Итог
По факту код оказался полностью кросс-платформенным,
за исключением нескольных моментов.
Бинарных сборок нет, собирайте сами!

View File

@ -14,7 +14,9 @@
<div class="list-group w-auto">
{{ range .Pages.ByPublishDate.Reverse }}
<div class="list-group-item list-group-item-action d-flex gap-3 py-3">
<label>{{ .PublishDate.Format "2006-01-02" }}</label>
<label class="text-nowrap">
{{ .PublishDate.Format "2006-01-02" }}
</label>
<a class="text-decoration-none" href="{{ .RelPermalink }}">{{ .Title }}</a>
</div>
{{ end }}

View File

@ -1,17 +1,21 @@
<header class="bg-dark shadow-sm sticky-top py-3 mb-3">
<div class="container">
<div class="container text-white">
<div class="row flex-nowrap justify-content-between align-items-center">
<div class="col-4 fs-3">
<div class="d-none d-md-block">
🏴‍☠️
</div>
<div class="col-4 text-center fw-bold fs-3 text-white">
</div>
<div class="col-4 text-center fw-bold fs-3">
Сашка ☕
</div>
<div class="col-4 d-flex justify-content-end align-items-center">
<a class="btn btn-sm btn-outline-light" href="/posts/" target="_blank">Blog</a>&nbsp;
<a class="btn btn-sm btn-outline-light" href="/tags/" target="_blank">Tags</a>&nbsp;
<div class="d-none d-md-block">
💀 🔵 🔴
</div>
</div>
</div>
</div>
</header>