~nabijaczleweli/voreutils

520c52de0f6b2199d3faa6eac64dce2631981ea2 — наб 4 months ago 9e39412
Remind yourself that overconfidence is a slow and insidious killer
A .builds/freebsd-latest.yml => .builds/freebsd-latest.yml +7 -0
@@ 0,0 1,7 @@
image: freebsd/latest
packages:
  - gmake
tasks:
  - build: |
      cd voreutils
      gmake

A .builds/openbsd-latest.yml => .builds/openbsd-latest.yml +8 -0
@@ 0,0 1,8 @@
image: openbsd/latest
packages:
  - gmake
  - bzip2
tasks:
  - build: |
      cd voreutils
      gmake CXX=c++ LTO=n

A .builds/sid.yml => .builds/sid.yml +55 -0
@@ 0,0 1,55 @@
image: debian/sid
secrets:
  - ddeb8ace-1c12-4ce9-b0e3-a6f2cd48c4ef  # voreutils SSH key
  - ae6210b1-b37d-4f6c-9828-3e83c3a684a4  # voreutils auth token
packages:
  - clang
  - llvm-dev
  - mandoc
  - curl
tasks:
  - build-gcc: |
      cd voreutils
      make
      make clean
  - build-clang: |
      cd voreutils
      CC=clang CXX=clang++ make
      CC=clang CXX=clang++ make clean
  - push-manpages: |
      git -C voreutils/ worktree add ../voreutils-man man
      rm -rf voreutils-man/*
      MANDIR=../voreutils-man/ HTMLMANDIR=../voreutils-man/ make -C voreutils allpages
      cd voreutils-man/
      git add .
      git config user.email "nabijaczleweli/autouploader@nabijaczleweli.xyz"
      git config user.name "наб autouploader"
      git remote set-url origin 'git@git.sr.ht:~nabijaczleweli/voreutils'
      ssh-keyscan git.sr.ht > ~/.ssh/known_hosts
      git commit -m "Manpage update by job $JOB_ID" || exit 0
      while true; do
        git push && break
        for _ in $(seq 0 10); do
          sleep 3
          git fetch
          git rebase
          git push && break 2
        done
        echo "Couldn't push manpages!"
        exit 1
      done
  - upload-release: |
      tag="$(git -C voreutils describe --abbrev=0 --tags || echo HEAD~1)"
      [ "$(git -C voreutils rev-list -n1 "$tag")" = "$(git -C voreutils rev-list -n1 HEAD)" ] || exit 0
      mkdir "voreutils-$tag-man"
      mv voreutils-man/* "voreutils-$tag-man"
      tar -caf "voreutils-$tag-man.tbz2" "voreutils-$tag-man"
      sha256sum --tag *.tbz2
      set +x  # Avoid echoing the token
      for f in *.tbz2; do
        curl -H "Authorization: Bearer $(cat ~/.release-token)" \
             -XPOST                                             \
             -F "file=@$f"                                      \
            "https://git.sr.ht/api/repos/voreutils/artifacts/$tag"
        echo
      done

A .clang-format => .clang-format +23 -0
@@ 0,0 1,23 @@
---
Language                                       : Cpp
BasedOnStyle                                   : LLVM
AlignAfterOpenBracket                          : true
AlignEscapedNewlinesLeft                       : true
AlignConsecutiveAssignments                    : true
AllowShortFunctionsOnASingleLine               : Inline
AlwaysBreakTemplateDeclarations                : true
ColumnLimit                                    : 160
ConstructorInitializerIndentWidth              : 6
IndentCaseLabels                               : true
MaxEmptyLinesToKeep                            : 2
KeepEmptyLinesAtTheStartOfBlocks               : false
NamespaceIndentation                           : All
PointerAlignment                               : Middle
SpacesBeforeTrailingComments                   : 2
IndentWidth                                    : 2
TabWidth                                       : 2
UseTab                                         : ForIndentation
SpaceBeforeParens                              : Never
FixNamespaceComments                           : false
...


A .gitignore => .gitignore +15 -0
@@ 0,0 1,15 @@
*
!.git*
!.git*/**
!.builds
!.builds/**
!LICENSE
!.clang-format
!*Makefile
!*.sublime-project
!include
!include/**
!man
!man/**
!cmd
!cmd/**

A Makefile => Makefile +125 -0
@@ 0,0 1,125 @@
# SPDX-License-Identifier: 0BSD


CXX ?= c++
CC ?= cc
CPP ?= cpp
MANDOC ?= mandoc
AWK ?= awk
SED ?= sed
LTO ?= y
VOREUTILS_VERSION ?= $(shell git describe --always)
VOREUTILS_DATE ?= $(shell date $(shell date --version > /dev/null 2>&1 && echo "--date @" || echo "-r ")$(shell git log -1 --no-show-signature --format=%at) +"%B %e, %Y")
CFLAGS ?=
CPPFLAGS ?=
LDFLAGS ?=
OUTDIR ?= out/
OBJDIR ?= $(OUTDIR)obj/
CMDDIR ?= $(OUTDIR)cmd/
MANDIR ?= $(OUTDIR)man/
HTMLMANDIR ?= $(OUTDIR)man-html/


AS_NEEDED := -Wl,--as-needed
SONAME := -soname
SYSTEM := $(shell uname -s)
ifeq "$(SYSTEM)" "NetBSD"
	#
else ifeq "$(SYSTEM)" "OpenBSD"
	#
else ifeq "$(SYSTEM)" "Darwin"
	AS_NEEDED :=
	SONAME := -install_name
else
	#
endif

CXXVER := $(shell $(CXX) --version | head -1)
ifneq "$(findstring clang,$(CXXVER))" ""
	# GCC doesn't have this granularity
	CXXSPECIFICCC := -Wpedantic -Wno-c++20-designator -Wno-c99-extensions -Wno-unknown-warning-option
ifneq "$(findstring Apple,$(CXXVER))" ""
	# CMSG_SPACE() is a macro, and it's decidedly constexpr. i don't care if appleclang can't figure that out
	CXXSPECIFICCC += -Wno-vla-extension
endif
	CXXSPECIFICCC += -Wno-gnu-conditional-omitted-operand
	ifeq "$(LTO)" "y"
		CXXSPECIFICLD := -flto=full  # Clang produces .o files with LLVM bitcode, which cannot be linked to if put in .as
	else
		CXXSPECIFICLD :=
	endif
else
	CXXSPECIFICCC := -Wno-missing-field-initializers -fno-common
	ifeq "$(LTO)" "y"
		CXXSPECIFICCC += -flto
	endif
	CXXSPECIFICLD :=
endif


CCAR := -g -O3 -pipe -Wall -Wextra $(CXXSPECIFICCC) $(CFLAGS)
LDAR := $(AS_NEEDED) -L$(OUTDIR) $(CXXSPECIFICLD) $(LDFLAGS)
CPPAR := -Iinclude/ -DVOREUTILS_VERSION='"$(VOREUTILS_VERSION)"' -DVOREUTILS_DATE='"$(VOREUTILS_DATE)"' -include vore-id.h $(CPPFLAGS)
BINARIES := $(wildcard cmd/*)
INCLUDES := $(wildcard include/*)
MANPAGES := $(wildcard man/*.[18])


.PHONY : all binaries manpages htmlpages nomandoc clean
.SECONDARY:

all : binaries manpages htmlpages
allpages : manpages htmlpages
clean:
	rm -rf $(OUTDIR) $(OBJDIR)

binaries : $(patsubst %.c,%,$(patsubst %.cpp,%,$(patsubst cmd/%,$(CMDDIR)%,$(BINARIES))))
manpages : $(patsubst %,$(MANDIR)%,$(patsubst %.8,man8/%.8,$(patsubst %.1,man1/%.1,$(patsubst man/%,%,$(MANPAGES))))) $(OBJDIR)man/aliases
htmlpages : $(patsubst %,$(HTMLMANDIR)%.html,$(patsubst %.8,man8/%.8,$(patsubst %.1,man1/%.1,$(patsubst man/%,%,$(MANPAGES))))) $(OBJDIR)man/aliases $(HTMLMANDIR)style.css

nomandoc : $(MANPAGES) $(OBJDIR)man/aliases
	sh -xc 'for p; do cp "man/$$p" "$(MANDIR)man$${p##*.}/"; done' sh $(patsubst man/%,%,$(MANPAGES))


$(OBJDIR)man/aliases : man/aliases
	@mkdir -p $(dir $@) $(MANDIR) $(HTMLMANDIR)
	$(AWK) '!/^$$/ {                                          \
		sec1 = substr($$1, length($$1));                        \
		sec2 = substr($$2, length($$2));                        \
		rel = (sec1 == sec2) ? "" : "../man" sec1 "/";          \
		print "(mkdir -p man" sec1 " man" sec2 " && cd man" sec2 " && set -x && ln -fs " rel $$1 "$$suff " $$2 "$$suff)"; \
	}' man/aliases > $@
	{ cd $(MANDIR)     && suff=        sh; } < $@
	{ cd $(HTMLMANDIR) && suff=".html" sh; } < $@

$(OBJDIR)man/% : man/%
	@mkdir -p $(dir $@)
	$(SED) 's/^\.Dd/.Dd $(VOREUTILS_DATE)/' $< > $@
	! $(MANDOC) -I os="voreutils $(VOREUTILS_VERSION)" -Tlint $@ 2>&1 | grep -vE -e 'mandoc: outdated mandoc.db' -e 'STYLE: referenced manual not found'

$(MANDIR)man1/% $(MANDIR)man8/% : $(OBJDIR)man/%
	@mkdir -p $(dir $@)
	$(MANDOC) -I os="voreutils $(VOREUTILS_VERSION)" -Tman  $< | grep -vF 'Automatically generated from an mdoc input file.' > $@

$(HTMLMANDIR)man1/%.html $(HTMLMANDIR)man8/%.html : $(OBJDIR)man/%
	@mkdir -p $(dir $@)
	$(MANDOC) -I os="voreutils $(VOREUTILS_VERSION)" -Thtml -Ostyle="../style.css",man="../man%S/%N.%S.html" $< | \
		$(AWK) '/^<h1/ {in_syn = $$0 ~ /id="SYNOPSIS"/}  /^<br/ {if(in_syn) next}  {print}' | \
		$(SED) -Ee 's/ title=".."//g' > $@

$(HTMLMANDIR)style.css : man/style.css
	@mkdir -p $(dir $@)
	cp $^ $@


$(CMDDIR)% : $(OBJDIR)cmd/%.o
	@mkdir -p $(dir $@)
	$(CXX) $(CCAR) $(LDAR) -std=c++17 -fno-exceptions -o $@ $^

$(OBJDIR)%.o : %.c
	@mkdir -p $(dir $@)
	$(CC) $(CCAR) $(CPPAR) -c -o $@ $^

$(OBJDIR)%.o : %.cpp $(INCLUDES)
	@mkdir -p $(dir $@)
	$(CXX) $(CCAR) $(CPPAR) -std=c++17 -fno-exceptions -c -o $@ $<

M README.md => README.md +131 -109
@@ 1,119 1,141 @@
# [voreutils](//twitter.com/nabijaczleweli/status/1401538687733800961) [![builds.sr.ht build status](//builds.sr.ht/~nabijaczleweli/voreutils.svg)](//builds.sr.ht/~nabijaczleweli/voreutils) [![Licence](//img.shields.io/badge/licenses-free-blue.svg?style=flat)](LICENSE)
# [voreutils](//twitter.com/nabijaczleweli/status/1401538687733800961) [![builds.sr.ht build status](//builds.sr.ht/~nabijaczleweli/voreutils.svg)](//builds.sr.ht/~nabijaczleweli/voreutils) [![Licence](//img.shields.io/badge/licenses-free-blue.svg?style=flat)](LICENCE)
Drop-in Policy-compatible coreutils replacement, at the very least.

I'll configure a tracker/mailing list/whatever when I'm less pissed.
This probably wants a better blurb.

GNU coreutils provide the following 105 binaries, according to `dpkg -L coreutils | grep bin/`:
  * /bin/cat
  * /bin/chgrp
  * /bin/chmod
  * /bin/chown
  * /bin/cp
  * /bin/date
  * /bin/dd
  * /bin/df
  * /bin/dir
  * /bin/echo
  * /bin/false
  * /bin/ln
  * /bin/ls
  * /bin/mkdir
  * /bin/mknod
  * /bin/mktemp
  * /bin/mv
  * /bin/pwd
  * /bin/readlink
  * /bin/rm
  * /bin/rmdir
  * /bin/sleep
  * /bin/stty
  * /bin/sync
  * /bin/touch
  * /bin/true
  * /bin/uname
  * /bin/vdir
  * /usr/bin/[
  * /usr/bin/arch
  * /usr/bin/b2sum
  * /usr/bin/base32
  * /usr/bin/base64
  * /usr/bin/basename
  * /usr/bin/chcon
  * /usr/bin/cksum
  * /usr/bin/comm
  * /usr/bin/csplit
  * /usr/bin/cut
  * /usr/bin/dircolors
  * /usr/bin/dirname
  * /usr/bin/du
  * /usr/bin/env
  * /usr/bin/expand
  * /usr/bin/expr
  * /usr/bin/factor
  * /usr/bin/fmt
  * /usr/bin/fold
  * /usr/bin/groups
  * /usr/bin/head
  * /usr/bin/hostid
  * /usr/bin/id
  * /usr/bin/install
  * /usr/bin/join
  * /usr/bin/link
  * /usr/bin/logname
  * /usr/bin/md5sum
  * /usr/bin/mkfifo
  * /usr/bin/nice
  * /usr/bin/nl
  * /usr/bin/nohup
  * /usr/bin/nproc
  * /usr/bin/numfmt
  * /usr/bin/od
  * /usr/bin/paste
  * /usr/bin/pathchk
  * /usr/bin/pinky
  * /usr/bin/pr
  * /usr/bin/printenv
  * /usr/bin/printf
  * /usr/bin/ptx
  * /usr/bin/realpath
  * /usr/bin/runcon
  * /usr/bin/seq
  * /usr/bin/sha1sum
  * /usr/bin/sha224sum
  * /usr/bin/sha256sum
  * /usr/bin/sha384sum
  * /usr/bin/sha512sum
  * /usr/bin/shred
  * /usr/bin/shuf
  * /usr/bin/sort
  * /usr/bin/split
  * /usr/bin/stat
  * /usr/bin/stdbuf
  * /usr/bin/sum
  * /usr/bin/tac
  * /usr/bin/tail
  * /usr/bin/tee
  * /usr/bin/test
  * /usr/bin/timeout
  * /usr/bin/tr
  * /usr/bin/truncate
  * /usr/bin/tsort
  * /usr/bin/tty
  * /usr/bin/unexpand
  * /usr/bin/uniq
  * /usr/bin/unlink
  * /usr/bin/users
  * /usr/bin/wc
  * /usr/bin/who
  * /usr/bin/whoami
  * /usr/bin/yes
  * /usr/sbin/chroot
  * /usr/bin/md5sum.textutils
  [ ] /bin/cat
  [ ] /bin/chgrp
  [ ] /bin/chmod
  [ ] /bin/chown
  [ ] /bin/cp
  [ ] /bin/date
  [ ] /bin/dd
  [ ] /bin/df
  [ ] /bin/dir
  [ ] /bin/echo
  [x] /bin/false
  [ ] /bin/ln
  [ ] /bin/ls
  [ ] /bin/mkdir
  [ ] /bin/mknod
  [ ] /bin/mktemp
  [ ] /bin/mv
  [ ] /bin/pwd
  [ ] /bin/readlink
  [ ] /bin/rm
  [ ] /bin/rmdir
  [ ] /bin/sleep
  [ ] /bin/stty
  [ ] /bin/sync
  [ ] /bin/touch
  [x] /bin/true
  [ ] /bin/uname
  [ ] /bin/vdir
  [ ] /usr/bin/[
  [ ] /usr/bin/arch
  [ ] /usr/bin/b2sum
  [ ] /usr/bin/base32
  [ ] /usr/bin/base64
  [ ] /usr/bin/basename
  [ ] /usr/bin/chcon
  [ ] /usr/bin/cksum
  [ ] /usr/bin/comm
  [ ] /usr/bin/csplit
  [ ] /usr/bin/cut
  [ ] /usr/bin/dircolors
  [ ] /usr/bin/dirname
  [ ] /usr/bin/du
  [ ] /usr/bin/env
  [ ] /usr/bin/expand
  [ ] /usr/bin/expr
  [ ] /usr/bin/factor
  [ ] /usr/bin/fmt
  [ ] /usr/bin/fold
  [ ] /usr/bin/groups
  [ ] /usr/bin/head
  [ ] /usr/bin/hostid
  [ ] /usr/bin/id
  [ ] /usr/bin/install
  [ ] /usr/bin/join
  [ ] /usr/bin/link
  [ ] /usr/bin/logname
  [ ] /usr/bin/md5sum
  [ ] /usr/bin/mkfifo
  [ ] /usr/bin/nice
  [ ] /usr/bin/nl
  [ ] /usr/bin/nohup
  [ ] /usr/bin/nproc
  [ ] /usr/bin/numfmt
  [ ] /usr/bin/od
  [ ] /usr/bin/paste
  [ ] /usr/bin/pathchk
  [ ] /usr/bin/pinky
  [ ] /usr/bin/pr
  [ ] /usr/bin/printenv
  [ ] /usr/bin/printf
  [ ] /usr/bin/ptx
  [ ] /usr/bin/realpath
  [ ] /usr/bin/runcon
  [ ] /usr/bin/seq
  [ ] /usr/bin/sha1sum
  [ ] /usr/bin/sha224sum
  [ ] /usr/bin/sha256sum
  [ ] /usr/bin/sha384sum
  [ ] /usr/bin/sha512sum
  [ ] /usr/bin/shred
  [ ] /usr/bin/shuf
  [ ] /usr/bin/sort
  [ ] /usr/bin/split
  [ ] /usr/bin/stat
  [ ] /usr/bin/stdbuf
  [ ] /usr/bin/sum
  [ ] /usr/bin/tac
  [ ] /usr/bin/tail
  [ ] /usr/bin/tee
  [ ] /usr/bin/test
  [ ] /usr/bin/timeout
  [ ] /usr/bin/tr
  [ ] /usr/bin/truncate
  [ ] /usr/bin/tsort
  [ ] /usr/bin/tty
  [ ] /usr/bin/unexpand
  [ ] /usr/bin/uniq
  [ ] /usr/bin/unlink
  [ ] /usr/bin/users
  [ ] /usr/bin/wc
  [ ] /usr/bin/who
  [ ] /usr/bin/whoami
  [ ] /usr/bin/yes
  [ ] /usr/sbin/chroot
  [ ] /usr/bin/md5sum.textutils

## Building
You'll need a non-ancient C[++] toolchain, a POSIX AWK, GNU make, and mandoc (optional, which may change, confer `nomandoc` target).

## Special thanks
Run GNU make. See the head of the [Makefile](Makefile) for tunables,
notably `VOREUTILS_{VERSION,DATE}`, which are derived from git HEAD,
`OUTDIR` (and `{CMD,MAN,HTMLMAN}DIR`) where artifacts land, and
`OBJDIR` where intermediate objects land; these can all be set independently.

To all who support further development on Patreon, in particular:
## Organisation
Who knows yet!

A `.note.version` section is included in every output file, and includes the full version and date string.

## Contributing
Send a patch inline, as an attachment, or a git link and a ref to pull from to [the list](//lists.sr.ht/~nabijaczleweli/voreutils)
([~nabijaczleweli/voreutils@lists.sr.ht](mailto:~nabijaczleweli/voreutils@lists.sr.ht)) or [me](mailto:nabijaczleweli@nabijaczleweli.xyz)
directly. I'm not picky, just please include the repo name in the subject prefix.

## Discussion
Please use the tracker, the list, or [Twitter](//twitter.com/nabijaczleweli/status/1401538687733800961).

## Licences
Except where noted otherwise (e.g. in the headers of files from NetBSD),
all contents of this repository are subject to the [0-clause BSD licence](LICENCE).

## Special thanks
To all who support further development on Patreon, in particular:
  * ThePhD
  * Embark Studios

A cmd/true.cpp => cmd/true.cpp +16 -0
@@ 0,0 1,16 @@
// SPDX-License-Identifier: 0BSD


#include <string_view>
#include <vore-string_view>


int main(int, char ** argv) {
	auto self = vore::basename(argv[0] ?: "(?)");
	if(self == "true")
		return 0;
	else if(self == "false")
		return 1;
	else
		return 2;
}

A include/vore-id.h => include/vore-id.h +5 -0
@@ 0,0 1,5 @@
// SPDX-License-Identifier: 0BSD


extern const char vore_id[];
const char vore_id[] __attribute__((section(".note.version"))) = "voreutils " VOREUTILS_VERSION " (" VOREUTILS_DATE ")";

A include/vore-string_view => include/vore-string_view +20 -0
@@ 0,0 1,20 @@
// SPDX-License-Identifier: 0BSD


#include <string_view>


namespace vore {
	template <class CharT, class Traits>
	constexpr std::basic_string_view<CharT, Traits> basename(const std::basic_string_view<CharT, Traits> & str) noexcept {
		if(size_t idx = str.rfind('/'); idx != std::basic_string_view<CharT, Traits>::npos)
			return str.substr(idx + 1);
		else
			return str;
	}

	template <class CharT>
	constexpr std::basic_string_view<CharT> basename(const CharT * str) {
		return basename(std::basic_string_view<CharT>{str});
	}
}

A man/aliases => man/aliases +1 -0
@@ 0,0 1,1 @@
true.1  false.1

A man/style.css => man/style.css +296 -0
@@ 0,0 1,296 @@
/* $OpenBSD: mandoc.css,v 1.33 2019/06/02 16:50:46 schwarze Exp $ */
/*
 * Standard style sheet for mandoc(1) -Thtml and man.cgi(8).
 *
 * Written by Ingo Schwarze <schwarze@openbsd.org>.
 * I place this file into the public domain.
 * Permission to use, copy, modify, and distribute it for any purpose
 * with or without fee is hereby granted, without any conditions.
 */
/* Tooltips removed. */

/* Global defaults. */

html {		max-width: 65em;
		--bg: #FFFFFF;
		--fg: #000000; }
body {		background: var(--bg);
		color: var(--fg);
		font-family: Helvetica,Arial,sans-serif; }
h1 {		font-size: 110%; }
table {		margin-top: 0em;
		margin-bottom: 0em;
		border-collapse: collapse; }
/* Some browsers set border-color in a browser style for tbody,
 * but not for table, resulting in inconsistent border styling. */
tbody {		border-color: inherit; }
tr {		border-color: inherit; }
td {		vertical-align: top;
		padding-left: 0.2em;
		padding-right: 0.2em;
		border-color: inherit; }
ul, ol, dl {	margin-top: 0em;
		margin-bottom: 0em; }
li, dt {	margin-top: 1em; }

.permalink {	border-bottom: thin dotted;
		color: inherit;
		font: inherit;
		text-decoration: inherit; }
* {		clear: both }

/* Search form and search results. */

fieldset {	border: thin solid silver;
		border-radius: 1em;
		text-align: center; }
input[name=expr] {
		width: 25%; }

table.results {	margin-top: 1em;
		margin-left: 2em;
		font-size: smaller; }

/* Header and footer lines. */

table.head {	width: 100%;
		border-bottom: 1px dotted #808080;
		margin-bottom: 1em;
		font-size: smaller; }
td.head-vol {	text-align: center; }
td.head-rtitle {
		text-align: right; }

table.foot {	width: 100%;
		border-top: 1px dotted #808080;
		margin-top: 1em;
		font-size: smaller; }
td.foot-os {	text-align: right; }

/* Sections and paragraphs. */

.manual-text {
		margin-left: 3.8em; }
.Nd { }
section.Sh { }
h1.Sh {		margin-top: 1.2em;
		margin-bottom: 0.6em;
		margin-left: -3.2em; }
section.Ss { }
h2.Ss {		margin-top: 1.2em;
		margin-bottom: 0.6em;
		margin-left: -1.2em;
		font-size: 105%; }
.Pp {		margin: 0.6em 0em; }
.Sx { }
.Xr { }

/* Displays and lists. */

.Bd { }
.Bd-indent {	margin-left: 3.8em; }

.Bl-bullet {	list-style-type: disc;
		padding-left: 1em; }
.Bl-bullet > li { }
.Bl-dash {	list-style-type: none;
		padding-left: 0em; }
.Bl-dash > li:before {
		content: "\2014  "; }
.Bl-item {	list-style-type: none;
		padding-left: 0em; }
.Bl-item > li { }
.Bl-compact > li {
		margin-top: 0em; }

.Bl-enum {	padding-left: 2em; }
.Bl-enum > li { }
.Bl-compact > li {
		margin-top: 0em; }

.Bl-diag { }
.Bl-diag > dt {
		font-style: normal;
		font-weight: bold; }
.Bl-diag > dd {
		margin-left: 0em; }
.Bl-hang { }
.Bl-hang > dt { }
.Bl-hang > dd {
		margin-left: 5.5em; }
.Bl-inset { }
.Bl-inset > dt { }
.Bl-inset > dd {
		margin-left: 0em; }
.Bl-ohang { }
.Bl-ohang > dt { }
.Bl-ohang > dd {
		margin-left: 0em; }
.Bl-tag {	margin-top: 0.6em;
		margin-left: 5.5em; }
.Bl-tag > dt {
		float: left;
		margin-top: 0em;
		margin-left: -5.5em;
		padding-right: 0.5em;
		vertical-align: top; }
.Bl-tag > dd {
		clear: right;
		column-count: 1;  /* Force block formatting context. */
		width: 100%;
		margin-top: 0em;
		margin-left: 0em;
		margin-bottom: 0.6em;
		vertical-align: top; }
.Bl-compact {	margin-top: 0em; }
.Bl-compact > dd {
		margin-bottom: 0em; }
.Bl-compact > dt {
		margin-top: 0em; }

.Bl-column { }
.Bl-column > tbody > tr { }
.Bl-column > tbody > tr > td {
		margin-top: 1em; }
.Bl-compact > tbody > tr > td {
		margin-top: 0em; }

.Rs {		font-style: normal;
		font-weight: normal; }
.RsA { }
.RsB {		font-style: italic;
		font-weight: normal; }
.RsC { }
.RsD { }
.RsI {		font-style: italic;
		font-weight: normal; }
.RsJ {		font-style: italic;
		font-weight: normal; }
.RsN { }
.RsO { }
.RsP { }
.RsQ { }
.RsR { }
.RsT {		text-decoration: underline; }
.RsU { }
.RsV { }

.eqn { }
.tbl td {	vertical-align: middle; }

.HP {		margin-left: 3.8em;
		text-indent: -3.8em; }

/* Semantic markup for command line utilities. */

table.Nm { }
code.Nm {	font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Fl {		font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Cm {		font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Ar {		font-style: italic;
		font-weight: normal; }
.Op {		display: inline; }
.Ic {		font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Ev {		font-style: normal;
		font-weight: normal;
		font-family: monospace; }
.Pa {		font-style: italic;
		font-weight: normal; }

/* Semantic markup for function libraries. */

.Lb { }
code.In {	font-style: normal;
		font-weight: bold;
		font-family: inherit; }
a.In { }
.Fd {		font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Ft {		font-style: italic;
		font-weight: normal; }
.Fn {		font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Fa {		font-style: italic;
		font-weight: normal; }
.Vt {		font-style: italic;
		font-weight: normal; }
.Va {		font-style: italic;
		font-weight: normal; }
.Dv {		font-style: normal;
		font-weight: normal;
		font-family: monospace; }
.Er {		font-style: normal;
		font-weight: normal;
		font-family: monospace; }

/* Various semantic markup. */

.An { }
.Lk { }
.Mt { }
.Cd {		font-style: normal;
		font-weight: bold;
		font-family: inherit; }
.Ad {		font-style: italic;
		font-weight: normal; }
.Ms {		font-style: normal;
		font-weight: bold; }
.St { }
.Ux { }

/* Physical markup. */

.Bf {		display: inline; }
.No {		font-style: normal;
		font-weight: normal; }
.Em {		font-style: italic;
		font-weight: normal; }
.Sy {		font-style: normal;
		font-weight: bold; }
.Li {		font-style: normal;
		font-weight: normal;
		font-family: monospace; }

/* Tooltip support. */

h1.Sh, h2.Ss {	position: relative; }
.An, .Ar, .Cd, .Cm, .Dv, .Em, .Er, .Ev, .Fa, .Fd, .Fl, .Fn, .Ft,
.Ic, code.In, .Lb, .Lk, .Ms, .Mt, .Nd, code.Nm, .Pa, .Rs,
.St, .Sx, .Sy, .Va, .Vt, .Xr {
		display: inline-block;
		position: relative; }

/* Overrides to avoid excessive margins on small devices. */

@media (max-width: 37.5em) {
.manual-text {
		margin-left: 0.5em; }
h1.Sh, h2.Ss {	margin-left: 0em; }
.Bd-indent {	margin-left: 2em; }
.Bl-hang > dd {
		margin-left: 2em; }
.Bl-tag {	margin-left: 2em; }
.Bl-tag > dt {
		margin-left: -2em; }
.HP {		margin-left: 2em;
		text-indent: -2em; }
}

/* Overrides for a dark color scheme for accessibility. */

@media (prefers-color-scheme: dark) {
html {		--bg: #1E1F21;
		--fg: #EEEFF1; }
:link {		color: #BAD7FF; }
:visited {	color: #F6BAFF; }
}

A man/true.1 => man/true.1 +28 -0
@@ 0,0 1,28 @@
.\" SPDX-License-Identifier: 0BSD
.\"
.Dd
.Dt TRUE 1
.Os
.
.Sh NAME
.Nm true
.Nd do nothing
.Sh SYNOPSIS
.Nm true
.Nm false
.
.Sh OPTIONS
Ignored.
.
.Sh EXIT STATUS
.Bl -tag -compact -width "0 (success)"
.It Sy 0 Pq success
if ran as
.Nm true ,
.It Sy 1
if ran as
.Nm false ,
and
.It Sy 2
otherwise
.El

A voreutils.sublime-project => voreutils.sublime-project +33 -0
@@ 0,0 1,33 @@
{
	"build_systems":
	[
		{
			"working_dir": "$project_path",
			"shell_cmd": "make -j",
			"name": "Build voreutils",

			"target": "ansi_color_build",
			"syntax": "Packages/ANSIescape/ANSI.sublime-syntax"
		}
	],
	"folders":
	[
		{
			"follow_symlinks": true,
			"name": "Source",
			"path": ".",
			"file_include_patterns": ["*.c", "*.cpp", "*.h", "*.hpp", "vore-*", "README*", "Makefile*"],
			"folder_include_patterns": ["cmd", "include"]
		},
		{
			"follow_symlinks": true,
			"name": "Manpages",
			"path": "man"
		},
		{
			"follow_symlinks": true,
			"name": "CI",
			"path": ".builds"
		}
	]
}