commit: 34b87ee5487883414c4c6d18c7120b931a66c62d
parent c7109ce5ce6cbf11ea6490acea624bc675cbf104
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Sat, 19 Jul 2025 07:44:45 +0200
cleanup
Diffstat:
45 files changed, 0 insertions(+), 2248 deletions(-)
diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml
@@ -1,23 +0,0 @@
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-image: freebsd/latest
-packages:
-  - pkgconf
-  - kyua
-  - gcc
-sources:
-  - https://hacktivis.me/git/utils.git
-tasks:
-  - clang: |
-      cd utils
-      CC=clang ./configure
-      make clean test
-  - gcc: |
-      cd utils
-      CC=gcc ./configure
-      make clean test
-triggers:
-  - action: email
-    condition: failure
-    to: contact+builds.sr.ht@hacktivis.me
diff --git a/.builds/netbsd.yml b/.builds/netbsd.yml
@@ -1,23 +0,0 @@
-# SPDX-FileCopyrightText: 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-image: netbsd/latest
-packages:
-  - pkg-config
-  - kyua
-  - clang
-sources:
-  - https://hacktivis.me/git/utils.git
-tasks:
-  - clang: |
-      cd utils
-      CC=clang ./configure
-      DESTDIR=/tmp/clang-destdir make clean test
-  - gcc: |
-      cd utils
-      CC=gcc ./configure
-      DESTDIR=/tmp/gcc-destdir make clean test
-triggers:
-  - action: email
-    condition: failure
-    to: contact+builds.sr.ht@hacktivis.me
diff --git a/.clang-format b/.clang-format
@@ -1,23 +0,0 @@
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-AlignAfterOpenBracket: true
-AlignConsecutiveAssignments: true
-AlignOperands: true
-AlignTrailingComments: true
-AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: true
-AllowShortIfStatementsOnASingleLine: true
-AlwaysBreakAfterReturnType: AllDefinitions
-BinPackArguments: false
-BinPackParameters: false
-BreakBeforeBraces: Allman
-SpaceBeforeParens: Never
-IncludeBlocks: Regroup
-ReflowComments: false
-SortIncludes: true
-UseTab: ForIndentation
-IndentWidth: 2
-TabWidth: 2
-ColumnLimit: 100
-
-NamespaceIndentation: All
diff --git a/.gitignore b/.gitignore
@@ -1,14 +0,0 @@
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-/config.mk
-/target_filter
-/cmd/*
-!/cmd/*.c
-!/cmd/*.ha
-!/cmd/*.1
-*.t.err
-*.o
-
-# Kyua
-/html/
diff --git a/Kyuafile b/Kyuafile
@@ -1,7 +0,0 @@
--- SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
--- SPDX-License-Identifier: MPL-2.0
-syntax(2)
-
-test_suite("utils")
-
-include("test-cmd/Kyuafile")
diff --git a/Makefile b/Makefile
@@ -1,65 +0,0 @@
-# SPDX-FileCopyrightText: 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-include config.mk
-
-all: $(EXE)
-
-.c:
-	rm -f ${<:=.gcov} ${@:=.gcda} ${@:=.gcno}
-	$(CC) -std=c99 $(CFLAGS) -o $@ $< $(LDFLAGS)
-
-.c.o:
-	rm -f ${<:=.gcov} ${@:=.gcda} ${@:=.gcno}
-	$(CC) -std=c99 $(CFLAGS) -c -o $@ $<
-
-cmd/sizeof32: cmd/sizeof.c
-	$(CC) -std=c99 -m32 $(CFLAGS) -o $@ $< $(LDFLAGS)
-
-.PHONY: test check
-check: test
-test: all
-	MALLOC_CHECK_=3 POSIX_ME_HARDER=1 POSIXLY_CORRECT=1 kyua test || (kyua report --verbose --results-filter=broken,failed; false)
-
-.PHONY: lint
-lint:
-	$(SHELLCHECK) ./configure test_all.sh test_functions.sh ./sh/*
-	SHELLCHECK=${SHELLCHECK} ./test-cmd/shellcheck
-	${FLAWFINDER} --error-level=4 .
-	$(MANDOC) -Tlint -Wunsupp,error,warning $(MAN1)
-	$(REUSE) lint
-
-clean:
-	rm -fr $(EXE)
-	rm -fr ${EXE:=.c.gcov} ${EXE:=.gcda} ${EXE:=.gcno}
-
-install: script-install cmd-install
-
-script-install:
-	mkdir -p $(DESTDIR)$(SHELLDIR)/ $(DESTDIR)$(PERLDIR)/
-	cp -r sh/* $(DESTDIR)$(SHELLDIR)/
-	cp -r perl/* $(DESTDIR)$(PERLDIR)/
-
-cmd-install:
-	mkdir -p ${DESTDIR}${BINDIR}/
-	cp -p ${EXE} ${DESTDIR}${BINDIR}/
-	chown 0:0 ${DESTDIR}${BINDIR}/memsys
-	chmod 4755 ${DESTDIR}${BINDIR}/memsys
-	mkdir -p ${DESTDIR}${MANDIR}/man1
-	cp -p ${MAN1} ${DESTDIR}${MANDIR}/man1
-
-.PHONY: coverage
-coverage:
-	$(GCOV) -b $(EXE)
-
-C_SOURCES = cmd/*.c lib/*.h lib/*.c
-format: $(C_SOURCES)
-	clang-format -style=file -assume-filename=.clang-format -i $(C_SOURCES)
-
-cmd/lolcat: cmd/lolcat.c Makefile
-	rm -f ${<:=.gcov} ${@:=.gcda} ${@:=.gcno}
-	$(CC) -std=c99 $(CFLAGS) -o $@ cmd/lolcat.c -lm $(LDFLAGS)
-
-cmd/xcd: cmd/xcd.c Makefile
-	rm -f ${<:=.gcov} ${@:=.gcda} ${@:=.gcno}
-	$(CC) -std=c99 $(CFLAGS) -o $@ cmd/xcd.c -lm $(LDFLAGS)
diff --git a/cmd/args.1 b/cmd/args.1
@@ -1,20 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2022-02-13
-.Dt ARGS 1
-.Os
-.Sh NAME
-.Nm args
-.Nd dump all passed arguments
-.Sh SYNOPSIS
-.Nm
-.Op Ar arguments
-.Sh DESCRIPTION
-.Nm
-will print out all the arguments passed to it.
-This is intended as a tool for shell debugging.
-.Sh EXIT STATUS
-.Ex -std
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/args.c b/cmd/args.c
@@ -1,20 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-// printf()
-#include <stdio.h>
-
-int
-main(int argc, char *argv[])
-{
-	printf("argc: %i\n", argc);
-
-	for(int i = 0; i < argc; i++)
-	{
-		printf("argv[%d]: \"%s\"\n", i, argv[i]);
-	}
-
-	return 0;
-}
diff --git a/cmd/del.1 b/cmd/del.1
@@ -1,22 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2021-05-13
-.Dt DEL 1
-.Os
-.Sh NAME
-.Nm del
-.Nd delete any file
-.Sh SYNOPSIS
-.Nm
-.Ar
-.Sh DESCRIPTION
-Simpler replacement to
-.Xr rm 1 ,
-notably treating directories like any other file.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr remove 3
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/del.c b/cmd/del.c
@@ -1,24 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <errno.h>  /* errno */
-#include <stdio.h>  /* remove() */
-#include <string.h> /* strerror() */
-
-int
-main(int argc, char *argv[])
-{
-	for(int i = 1; i < argc; i++)
-	{
-		if(remove(argv[i]) < 0)
-		{
-			// TODO: interact on write protection to force deletion
-			fprintf(stderr, "del: remove(%s) error: %s\n", argv[i], strerror(errno));
-			return 1;
-		}
-	}
-
-	return 0;
-}
diff --git a/cmd/errno.1 b/cmd/errno.1
@@ -1,22 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2022-04-19
-.Dt ENV 1
-.Os
-.Sh NAME
-.Nm errno
-.Nd print errno message for a value
-.Sh SYNOPSIS
-.Nm
-.Ar value
-.Sh DESCRIPTION
-.Nm
-shall print the errno message associated with
-.Ar value .
-.Sh EXIT STATUS
-.Ex -std
-.Sh STANDARDS
-No applicable one known.
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/errno.c b/cmd/errno.c
@@ -1,42 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#include <errno.h>  // errno
-#include <stdio.h>  // puts, perror
-#include <stdlib.h> // strtol
-#include <string.h> // strerror
-
-int
-main(int argc, char *argv[])
-{
-	if(argc != 2)
-	{
-		puts("usage: errno <number>");
-		return 1;
-	}
-
-	errno = 0;
-
-	int err = (int)(strtol(argv[1], NULL, 10));
-	if(errno != 0)
-	{
-		perror("errno: strtol");
-		return 1;
-	}
-
-	errno     = 0;
-	char *msg = strerror(err);
-	if(errno != 0)
-	{
-		perror("errno: strerror");
-		return 1;
-	}
-
-	if(puts(msg) < 0)
-	{
-		return 1;
-	}
-
-	return 0;
-}
diff --git a/cmd/humanize.1 b/cmd/humanize.1
@@ -1,31 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2023-06-05
-.Dt HUMANIZE 1
-.Os
-.Sh NAME
-.Nm humanize
-.Nd format numbers into human readable form
-.Sh SYNOPSIS
-.Nm
-.Op Fl dbt
-.Ar number ...
-.Sh DESCRIPTION
-Takes each
-.Ar number
-and format it in a human readable form, one per line.
-It supports the following options:
-.Bl -tag -width Ds
-.It Fl b
-Divide by 1024, typically used for bytes.
-.It Fl d
-Divide by 1000, this is the default but made explicit in case of changes without breaking scripts.
-.It Fl t
-.Ar number
-represents time duration in seconds.
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/humanize.c b/cmd/humanize.c
@@ -1,144 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-
-#include <err.h>     // errx
-#include <errno.h>   // EINVAL, ERANGE
-#include <limits.h>  // LLONG_MIN, LLONG_MAX
-#include <stdbool.h> // bool
-#include <stdio.h>   // fprintf, perror, sscanf
-#include <stdlib.h>  // strtonum
-#include <unistd.h>  // opt*, getopt
-
-void
-dtosi(double num, char *buf, size_t bufsize, bool iec)
-{
-#define PFX 11
-	char *si_prefixes[PFX]  = {"", "k", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q"};
-	char *iec_prefixes[PFX] = {
-	    "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", "RiB", "QiB"};
-
-	int div         = iec ? 1024 : 1000;
-	char **prefixes = iec ? iec_prefixes : si_prefixes;
-
-	unsigned quotient = 0;
-
-	while(num > div && quotient < PFX)
-	{
-		num /= div;
-		quotient += 1;
-	}
-
-	snprintf(buf, bufsize, "%g %s", num, prefixes[quotient]);
-}
-
-static void
-usage()
-{
-	fprintf(stderr, "Usage: humanize [-bdt] number\n");
-}
-
-int
-main(int argc, char *argv[])
-{
-	// default to -d
-	bool iec = false, time = false;
-
-	int c = -1;
-	while((c = getopt(argc, argv, ":bdt")) != -1)
-	{
-		switch(c)
-		{
-		case 'b':
-			iec = true;
-			break;
-		case 'd':
-			iec = false;
-			break;
-		case 't':
-			time = true;
-			break;
-		case ':':
-			fprintf(stderr, "humanize: Error: Missing operand for option: '-%c'\n", optopt);
-			usage();
-			return 1;
-		case '?':
-			fprintf(stderr, "humanize: Error: Unrecognised option: '-%c'\n", optopt);
-			usage();
-			return 1;
-		}
-	}
-
-	argc -= optind;
-	argv += optind;
-
-	if(argc < 1)
-	{
-		usage();
-		return 1;
-	}
-
-	for(int argi = 0; argi < argc; argi++)
-	{
-		const char *errstr = NULL;
-		char buf[32]       = "";
-
-		if(time)
-		{
-			int year = 0, month = 0, mday = 0, hour = 0, min = 0, sec = 0;
-			long int epoch = 0;
-
-			if(sscanf(argv[argi], "%ld", &epoch) < 1)
-			{
-				perror("humanize: sscanf");
-				return 1;
-			}
-
-			year = epoch / 31556926; // round(year)
-			epoch %= 31556926;
-			month = epoch / 2629743; // year/12
-			epoch %= 2629743;
-			mday = epoch / 86400;
-			epoch %= 86400;
-
-			hour = epoch / 3600;
-			epoch %= 3600;
-			min = epoch / 60;
-			epoch %= 60;
-			sec = epoch;
-
-			if(year > 0) printf("%d年 ", year);
-			if(month > 0) printf("%d月 ", month);
-			if(mday > 0) printf("%d日 ", mday);
-			if(hour > 0) printf("%dh ", hour);
-			if(min > 0) printf("%dm ", min);
-			if(sec > 0) printf("%ds", sec);
-			printf("\n");
-
-			continue;
-		}
-
-		errno       = 0;
-		long long n = strtoll(argv[argi], NULL, 10);
-		if(n == LLONG_MIN)
-		{
-			errx(1, "%s is too small", argv[argi]);
-		}
-		if(n == LLONG_MAX)
-		{
-			errx(1, "%s is too large", argv[argi]);
-		}
-		if(errno != 0)
-		{
-			perror("humanize: strtoll");
-		}
-
-		dtosi(n, buf, 32, iec);
-
-		printf("%s\n", buf);
-	}
-
-	return 0;
-}
diff --git a/cmd/lolcat.1 b/cmd/lolcat.1
@@ -1,36 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2021-05-15
-.Dt LOLCAT 1
-.Os
-.Sh NAME
-.Nm lolcat
-.Nd a truecolor rainbow filter
-.Sh SYNOPSIS
-.Nm
-.Ar
-.Sh DESCRIPTION
-.Nm
-takes each character from it's standard input and prints it with a truecolor escape sequence, making the text output rainbow colored given enough characters.
-.Pp
-.Nm
-also replaces escape to
-.Sq ^[
-in bold, this allows to strip escape codes easily.
-.Sh KNOWN ISSUES & LIMITATIONS
-.Bl -bullet
-.It
-Frequence is not adjustable yet
-.It
-.Nm
-puts escape codes even when stdout isn't a tty, this is expected, do not call
-.Nm
-otherwise
-.El
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Lk https://github.com/busyloop/lolcat "Original lolcat program, in ruby"
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/lolcat.c b/cmd/lolcat.c
@@ -1,113 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <errno.h>  /* errno */
-#include <math.h>   /* sin() */
-#include <stdio.h>  /* fgetc(), fputc(), printf(), fopen(), fclose() */
-#include <string.h> /* strerror() */
-
-void
-rainbow(double freq, int i)
-{
-	double red, green, blue;
-	double pi = 3.14159;
-
-	red   = sin(freq * i + 0) * 127 + 128;
-	green = sin(freq * i + 2 * pi / 3) * 127 + 128;
-	blue  = sin(freq * i + 4 * pi / 3) * 127 + 128;
-
-	printf("[38;2;%02d;%02d;%02dm", (int)red, (int)green, (int)blue);
-}
-
-int
-concat(FILE *stream)
-{
-	double freq = 0.1;
-	int i       = 0;
-
-	int c;
-	errno = 0;
-	while((c = fgetc(stream)) != EOF)
-	{
-		rainbow(freq, i);
-		i++;
-		if(c == '')
-		{
-			printf("[1m^[[0m");
-			continue;
-		}
-
-		if(fputc(c, stdout) == EOF)
-		{
-			fprintf(stderr, "\n[0mlolcat: Write error: %s\n", strerror(errno));
-			return 1;
-		}
-	}
-
-	if(c == EOF && errno != 0)
-	{
-		fprintf(stderr, "\n[0mlolcat: Read error: %s\n", strerror(errno));
-		return 1;
-	}
-
-	return 0;
-}
-
-int
-main(int argc, char *argv[])
-{
-	int ret = 0;
-
-	if(argc <= 1)
-	{
-		ret = concat(stdin);
-		goto end;
-	}
-
-	for(int argi = 1; argi < argc; argi++)
-	{
-		if(strncmp(argv[argi], "-", 2) == 0)
-		{
-			ret = concat(stdin);
-			if(ret != 0)
-			{
-				goto end;
-			}
-		}
-		else if(strncmp(argv[argi], "--", 3) == 0)
-		{
-			continue;
-		}
-		else
-		{
-			FILE *file = fopen(argv[argi], "r");
-
-			if(!file)
-			{
-				fprintf(stderr, "\n[0mlolcat: Error opening ‘%s’: %s\n", argv[argi], strerror(errno));
-				ret = 1;
-				goto end;
-			}
-			else
-			{
-				ret = concat(file);
-				if(ret != 0)
-				{
-					goto end;
-				}
-
-				ret = fclose(file);
-				if(ret != 0)
-				{
-					goto end;
-				}
-			}
-		}
-	}
-
-end:
-	printf("[0m");
-	return ret;
-}
diff --git a/cmd/mdate.c b/cmd/mdate.c
@@ -1,22 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <stdio.h> /* printf */
-#include <time.h>  /* time */
-
-// 3600*24.5
-#define cycle 88200
-
-int
-main(void)
-{
-	time_t now      = time(NULL);
-	time_t date_now = now / cycle;
-	time_t time_now = now % cycle;
-
-	printf("%lX,%05lX\n", date_now, time_now);
-
-	return 0;
-}
diff --git a/cmd/memsys.c b/cmd/memsys.c
@@ -1,37 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <fcntl.h>  /* open() */
-#include <stdio.h>  /* perror() */
-#include <unistd.h> /* close(), write() */
-
-#define SYS_POWER_STATE "/sys/power/state"
-
-int
-main(void)
-{
-	int fd, err = 0;
-	char *entry       = "mem";
-	size_t entry_size = 3;
-
-	fd = open(SYS_POWER_STATE, O_WRONLY);
-
-	if(fd == -1)
-	{
-		perror("memsys: open(\"" SYS_POWER_STATE "\")");
-		err++;
-	}
-	else
-	{
-		if(write(fd, entry, entry_size) < (ssize_t)entry_size)
-		{
-			perror("memsys: write(fd, \"mem\", 3)");
-			err++;
-		}
-		close(fd);
-	}
-
-	return err;
-}
diff --git a/cmd/pat.1 b/cmd/pat.1
@@ -1,29 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2023-02-22
-.Dt PAT 1
-.Os
-.Sh NAME
-.Nm pat
-.Nd print concatenated files
-.Sh SYNOPSIS
-.Nm
-.Op Ar files ...
-.Sh DESCRIPTION
-.Nm
-writes the number of files to be read, then in sequence:
-prints their filename; then reads the
-.Ar file
-and writes it on the standard output.
-If no
-.Ar file
-is given,
-.Nm
-uses standard input as one.
-.Sh EXIT STATUS
-.Ex -std
-.Sh STANDARDS
-None applicable.
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/pat.c b/cmd/pat.c
@@ -1,89 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <errno.h>  /* errno */
-#include <fcntl.h>  /* open(), O_RDONLY */
-#include <stdio.h>  /* fprintf(), fwrite(), BUFSIZ */
-#include <string.h> /* strerror(), strncmp() */
-#include <unistd.h> /* read(), close() */
-
-int files = 1;
-
-int
-concat(int fd, const char *fdname)
-{
-	ssize_t c;
-	char buf[BUFSIZ];
-
-	// File Number as an esccape/containment solution
-	printf("\n###	File %d << %s >>	###\n", files++, fdname);
-
-	while((c = read(fd, buf, sizeof(buf))) > 0)
-	{
-		if(fwrite(buf, (size_t)c, 1, stdout) < 0)
-		{
-			fprintf(stderr, "pat: Error writing: %s\n", strerror(errno));
-			return 1;
-		}
-	}
-
-	if(c < 0)
-	{
-		fprintf(stderr, "pat: Error reading ‘%s’: %s\n", fdname, strerror(errno));
-		return 1;
-	}
-
-	return 0;
-}
-
-int
-main(int argc, char *argv[])
-{
-	if(argc <= 1)
-	{
-		printf("###	1 Files	###");
-		return concat(0, "<stdin>");
-	}
-
-	// no \n, concat starts with one
-	printf("###	%d Files	###", argc - 1);
-
-	for(int argi = 1; argi < argc; argi++)
-	{
-		if(strncmp(argv[argi], "-", 2) == 0)
-		{
-			if(concat(0, "<stdin>") != 0)
-			{
-				return 1;
-			}
-		}
-		else if(strncmp(argv[argi], "--", 3) == 0)
-		{
-			continue;
-		}
-		else
-		{
-			int fd = open(argv[argi], O_RDONLY);
-			if(fd < 0)
-			{
-				fprintf(stderr, "pat: Error opening ‘%s’: %s\n", argv[argi], strerror(errno));
-				return 1;
-			}
-
-			if(concat(fd, argv[argi]) != 0)
-			{
-				return 1;
-			}
-
-			if(close(fd) < 0)
-			{
-				fprintf(stderr, "pat: Error closing ‘%s’: %s\n", argv[argi], strerror(errno));
-				return 1;
-			}
-		}
-	}
-
-	return 0;
-}
diff --git a/cmd/sizeof.c b/cmd/sizeof.c
@@ -1,63 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <limits.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#define FORMAT_M "sizeof(%s) == %d bytes; %d bits; (MIN:MAX) == (%d:%d)\n"
-
-static void
-print_size(size_t size, char *type)
-{
-	int ret = printf("sizeof(%s) == %zd bytes; %zd bits\n", type, size, size * CHAR_BIT);
-	if(ret < 0)
-	{
-		exit(1);
-	}
-}
-
-int
-main(void)
-{
-	int c, ret;
-
-	ret = printf("CHAR_BIT == %d\n", CHAR_BIT);
-	if(ret < 0)
-	{
-		exit(1);
-	}
-
-	c = sizeof(int);
-	/* flawfinder: ignore. Not given by user but by a macro */
-	ret = printf(FORMAT_M, "int", c, c * CHAR_BIT, INT_MIN, INT_MAX);
-	if(ret < 0)
-	{
-		exit(1);
-	}
-	c = sizeof(char);
-	/* flawfinder: ignore. Not given by user but by a macro */
-	ret = printf(FORMAT_M, "char", c, c * CHAR_BIT, CHAR_MIN, CHAR_MAX);
-	if(ret < 0)
-	{
-		exit(1);
-	}
-
-	print_size(sizeof(uint8_t), "uint8_t");
-	print_size(sizeof(short), "short");
-	print_size(sizeof(double), "double");
-	print_size(sizeof(long), "long");
-	print_size(sizeof(double long), "double long");
-	print_size(sizeof(long long), "long long");
-	print_size(sizeof(long int), "long int");
-	print_size(sizeof(char[BUFSIZ]), "char[BUFSIZ]");
-	print_size(sizeof(char[256]), "char[256]");
-	print_size(sizeof(char[32]), "char[32]");
-	print_size(sizeof(char[2]), "char[2]");
-	print_size(sizeof('a'), "'a'");
-
-	return 0;
-}
diff --git a/cmd/sname.1 b/cmd/sname.1
@@ -1,25 +0,0 @@
-.\" Collection of Unix tools, comparable to coreutils
-.\" Copyright 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-.\" SPDX-License-Identifier: MPL-2.0
-.Dd 2021-04-05
-.Dt INAME 1
-.Os
-.Sh NAME
-.Nm sname
-.Nd Structured output of system name and info
-.Sh SYNOPSIS
-.Nm
-.Sh DESCRIPTION
-.Nm
-is equivalent to
-.Xr uname 1
-except the output is a sorted tab-separated key-value list, which allows to be extracted and extended.
-.Sh EXIT STATUS
-.Ex -std
-.Sh SEE ALSO
-.Xr look 1 ,
-.Xr uname 3
-.Sh STANDARDS
-No applicable one known.
-.Sh AUTHORS
-.An Haelwenn (lanodan) Monnier Aq Mt contact@hacktivis.me
diff --git a/cmd/sname.c b/cmd/sname.c
@@ -1,39 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-#define _GNU_SOURCE
-#include <stdio.h>       // printf(), perror()
-#include <stdlib.h>      // exit()
-#include <sys/utsname.h> // utsname, uname()
-
-void
-print_kv(char *key, char *value)
-{
-	if(printf("%s	%s\n", key, value) < 0)
-	{
-		perror("sname: printf");
-		exit(1);
-	}
-}
-
-int
-main()
-{
-	struct utsname name;
-	if(uname(&name) != 0)
-	{
-		perror("uname");
-		return 1;
-	}
-
-#ifdef __linux__
-	print_kv("domainname", name.domainname);
-#endif
-	print_kv("machine", name.machine);
-	print_kv("nodename", name.nodename);
-	print_kv("release", name.release);
-	print_kv("sysname", name.sysname);
-	print_kv("version", name.version);
-
-	return 0;
-}
diff --git a/cmd/xcd.c b/cmd/xcd.c
@@ -1,255 +0,0 @@
-// Collection of Unix tools, comparable to coreutils
-// SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-// SPDX-License-Identifier: MPL-2.0
-
-#define _POSIX_C_SOURCE 200809L
-#include <ctype.h>  /* isprint() */
-#include <errno.h>  /* errno */
-#include <math.h>   /* sin() */
-#include <stdint.h> /* uint8_t */
-#include <stdio.h>  /* printf(), fread(), fopen(), fclose() */
-#include <string.h> /* memset(), strerror() */
-
-struct rgb
-{
-	double red, green, blue;
-};
-
-static struct rgb
-rgb_char(unsigned char i)
-{
-	double freq = 0.018;
-
-	if(i == 0)
-	{
-		return (struct rgb){64, 64, 64};
-	}
-	else
-	{
-		struct rgb color;
-		double pi = 3.14159;
-
-		color.red   = sin(freq * i + 0 * pi / 3) * 127 + 128;
-		color.green = sin(freq * i + 2 * pi / 3) * 127 + 128;
-		color.blue  = sin(freq * i + 4 * pi / 3) * 127 + 128;
-
-		return color;
-	}
-}
-
-static int
-print_hex_rgb(unsigned char c)
-{
-	struct rgb color = rgb_char(c);
-
-	int ret = printf("[38;2;%d;%d;%dm%02hhx ", (int)color.red, (int)color.green, (int)color.blue, c);
-
-	return (ret <= 0) ? 1 : 0;
-}
-
-static int
-print_xcd_reset()
-{
-	int ret = printf("[0m[48;2;0;0;0m");
-
-	return (ret <= 0) ? 1 : 0;
-}
-
-static int
-print_plain_rgb(char *line, size_t len)
-{
-	if(print_xcd_reset() != 0)
-	{
-		return 1;
-	}
-
-	if(printf(" >") <= 0)
-	{
-		return 1;
-	}
-
-	for(size_t i = 0; i < len; i++)
-	{
-		struct rgb color = rgb_char((unsigned char)line[i]);
-		int ret          = 0;
-
-		ret = printf("[38;2;%d;%d;%dm%c",
-		             (int)color.red,
-		             (int)color.green,
-		             (int)color.blue,
-		             isprint(line[i]) ? line[i] : '.');
-
-		if(ret <= 0)
-		{
-			return 1;
-		}
-	}
-
-	if(print_xcd_reset() != 0)
-	{
-		return 1;
-	}
-
-	if(printf("<") <= 0)
-	{
-		return 1;
-	}
-
-	return 0;
-}
-
-#define WIDTH 16
-
-int
-concat(FILE *stream)
-{
-	int cols = 0;
-	char line[WIDTH];
-	char c;
-	unsigned int bytes = 0;
-	struct rgb pos_rgb;
-	int ret = 0;
-	errno   = 0;
-
-	memset(&line, 0, WIDTH);
-
-	if(print_xcd_reset() != 0)
-	{
-		goto werr;
-	}
-
-	pos_rgb = rgb_char((unsigned char)bytes);
-
-	ret = printf(
-	    "[38;2;%d;%d;%dm0x%06x ", (int)pos_rgb.red, (int)pos_rgb.green, (int)pos_rgb.blue, bytes);
-	if(ret <= 0)
-	{
-		goto werr;
-	}
-
-	while(fread(&c, 1, 1, stream) > 0)
-	{
-		if(cols >= WIDTH)
-		{
-			print_plain_rgb(line, (size_t)cols);
-			memset(&line, 0, WIDTH);
-
-			pos_rgb = rgb_char((unsigned char)bytes);
-			printf("\n[38;2;%d;%d;%dm0x%06x ",
-			       (int)pos_rgb.red,
-			       (int)pos_rgb.green,
-			       (int)pos_rgb.blue,
-			       bytes);
-
-			cols = 0;
-		}
-
-		ret = print_hex_rgb((unsigned char)c);
-		if(ret != 0)
-		{
-			goto werr;
-		}
-
-		line[cols] = c;
-
-		cols++;
-		bytes++;
-	}
-
-	// Fill the rest of the hex space with spaces
-	for(; cols < WIDTH; cols++)
-	{
-		ret = printf("   ");
-
-		if(ret <= 0)
-		{
-			goto werr;
-		}
-	}
-
-	if(print_xcd_reset() != 0)
-	{
-		goto werr;
-	}
-
-	ret = print_plain_rgb(line, (size_t)cols);
-	if(ret != 0)
-	{
-		goto werr;
-	}
-
-	pos_rgb = rgb_char((unsigned char)bytes);
-	ret     = printf(
-      "\n[38;2;%d;%d;%dm0x%06x\n", (int)pos_rgb.red, (int)pos_rgb.green, (int)pos_rgb.blue, bytes);
-	if(ret <= 0)
-	{
-		goto werr;
-	}
-
-	if(print_xcd_reset() != 0)
-	{
-		goto werr;
-	}
-
-	return 0;
-
-werr:
-	fprintf(stderr, "\n[0mxcd: Write error: %s\n", strerror(errno));
-	return 1;
-}
-
-int
-main(int argc, char *argv[])
-{
-	int err = 0;
-
-	if(argc <= 1)
-	{
-		if(concat(stdin) != 0)
-		{
-			err = 1;
-			goto cleanup;
-		}
-	}
-	else
-	{
-		for(int argi = 1; (err == 0) && (argi < argc); argi++)
-		{
-			if(strncmp(argv[argi], "-", 2) == 0)
-			{
-				if(concat(stdin) != 0)
-				{
-					err = 1;
-					goto cleanup;
-				}
-			}
-			else
-			{
-				FILE *file = fopen(argv[argi], "r");
-				if(!file)
-				{
-					fprintf(stderr, "\n[0mxcd: Error opening ‘%s’: %s\n", argv[argi], strerror(errno));
-					err = 1;
-					goto cleanup;
-				}
-				else
-				{
-					err += concat(file);
-					err += fclose(file);
-
-					if(err != 0)
-					{
-						fprintf(stderr, "\n[0mxcd: Error closing ‘%s’: %s\n", argv[argi], strerror(errno));
-						err = 1;
-						goto cleanup;
-					}
-				}
-			}
-		}
-	}
-
-cleanup:
-	printf("[0m");
-
-	return err;
-}
diff --git a/configure b/configure
@@ -1,223 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-DEPS=""
-
-usage() {
-cat <<END
-Usage: [variables] configure [variables]
-
-Variables:
-  PREFIX=DIR
-  BINDIR=DIR
-  SHELLDIR=DIR
-  PERLDIR=DIR
-  MANDIR=DIR
-
-  PKGCONFIG=BIN
-  MSGFMT=BIN
-  CC=BIN
-  MAKE=BIN
-  MANDOC=BIN
-  SHELLCHECK=BIN
-  FLAWFINDER=BIN
-  GCOV=BIN
-  REUSE=BIN
-
-  CFLAGS=OPTIONS
-  LDFLAGS=OPTIONS
-  EXTRA_CFLAGS=OPTIONS
-
-Variables are set in the following order: Default, Environment, Arguments
-
-Dependencies: See the README.md file
-END
-}
-
-is_ok() {
-	status="$?"
-
-	if test $status -eq 0; then
-		printf " OK\n"
-	else
-		printf " FAIL\n"
-	fi
-
-	return $status
-}
-
-or_die() {
-	is_ok || exit 1
-}
-
-pkg_config_check() {
-	printf 'Checking: %s %s ...' "${PKGCONFIG}" "$*"
-	"${PKGCONFIG}" "$@"
-	is_ok
-}
-
-gen_targets() {
-	printf 'EXE = '
-	printf '%s\n ' cmd/*.c | grep -v -f target_filter | sed 's;.c$;;' | tr -d '\n'
-	echo
-
-	printf 'MAN1 = '
-	printf '%s\n ' cmd/*.1 | grep -v -f target_filter | tr -d '\n'
-	echo
-}
-
-check_cmd() {
-	var="$1"
-	full_cmd="$2"
-
-	# shellcheck disable=SC2086
-	set -- $full_cmd
-	cmd="$1"
-
-	printf 'Checking $%s = %s command existance ...' "$var" "$full_cmd"
-	command -v "$cmd" >/dev/null ; is_ok
-}
-
-## User configuration
-
-# defaults
-PREFIX="${PREFIX:-/usr/local}"
-
-PKGCONFIG="${PKGCONFIG:-pkg-config}"
-MSGFMT="${MSGFMT:-msgfmt}"
-CC="${CC:-cc}"
-MAKE="${MAKE:-make}"
-GCOV="${GCOV:-gcov}"
-# -DDEBUG: Otherwise assert() does nothing, fine to be removed in production
-CFLAGS="${CFLAGS:--g -O2 -DDEBUG}"
-MANDOC="${MANDOC:-mandoc}"
-SHELLCHECK="${SHELLCHECK:-shellcheck}"
-FLAWFINDER="${FLAWFINDER:-flawfinder}"
-REUSE="${REUSE:-reuse}"
-
-# Also allow variables through arguments
-for i; do
-	case "$i" in
-	-h|--help)
-		usage
-		exit 1
-	;;
-	-*)
-		printf "Unknown argument ‘%s’\n" "${i}"
-		usage
-		exit 1
-	;;
-	*=*)
-		# shellcheck disable=SC2163
-		export "$i"
-		shift
-	;;
-	*)
-		printf "Unknown argument ‘%s’\n" "${i}"
-		usage
-		exit 1
-	;;
-	esac
-done
-
-# Fallback definitions for dirs, based on $PREFIX
-BINDIR="${BINDIR:-${PREFIX}/bin}"
-SHELLDIR="${SHELLDIR:-${BINDIR}}"
-PERLDIR="${PERLDIR:-${BINDIR}}"
-MANDIR="${MANDIR:-${PREFIX}/share/man}"
-
-# Add some extra CFLAGS
-CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
-
-printf 'Pruning old configurations ...'
-rm -f config.mk && echo '#' > target_filter ; or_die
-
-## System checks
-# commands
-check_cmd PKGCONFIG "$PKGCONFIG" || exit 1
-check_cmd CC "$CC" || exit 1
-check_cmd MAKE "$MAKE" || exit 1
-
-if check_cmd GCOV "$GCOV"
-then
-	:
-else
-	echo 'Notice: "coverage" target will fail'
-	GCOV="false"
-fi
-
-if check_cmd MANDOC "$MANDOC"
-then
-	:
-else
-	echo 'Notice: Linting depending on mandoc disabled'
-	MANDOC="true"
-fi
-
-if check_cmd SHELLCHECK "$SHELLCHECK"
-then
-	:
-else
-	echo 'Notice: Linting depending on shellcheck disabled'
-	SHELLCHECK="true"
-fi
-
-if check_cmd FLAWFINDER "$FLAWFINDER"
-then
-	:
-else
-	echo 'Notice: Linting depending on flawfinder disabled'
-	FLAWFINDER="true"
-fi
-
-if check_cmd REUSE "$REUSE"
-then
-	:
-else
-	echo 'Notice: Copyright linting depending on reuse disabled'
-	REUSE="true"
-fi
-
-echo
-
-# pkg-config
-for dep in ${DEPS}
-do
-	pkg_config_check --exists "$dep" || exit 1
-done
-
-echo
-
-## Configuration write
-
-printf 'Writing to config.mk ...'
-cat >config.mk <<EOF
-# Autogenerated by ./configure
-PREFIX   = ${PREFIX}
-BINDIR   = ${BINDIR}
-SHELLDIR = ${SHELLDIR}
-PERLDIR  = ${PERLDIR}
-MANDIR   = ${MANDIR}
-
-PKGCONFIG = ${PKGCONFIG}
-CC = ${CC}
-MAKE = ${MAKE}
-MANDOC = ${MANDOC}
-SHELLCHECK = ${SHELLCHECK}
-FLAWFINDER = ${FLAWFINDER}
-MSGFMT = ${MSGFMT}
-DBG = ${DBG}
-GCOV = ${GCOV}
-REUSE = ${REUSE}
-
-CFLAGS = ${CFLAGS}
-LDFLAGS = ${LDFLAGS}
-EOF
-is_ok
-
-gen_targets >> config.mk ; or_die
-
-echo
-
-echo 'Done, you can now run make'
diff --git a/sh/wordsort b/sh/wordsort
@@ -1,6 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-# Uses -z on sort(1), present in GNU, FreeBSD, OpenBSD, BusyBox ; absent in NetBSD
-tr ' ' '\000' | LC_ALL=C.UTF-8 sort -z | tr '\000' ' '
diff --git a/test-cmd/Kyuafile b/test-cmd/Kyuafile
@@ -1,20 +0,0 @@
--- SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
--- SPDX-License-Identifier: MPL-2.0
-syntax(2)
-
-test_suite("utils")
-
-basedir = fs.dirname(fs.dirname(current_kyuafile()))
-
--- 9,$|LC_ALL=C.UTF-8 sort 
--- atf_test_program{name="pat", required_files=basedir.."/cmd/pat", timeout=1}
-atf_test_program{name="args", required_files=basedir.."/cmd/args", timeout=1}
-atf_test_program{name="del", required_files=basedir.."/cmd/del", timeout=1}
-atf_test_program{name="errno", required_files=basedir.."/cmd/errno", timeout=1}
-atf_test_program{name="humanize", required_files=basedir.."/cmd/humanize", timeout=1}
-atf_test_program{name="lolcat", required_files=basedir.."/cmd/lolcat", timeout=1}
-atf_test_program{name="mdate", required_files=basedir.."/cmd/mdate", timeout=1}
-atf_test_program{name="memsys", required_files=basedir.."/cmd/memsys", timeout=1}
-atf_test_program{name="sizeof", required_files=basedir.."/cmd/sizeof", timeout=1}
-atf_test_program{name="sname", required_files=basedir.."/cmd/sname", timeout=1}
-atf_test_program{name="xcd", required_files=basedir.."/cmd/xcd", timeout=1}
diff --git a/test-cmd/args b/test-cmd/args
@@ -1,47 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-
-atf_test_case noargs
-noargs_body() {
-	atf_check -o 'inline:argc: 1
-argv[0]: "../cmd/args"
-' ../cmd/args
-}
-
-atf_test_case onearg
-onearg_body() {
-	atf_check -o 'inline:argc: 2
-argv[0]: "../cmd/args"
-argv[1]: "a"
-' ../cmd/args a
-}
-
-atf_test_case twoargs
-twoargs_body() {
-	atf_check -o 'inline:argc: 3
-argv[0]: "../cmd/args"
-argv[1]: "a"
-argv[2]: "b c"
-' ../cmd/args a 'b c'
-}
-
-atf_test_case options
-options_body() {
-	atf_check -o 'inline:argc: 5
-argv[0]: "../cmd/args"
-argv[1]: "-1"
-argv[2]: "+2"
-argv[3]: "--3"
-argv[4]: "/4"
-' ../cmd/args -1 +2 --3 /4
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-	atf_add_test_case noargs
-	atf_add_test_case onearg
-	atf_add_test_case twoargs
-	atf_add_test_case options
-}
diff --git a/test-cmd/date b/test-cmd/date
@@ -1,93 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case noargs
-noargs_body() {
-	atf_check -o not-empty ../cmd/date
-}
-
-atf_test_case badarg
-badarg_body() {
-	atf_check -s 'exit:1' -e "inline:date: Error: Unrecognised option: '-x'\ndate [-uR][-d datetime] [+format]\n" ../cmd/date -x
-}
-
-atf_test_case epoch
-epoch_body() {
-	atf_check -o "match:^[0-9]+$" ../cmd/date '+%s'
-	atf_check -o "inline:1155544496\n" ../cmd/date -uR -d @1155544496 '+%s'
-}
-
-atf_test_case rfc3339
-rfc3339_body() {
-	atf_check -o "match:^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\+[0-9]{4}$" ../cmd/date '+%FT%T%z'
-	atf_check -o "match:^2006\-08\-14T08:34:56[+\-]00:?00$" ../cmd/date -uR -d @1155544496 '+%FT%T%z'
-}
-
-atf_test_case rfc5322
-rfc5322_body() {
-	atf_check -o "match:^Mon, 14 Aug 2006 08:34:56 [+\-]00:?00$" ../cmd/date -uR -d @1155544496
-}
-
-atf_test_case empty
-empty_body() {
-	atf_check -o 'inline:\n' ../cmd/date '+'
-}
-
-atf_test_case echolike
-echolike_body() {
-	atf_check -o 'inline:hello world\n' ../cmd/date '+hello world'
-}
-
-atf_test_case devfull
-devfull_body() {
-	has_glibc && atf_expect_fail "glibc ignoring write errors for puts()"
-	[ "$(uname -s)" = "NetBSD" ] && atf_expect_fail "NetBSD ignoring write errors for puts()"
-	[ "$(uname -s)" = "FreeBSD" ] && atf_expect_fail "FreeBSD ignoring write errors for puts()"
-
-	atf_check -s exit:1 -e 'inline:date: puts: No space left on device\n' sh -c '../cmd/date >/dev/full'
-}
-
-atf_test_case utc
-utc_body() {
-	atf_check -o "match:^[0-9]+$" ../cmd/date -u '+%s'
-}
-
-atf_test_case timestamp
-timestamp_body() {
-	atf_check -o "inline:1970-01-01T00:00:00\n" ../cmd/date -u -d @0 '+%FT%T'
-	atf_check -o "inline:1970-01-01T00:01:09\n" ../cmd/date -u -d @69 '+%FT%T'
-	atf_check -o "inline:1969-12-31T23:58:51\n" ../cmd/date -u -d @-69 '+%FT%T'
-
-	atf_check -s 'exit:1' -e "inline:date: Error: Missing operand for option: '-d'\ndate [-uR][-d datetime] [+format]\n" ../cmd/date -u -d
-
-	# 36893488147419103232 = 2^65
-	atf_check -s 'exit:1' -e not-empty ../cmd/date -u -d @36893488147419103232
-}
-
-atf_test_case isodate
-isodate_body() {
-	atf_check -o "inline:0\n" ../cmd/date -u -d "1970-01-01T00:00:00Z" '+%s'
-	atf_check -o "inline:69\n" ../cmd/date -u -d "1970-01-01T00:01:09Z" '+%s'
-	atf_check -o "inline:-69\n" ../cmd/date -u -d "1969-12-31T23:58:51Z" '+%s'
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	. ../test_functions.sh
-
-	atf_add_test_case noargs
-	atf_add_test_case badarg
-	atf_add_test_case empty
-	atf_add_test_case echolike
-	atf_add_test_case devfull
-
-	atf_add_test_case epoch
-	atf_add_test_case rfc3339
-	atf_add_test_case rfc5322
-	atf_add_test_case utc
-
-	atf_add_test_case timestamp
-	atf_add_test_case isodate
-}
diff --git a/test-cmd/del b/test-cmd/del
@@ -1,57 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case basic cleanup
-basic_body() {
-	touch inputs/del-test || atf_fail "touching del-test"
-	atf_check ../cmd/del inputs/del-test
-
-	mkdir -p inputs/del-test.d || atf_fail "mkdir del-test.d"
-	atf_check ../cmd/del inputs/del-test.d
-}
-basic_cleanup() {
-	rm -fr inputs/del-test inputs/del-test.d || atf_fail "rm inputs/del-test{,.d}"
-}
-
-atf_test_case nopermf cleanup
-nopermf_body() {
-	touch inputs/chmod_000 || atf_fail "touching chmod_000"
-	chmod 0000 inputs/chmod_000 || atf_fail "chmod 0000 chmod_000"
-
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:del: Error opening ‘inputs/chmod_000’: Permission denied\n' ../cmd/del inputs/chmod_000
-}
-nopermf_cleanup() {
-	rm -fr inputs/chmod_000 inputs/chmod_000.d || atf_fail "rm chmod_000{,.d}"
-}
-
-atf_test_case nopermd cleanup
-nopermd_body() {
-	mkdir -p inputs/chmod_000.d || atf_fail "mkdir chmod_000.d"
-	chmod 0000 inputs/chmod_000.d || atf_fail "chmod 0000 chmod_000.d"
-
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:del: Error opening ‘inputs/chmod_000’: Permission denied\n' ../cmd/del inputs/chmod_000.d
-}
-nopermd_cleanup() {
-	rm -fr inputs/chmod_000 inputs/chmod_000.d || atf_fail "rm chmod_000{,.d}"
-}
-
-atf_test_case enoent
-enoent_body() {
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:del: remove(/var/empty/e/no/ent) error: No such file or directory\n' ../cmd/del /var/empty/e/no/ent
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-	atf_add_test_case basic
-
-	# None of the supported implementations of remove(3) seem to have checks
-	# based on file mode
-	#atf_add_test_case nopermf
-	#atf_add_test_case nopermd
-
-	atf_add_test_case enoent
-}
diff --git a/test-cmd/errno b/test-cmd/errno
@@ -1,51 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case simple
-simple_body() {
-	atf_check -o "inline:Operation not permitted\n" ../cmd/errno 1
-}
-
-atf_test_case noargs
-noargs_body() {
-	atf_check -s exit:1 -o "inline:usage: errno <number>\n" ../cmd/errno
-}
-
-atf_test_case devfull
-devfull_body() {
-	has_glibc && atf_expect_fail "glibc ignoring write errors for puts()"
-	[ "$(uname -s)" = "NetBSD" ] && atf_expect_fail "NetBSD ignoring write errors for puts()"
-	[ "$(uname -s)" = "FreeBSD" ] && atf_expect_fail "FreeBSD ignoring write errors for puts()"
-
-	atf_check -s exit:1 sh -c '../cmd/errno 1 >/dev/full'
-}
-
-atf_test_case einval
-einval_body() {
-	if has_glibc; then
-		atf_check -s exit:0 -o "inline:Unknown error -1\n" ../cmd/errno -1
-	elif has_musl; then
-		atf_check -s exit:0 -o "inline:No error information\n" ../cmd/errno -1
-	else
-		atf_check -s exit:1 -e "inline:errno: strerror: Invalid argument\n" ../cmd/errno -1
-	fi
-}
-
-atf_test_case erange
-erange_body() {
-	# 36893488147419103232 = 2^65
-	atf_check -s 'exit:1' -e not-empty ../cmd/errno 36893488147419103232
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	. ../test_functions.sh
-
-	atf_add_test_case simple
-	atf_add_test_case noargs
-	atf_add_test_case devfull
-	atf_add_test_case einval
-	atf_add_test_case erange
-}
diff --git a/test-cmd/humanize b/test-cmd/humanize
@@ -1,107 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2023 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case one
-one_body() {
-	atf_check -o "inline:1 \n"  ../cmd/humanize    1
-	atf_check -o "inline:1 \n"  ../cmd/humanize -d 1
-	atf_check -o "inline:1 B\n" ../cmd/humanize -b 1
-}
-
-atf_test_case two
-two_body() {
-	atf_check -o "inline:12 \n"  ../cmd/humanize    12
-	atf_check -o "inline:12 \n"  ../cmd/humanize -d 12
-	atf_check -o "inline:12 B\n" ../cmd/humanize -b 12
-}
-
-atf_test_case three
-three_body() {
-	atf_check -o "inline:123 \n"  ../cmd/humanize    123
-	atf_check -o "inline:123 \n"  ../cmd/humanize -d 123
-	atf_check -o "inline:123 B\n" ../cmd/humanize -b 123
-}
-
-# 1 234
-atf_test_case four
-four_body() {
-	atf_check -o "inline:1.234 k\n"  ../cmd/humanize    1234
-	atf_check -o "inline:1.234 k\n"  ../cmd/humanize -d 1234
-	atf_check -o "inline:1.20508 KiB\n" ../cmd/humanize -b 1234
-}
-
-# 12 345
-atf_test_case five
-five_body() {
-	atf_check -o "inline:12.345 k\n"    ../cmd/humanize    12345
-	atf_check -o "inline:12.345 k\n"    ../cmd/humanize -d 12345
-	atf_check -o "inline:12.0557 KiB\n" ../cmd/humanize -b 12345
-}
-
-# 123 456
-atf_test_case six
-six_body() {
-	atf_check -o "inline:123.456 k\n"   ../cmd/humanize    123456
-	atf_check -o "inline:123.456 k\n"   ../cmd/humanize -d 123456
-	atf_check -o "inline:120.562 KiB\n" ../cmd/humanize -b 123456
-}
-
-# 1234 4567
-atf_test_case seven
-seven_body() {
-	atf_check -o "inline:1.23457 M\n"   ../cmd/humanize    1234567
-	atf_check -o "inline:1.23457 M\n"   ../cmd/humanize -d 1234567
-	atf_check -o "inline:1.17737 MiB\n" ../cmd/humanize -b 1234567
-}
-
-atf_test_case noarg
-noarg_body() {
-	atf_check -s exit:1 -e 'inline:Usage: humanize [-bdt] number\n' ../cmd/humanize
-}
-
-atf_test_case badflag
-badflag_body() {
-	atf_check -s exit:1 -e "inline:humanize: Error: Unrecognised option: '-f'\n"'Usage: humanize [-bdt] number\n' ../cmd/humanize -f
-	atf_check -s exit:1 -e "inline:humanize: Error: Unrecognised option: '-f'\n"'Usage: humanize [-bdt] number\n' ../cmd/humanize -f 123
-}
-
-atf_test_case duration
-duration_body() {
-	atf_check -o "inline:1s\n" ../cmd/humanize -t 1
-	atf_check -o "inline:1m \n" ../cmd/humanize -t 60
-	atf_check -o "inline:1h \n" ../cmd/humanize -t 3600
-	atf_check -o "inline:1日 \n" ../cmd/humanize -t 86400
-	atf_check -o "inline:1月 \n" ../cmd/humanize -t 2629743
-	atf_check -o "inline:1年 \n" ../cmd/humanize -t 31556926
-	atf_check -o "inline:1年 1月 1日 1h 1m 1s\n" ../cmd/humanize -t 34276730
-}
-
-atf_test_case limits
-limits_body() {
-	atf_check -o 'inline:9.22337 E\n' ../cmd/humanize 9223372036854775806
-	atf_check -s exit:1 -e 'inline:humanize: 9223372036854775808 is too large\n' ../cmd/humanize 9223372036854775808
-
-	# Not as great as it should but at least not a lie
-	atf_check -o 'inline:-9.22337e+18 \n' ../cmd/humanize -- -9223372036854775807
-
-	atf_check -s exit:1 -e 'inline:humanize: -9223372036854775809 is too small\n' ../cmd/humanize -- -9223372036854775809
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	atf_add_test_case noarg
-	atf_add_test_case badflag
-	atf_add_test_case limits
-
-	atf_add_test_case one
-	atf_add_test_case two
-	atf_add_test_case three
-	atf_add_test_case four
-	atf_add_test_case five
-	atf_add_test_case six
-	atf_add_test_case seven
-
-	atf_add_test_case duration
-}
diff --git a/test-cmd/lolcat b/test-cmd/lolcat
@@ -1,92 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case allfile
-allfile_body() {
-	atf_check -o file:outputs/lolcat/all_bytes ../cmd/lolcat inputs/all_bytes
-}
-
-atf_test_case allinput
-allinput_body() {
-	atf_check -o file:outputs/lolcat/all_bytes ../cmd/lolcat <inputs/all_bytes
-}
-
-atf_test_case alldashinput
-alldashinput_body() {
-	atf_check -o file:outputs/lolcat/all_bytes ../cmd/lolcat - <inputs/all_bytes
-}
-
-atf_test_case devnull
-devnull_body() {
-	if [ "$(uname -s)" = "FreeBSD" ] || [ "$(uname -s)" = "NetBSD" ]; then
-		# FIXME
-		atf_check -s exit:1 -e 'inline:\n[0mlolcat: Read error: Inappropriate ioctl for device\n' -o 'inline:[0m' ../cmd/lolcat /dev/null
-		atf_check -s exit:1 -e 'inline:\n[0mlolcat: Read error: Inappropriate ioctl for device\n' -o 'inline:[0m' ../cmd/lolcat </dev/null
-		atf_check -s exit:1 -e 'inline:\n[0mlolcat: Read error: Inappropriate ioctl for device\n' -o 'inline:[0m' ../cmd/lolcat - </dev/null
-	else
-		atf_check -o 'inline:[0m' ../cmd/lolcat /dev/null
-		atf_check -o 'inline:[0m' ../cmd/lolcat </dev/null
-		atf_check -o 'inline:[0m' ../cmd/lolcat - </dev/null
-	fi
-}
-
-atf_test_case noperm cleanup
-noperm_body() {
-	touch inputs/chmod_000 || atf_fail "touching chmod_000"
-	chmod 0000 inputs/chmod_000 || atf_fail "chmod 0000 chmod_000"
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Error opening ‘inputs/chmod_000’: Permission denied\n' -o 'inline:[0m' ../cmd/lolcat inputs/chmod_000
-}
-noperm_cleanup() {
-	chmod 0600 inputs/chmod_000 || atf_fail "chmod 0600 chmod_000"
-	rm inputs/chmod_000 || atf_fail "rm chmod_000"
-}
-
-atf_test_case devfull
-devfull_body() {
-	has_glibc && atf_expect_fail "glibc ignoring write errors for fputc()"
-	[ "$(uname -s)" = "FreeBSD" ] && atf_expect_fail "FreeBSD badly handling write errors"
-	[ "$(uname -s)" = "NetBSD" ] && atf_expect_fail "NetBSD badly handling write errors"
-
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Write error: No space left on device\n' sh -c '../cmd/lolcat inputs/all_bytes >/dev/full'
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Write error: No space left on device\n' sh -c '../cmd/lolcat <inputs/all_bytes >/dev/full'
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Write error: No space left on device\n' sh -c '../cmd/lolcat - <inputs/all_bytes >/dev/full'
-}
-
-atf_test_case readslash
-readslash_body() {
-	[ "$(uname -s)" = "NetBSD" ] && atf_skip "NetBSD allows to read directories"
-
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Read error: Is a directory\n' -o 'inline:[0m' ../cmd/lolcat ./
-}
-
-atf_test_case enoent
-enoent_body() {
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Error opening ‘/var/empty/e/no/ent’: No such file or directory\n' -o 'inline:[0m' ../cmd/lolcat /var/empty/e/no/ent
-}
-
-atf_test_case doubledash
-doubledash_body() {
-	atf_check -o file:outputs/lolcat/all_bytes -- ../cmd/lolcat -- inputs/all_bytes
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:\n[0mlolcat: Error opening ‘---’: No such file or directory\n' -o 'inline:[0m' -- ../cmd/lolcat --- inputs/all_bytes
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	. ../test_functions.sh
-
-	atf_add_test_case allfile
-	atf_add_test_case allinput
-	atf_add_test_case alldashinput
-	atf_add_test_case devnull
-	atf_add_test_case noperm
-	atf_add_test_case devfull
-	atf_add_test_case readslash
-	atf_add_test_case enoent
-	atf_add_test_case doubledash
-}
diff --git a/test-cmd/mdate b/test-cmd/mdate
@@ -1,13 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case basic
-basic_body() {
-	atf_check -o "match:^[0-9A-F]+,[0-9A-F]+$" ../cmd/mdate
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-	atf_add_test_case basic
-}
diff --git a/test-cmd/memsys b/test-cmd/memsys
@@ -1,48 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-
-atf_test_case basic cleanup
-basic_body() {
-	command -v "${BWRAP:-bwrap}" >/dev/null 2>/dev/null || atf_skip "${BWRAP:-bwrap} command not found"
-	[ -n "${NO_BWRAP}" ] && atf_skip "'NO_BWRAP' set"
-
-	atf_check touch ./tmp-memsys
-	atf_check -- "${BWRAP:-bwrap}" --bind / / --bind ./tmp-memsys /sys/power/state ../cmd/memsys
-	atf_check -o 'inline:mem' cat tmp-memsys
-}
-basic_cleanup() {
-	rm -f tmp-memsys
-}
-
-atf_test_case chmod_000 cleanup
-chmod_000_body() {
-	command -v "${BWRAP:-bwrap}" >/dev/null 2>/dev/null || atf_skip "${BWRAP:-bwrap} command not found"
-	[ -n "${NO_BWRAP}" ] && atf_skip "'NO_BWRAP' set"
-
-	atf_check touch ./tmp-memsys.000
-	atf_check chmod 000 ./tmp-memsys.000
-	atf_check -s exit:1 -e 'inline:memsys: open("/sys/power/state"): Permission denied\n' -- "${BWRAP:-bwrap}" --bind / / --bind ./tmp-memsys.000 /sys/power/state ../cmd/memsys
-	atf_check chmod 600 ./tmp-memsys.000
-	atf_check -o empty cat tmp-memsys.000
-}
-chmod_000_cleanup() {
-	rm -f tmp-memsys.000
-}
-
-atf_test_case devfull
-devfull_body() {
-	command -v "${BWRAP:-bwrap}" >/dev/null 2>/dev/null || atf_skip "${BWRAP:-bwrap} command not found"
-	[ -n "${NO_BWRAP}" ] && atf_skip "'NO_BWRAP' set"
-
-	atf_check -s exit:1 -e 'inline:memsys: open("/sys/power/state"): Permission denied\n' -- "${BWRAP:-bwrap}" --bind / / --bind /dev/full /sys/power/state ../cmd/memsys
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	atf_add_test_case basic
-	atf_add_test_case chmod_000
-	atf_add_test_case devfull
-}
diff --git a/test-cmd/mkdir b/test-cmd/mkdir
@@ -1,45 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case empty
-empty_body() {
-	atf_check -s exit:1 -e 'inline:mkdir: missing operands\nUsage: mkdir [-p] [-m mode] [directories...]\n' ../cmd/mkdir
-}
-
-atf_test_case foo cleanup
-foo_body() {
-	atf_check rm -fr mkdir-foo
-	atf_check ../cmd/mkdir mkdir-foo
-	atf_check test -d mkdir-foo
-}
-foo_cleanup() {
-	rm -fr mkdir-foo
-}
-
-atf_test_case p_flag cleanup
-p_flag_body() {
-	atf_check rm -fr mkdir-p_flag/1/2/3
-	atf_check -s exit:1 -e 'inline:mkdir: No such file or directory\n' ../cmd/mkdir mkdir-p_flag/1/2/3
-	atf_check ../cmd/mkdir -p mkdir-p_flag/1/2/3
-	atf_check test -d mkdir-p_flag/1/2/3
-}
-p_flag_cleanup() {
-	rm -fr mkdir-p_flag/1/2/3
-}
-
-atf_test_case devnull
-devnull_body() {
-	atf_check -s exit:1 -e 'inline:mkdir: File exists\n' ../cmd/mkdir /dev/null
-	atf_check -s exit:1 -e 'inline:mkdir: File exists\n' ../cmd/mkdir -p /dev/null
-	atf_check -s exit:1 -e 'inline:mkdir: Not a directory\n' ../cmd/mkdir /dev/null/no
-	atf_check -s exit:1 -e 'inline:mkdir: Not a directory\n' ../cmd/mkdir -p /dev/null/no
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-	atf_add_test_case empty
-	atf_add_test_case foo
-	#atf_add_test_case p_flag
-	atf_add_test_case devnull
-}
diff --git a/test-cmd/outputs/lolcat/all_bytes.l b/test-cmd/outputs/lolcat/all_bytes.l
@@ -1,12 +0,0 @@
-\000\001\002\003\004\005\006\a\b\t$
-\v\f\r\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\
-\035\036\037 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX\
-YZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\
-\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\
-\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\
-\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\
-\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\
-\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\
-\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\
-\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\
-\375\376\377$
diff --git a/test-cmd/outputs/xcd/all_bytes b/test-cmd/outputs/xcd/all_bytes
@@ -1,18 +0,0 @@
-[0m[48;2;0;0;0m[38;2;64;64;64m0x000000 [38;2;64;64;64m00 [38;2;130;236;16m01 [38;2;132;235;15m02 [38;2;134;234;14m03 [38;2;137;233;13m04 [38;2;139;231;12m05 [38;2;141;230;11m06 [38;2;143;229;10m07 [38;2;146;227;10m08 [38;2;148;226;9m09 [38;2;150;224;8m0a [38;2;152;223;7m0b [38;2;155;221;6m0c [38;2;157;220;6m0d [38;2;159;218;5m0e [38;2;161;217;5m0f [0m[48;2;0;0;0m >[38;2;64;64;64m.[38;2;130;236;16m.[38;2;132;235;15m.[38;2;134;234;14m.[38;2;137;233;13m.[38;2;139;231;12m.[38;2;141;230;11m.[38;2;143;229;10m.[38;2;146;227;10m.[38;2;148;226;9m.[38;2;150;224;8m.[38;2;152;223;7m.[38;2;155;221;6m.[38;2;157;220;6m.[38;2;159;218;5m.[38;2;161;217;5m.[0m[48;2;0;0;0m<
-[38;2;164;215;4m0x000010 [38;2;164;215;4m10 [38;2;166;213;3m11 [38;2;168;212;3m12 [38;2;170;210;3m13 [38;2;172;208;2m14 [38;2;174;206;2m15 [38;2;176;204;2m16 [38;2;179;203;1m17 [38;2;181;201;1m18 [38;2;183;199;1m19 [38;2;185;197;1m1a [38;2;187;195;1m1b [38;2;189;193;1m1c [38;2;191;191;1m1d [38;2;193;189;1m1e [38;2;195;187;1m1f [0m[48;2;0;0;0m >[38;2;164;215;4m.[38;2;166;213;3m.[38;2;168;212;3m.[38;2;170;210;3m.[38;2;172;208;2m.[38;2;174;206;2m.[38;2;176;204;2m.[38;2;179;203;1m.[38;2;181;201;1m.[38;2;183;199;1m.[38;2;185;197;1m.[38;2;187;195;1m.[38;2;189;193;1m.[38;2;191;191;1m.[38;2;193;189;1m.[38;2;195;187;1m.[0m[48;2;0;0;0m<
-[38;2;197;185;1m0x000020 [38;2;197;185;1m20 [38;2;199;183;1m21 [38;2;200;181;1m22 [38;2;202;179;1m23 [38;2;204;177;1m24 [38;2;206;175;2m25 [38;2;208;173;2m26 [38;2;210;170;3m27 [38;2;211;168;3m28 [38;2;213;166;3m29 [38;2;215;164;4m2a [38;2;216;162;4m2b [38;2;218;160;5m2c [38;2;219;157;6m2d [38;2;221;155;6m2e [38;2;223;153;7m2f [0m[48;2;0;0;0m >[38;2;197;185;1m [38;2;199;183;1m![38;2;200;181;1m"[38;2;202;179;1m#[38;2;204;177;1m$[38;2;206;175;2m%[38;2;208;173;2m&[38;2;210;170;3m'[38;2;211;168;3m([38;2;213;166;3m)[38;2;215;164;4m*[38;2;216;162;4m+[38;2;218;160;5m,[38;2;219;157;6m-[38;2;221;155;6m.[38;2;223;153;7m/[0m[48;2;0;0;0m<
-[38;2;224;151;8m0x000030 [38;2;224;151;8m30 [38;2;226;148;9m31 [38;2;227;146;9m32 [38;2;228;144;10m33 [38;2;230;142;11m34 [38;2;231;139;12m35 [38;2;232;137;13m36 [38;2;234;135;14m37 [38;2;235;132;15m38 [38;2;236;130;16m39 [38;2;237;128;17m3a [38;2;238;126;18m3b [38;2;240;123;20m3c [38;2;241;121;21m3d [38;2;242;119;22m3e [38;2;243;116;23m3f [0m[48;2;0;0;0m >[38;2;224;151;8m0[38;2;226;148;9m1[38;2;227;146;9m2[38;2;228;144;10m3[38;2;230;142;11m4[38;2;231;139;12m5[38;2;232;137;13m6[38;2;234;135;14m7[38;2;235;132;15m8[38;2;236;130;16m9[38;2;237;128;17m:[38;2;238;126;18m;[38;2;240;123;20m<[38;2;241;121;21m=[38;2;242;119;22m>[38;2;243;116;23m?[0m[48;2;0;0;0m<
-[38;2;244;114;25m0x000040 [38;2;244;114;25m40 [38;2;244;112;26m41 [38;2;245;110;28m42 [38;2;246;107;29m43 [38;2;247;105;30m44 [38;2;248;103;32m45 [38;2;248;101;33m46 [38;2;249;98;35m47 [38;2;250;96;37m48 [38;2;250;94;38m49 [38;2;251;92;40m4a [38;2;251;90;41m4b [38;2;252;87;43m4c [38;2;252;85;45m4d [38;2;253;83;47m4e [38;2;253;81;48m4f [0m[48;2;0;0;0m >[38;2;244;114;25m@[38;2;244;112;26mA[38;2;245;110;28mB[38;2;246;107;29mC[38;2;247;105;30mD[38;2;248;103;32mE[38;2;248;101;33mF[38;2;249;98;35mG[38;2;250;96;37mH[38;2;250;94;38mI[38;2;251;92;40mJ[38;2;251;90;41mK[38;2;252;87;43mL[38;2;252;85;45mM[38;2;253;83;47mN[38;2;253;81;48mO[0m[48;2;0;0;0m<
-[38;2;253;79;50m0x000050 [38;2;253;79;50m50 [38;2;254;77;52m51 [38;2;254;75;54m52 [38;2;254;73;56m53 [38;2;254;71;58m54 [38;2;254;69;60m55 [38;2;254;67;62m56 [38;2;254;65;63m57 [38;2;254;63;65m58 [38;2;254;61;67m59 [38;2;254;59;69m5a [38;2;254;57;72m5b [38;2;254;55;74m5c [38;2;254;53;76m5d [38;2;254;51;78m5e [38;2;253;49;80m5f [0m[48;2;0;0;0m >[38;2;253;79;50mP[38;2;254;77;52mQ[38;2;254;75;54mR[38;2;254;73;56mS[38;2;254;71;58mT[38;2;254;69;60mU[38;2;254;67;62mV[38;2;254;65;63mW[38;2;254;63;65mX[38;2;254;61;67mY[38;2;254;59;69mZ[38;2;254;57;72m[[38;2;254;55;74m\[38;2;254;53;76m][38;2;254;51;78m^[38;2;253;49;80m_[0m[48;2;0;0;0m<
-[38;2;253;48;82m0x000060 [38;2;253;48;82m60 [38;2;253;46;84m61 [38;2;252;44;86m62 [38;2;252;42;88m63 [38;2;251;41;91m64 [38;2;251;39;93m65 [38;2;250;37;95m66 [38;2;249;36;97m67 [38;2;249;34;99m68 [38;2;248;33;102m69 [38;2;247;31;104m6a [38;2;247;30;106m6b [38;2;246;28;108m6c [38;2;245;27;111m6d [38;2;244;25;113m6e [38;2;243;24;115m6f [0m[48;2;0;0;0m >[38;2;253;48;82m`[38;2;253;46;84ma[38;2;252;44;86mb[38;2;252;42;88mc[38;2;251;41;91md[38;2;251;39;93me[38;2;250;37;95mf[38;2;249;36;97mg[38;2;249;34;99mh[38;2;248;33;102mi[38;2;247;31;104mj[38;2;247;30;106mk[38;2;246;28;108ml[38;2;245;27;111mm[38;2;244;25;113mn[38;2;243;24;115mo[0m[48;2;0;0;0m<
-[38;2;242;23;118m0x000070 [38;2;242;23;118m70 [38;2;241;22;120m71 [38;2;240;20;122m72 [38;2;239;19;124m73 [38;2;238;18;127m74 [38;2;237;17;129m75 [38;2;236;16;131m76 [38;2;234;15;134m77 [38;2;233;14;136m78 [38;2;232;13;138m79 [38;2;230;12;140m7a [38;2;229;11;143m7b [38;2;228;10;145m7c [38;2;226;9;147m7d [38;2;225;8;149m7e [38;2;223;7;152m7f [0m[48;2;0;0;0m >[38;2;242;23;118mp[38;2;241;22;120mq[38;2;240;20;122mr[38;2;239;19;124ms[38;2;238;18;127mt[38;2;237;17;129mu[38;2;236;16;131mv[38;2;234;15;134mw[38;2;233;14;136mx[38;2;232;13;138my[38;2;230;12;140mz[38;2;229;11;143m{[38;2;228;10;145m|[38;2;226;9;147m}[38;2;225;8;149m~[38;2;223;7;152m.[0m[48;2;0;0;0m<
-[38;2;222;7;154m0x000080 [38;2;222;7;154m80 [38;2;220;6;156m81 [38;2;219;5;158m82 [38;2;217;5;161m83 [38;2;216;4;163m84 [38;2;214;4;165m85 [38;2;212;3;167m86 [38;2;210;3;169m87 [38;2;209;2;171m88 [38;2;207;2;174m89 [38;2;205;2;176m8a [38;2;203;1;178m8b [38;2;201;1;180m8c [38;2;200;1;182m8d [38;2;198;1;184m8e [38;2;196;1;186m8f [0m[48;2;0;0;0m >[38;2;222;7;154m.[38;2;220;6;156m.[38;2;219;5;158m.[38;2;217;5;161m.[38;2;216;4;163m.[38;2;214;4;165m.[38;2;212;3;167m.[38;2;210;3;169m.[38;2;209;2;171m.[38;2;207;2;174m.[38;2;205;2;176m.[38;2;203;1;178m.[38;2;201;1;180m.[38;2;200;1;182m.[38;2;198;1;184m.[38;2;196;1;186m.[0m[48;2;0;0;0m<
-[38;2;194;1;188m0x000090 [38;2;194;1;188m90 [38;2;192;1;190m91 [38;2;190;1;192m92 [38;2;188;1;194m93 [38;2;186;1;196m94 [38;2;184;1;198m95 [38;2;182;1;200m96 [38;2;180;1;202m97 [38;2;178;1;204m98 [38;2;176;2;205m99 [38;2;173;2;207m9a [38;2;171;2;209m9b [38;2;169;3;211m9c [38;2;167;3;212m9d [38;2;165;4;214m9e [38;2;163;4;216m9f [0m[48;2;0;0;0m >[38;2;194;1;188m.[38;2;192;1;190m.[38;2;190;1;192m.[38;2;188;1;194m.[38;2;186;1;196m.[38;2;184;1;198m.[38;2;182;1;200m.[38;2;180;1;202m.[38;2;178;1;204m.[38;2;176;2;205m.[38;2;173;2;207m.[38;2;171;2;209m.[38;2;169;3;211m.[38;2;167;3;212m.[38;2;165;4;214m.[38;2;163;4;216m.[0m[48;2;0;0;0m<
-[38;2;160;5;217m0x0000a0 [38;2;160;5;217ma0 [38;2;158;5;219ma1 [38;2;156;6;220ma2 [38;2;154;7;222ma3 [38;2;151;8;224ma4 [38;2;149;8;225ma5 [38;2;147;9;226ma6 [38;2;145;10;228ma7 [38;2;142;11;229ma8 [38;2;140;12;231ma9 [38;2;138;13;232maa [38;2;136;14;233mab [38;2;133;15;234mac [38;2;131;16;236mad [38;2;129;17;237mae [38;2;126;18;238maf [0m[48;2;0;0;0m >[38;2;160;5;217m.[38;2;158;5;219m.[38;2;156;6;220m.[38;2;154;7;222m.[38;2;151;8;224m.[38;2;149;8;225m.[38;2;147;9;226m.[38;2;145;10;228m.[38;2;142;11;229m.[38;2;140;12;231m.[38;2;138;13;232m.[38;2;136;14;233m.[38;2;133;15;234m.[38;2;131;16;236m.[38;2;129;17;237m.[38;2;126;18;238m.[0m[48;2;0;0;0m<
-[38;2;124;19;239m0x0000b0 [38;2;124;19;239mb0 [38;2;122;20;240mb1 [38;2;120;22;241mb2 [38;2;117;23;242mb3 [38;2;115;24;243mb4 [38;2;113;26;244mb5 [38;2;110;27;245mb6 [38;2;108;28;246mb7 [38;2;106;30;247mb8 [38;2;104;31;247mb9 [38;2;101;33;248mba [38;2;99;34;249mbb [38;2;97;36;250mbc [38;2;95;38;250mbd [38;2;93;39;251mbe [38;2;90;41;251mbf [0m[48;2;0;0;0m >[38;2;124;19;239m.[38;2;122;20;240m.[38;2;120;22;241m.[38;2;117;23;242m.[38;2;115;24;243m.[38;2;113;26;244m.[38;2;110;27;245m.[38;2;108;28;246m.[38;2;106;30;247m.[38;2;104;31;247m.[38;2;101;33;248m.[38;2;99;34;249m.[38;2;97;36;250m.[38;2;95;38;250m.[38;2;93;39;251m.[38;2;90;41;251m.[0m[48;2;0;0;0m<
-[38;2;88;43;252m0x0000c0 [38;2;88;43;252mc0 [38;2;86;44;252mc1 [38;2;84;46;253mc2 [38;2;82;48;253mc3 [38;2;80;50;253mc4 [38;2;78;51;254mc5 [38;2;75;53;254mc6 [38;2;73;55;254mc7 [38;2;71;57;254mc8 [38;2;69;59;254mc9 [38;2;67;61;254mca [38;2;65;63;254mcb [38;2;63;65;254mcc [38;2;61;67;254mcd [38;2;59;69;254mce [38;2;57;71;254mcf [0m[48;2;0;0;0m >[38;2;88;43;252m.[38;2;86;44;252m.[38;2;84;46;253m.[38;2;82;48;253m.[38;2;80;50;253m.[38;2;78;51;254m.[38;2;75;53;254m.[38;2;73;55;254m.[38;2;71;57;254m.[38;2;69;59;254m.[38;2;67;61;254m.[38;2;65;63;254m.[38;2;63;65;254m.[38;2;61;67;254m.[38;2;59;69;254m.[38;2;57;71;254m.[0m[48;2;0;0;0m<
-[38;2;56;73;254m0x0000d0 [38;2;56;73;254md0 [38;2;54;75;254md1 [38;2;52;77;254md2 [38;2;50;79;253md3 [38;2;48;81;253md4 [38;2;46;83;253md5 [38;2;45;86;252md6 [38;2;43;88;252md7 [38;2;41;90;251md8 [38;2;40;92;251md9 [38;2;38;94;250mda [38;2;36;96;250mdb [38;2;35;99;249mdc [38;2;33;101;248mdd [38;2;32;103;248mde [38;2;30;105;247mdf [0m[48;2;0;0;0m >[38;2;56;73;254m.[38;2;54;75;254m.[38;2;52;77;254m.[38;2;50;79;253m.[38;2;48;81;253m.[38;2;46;83;253m.[38;2;45;86;252m.[38;2;43;88;252m.[38;2;41;90;251m.[38;2;40;92;251m.[38;2;38;94;250m.[38;2;36;96;250m.[38;2;35;99;249m.[38;2;33;101;248m.[38;2;32;103;248m.[38;2;30;105;247m.[0m[48;2;0;0;0m<
-[38;2;29;108;246m0x0000e0 [38;2;29;108;246me0 [38;2;27;110;245me1 [38;2;26;112;244me2 [38;2;25;114;243me3 [38;2;23;117;242me4 [38;2;22;119;241me5 [38;2;21;121;240me6 [38;2;20;124;239me7 [38;2;18;126;238me8 [38;2;17;128;237me9 [38;2;16;130;236mea [38;2;15;133;235meb [38;2;14;135;234mec [38;2;13;137;232med [38;2;12;140;231mee [38;2;11;142;230mef [0m[48;2;0;0;0m >[38;2;29;108;246m.[38;2;27;110;245m.[38;2;26;112;244m.[38;2;25;114;243m.[38;2;23;117;242m.[38;2;22;119;241m.[38;2;21;121;240m.[38;2;20;124;239m.[38;2;18;126;238m.[38;2;17;128;237m.[38;2;16;130;236m.[38;2;15;133;235m.[38;2;14;135;234m.[38;2;13;137;232m.[38;2;12;140;231m.[38;2;11;142;230m.[0m[48;2;0;0;0m<
-[38;2;10;144;228m0x0000f0 [38;2;10;144;228mf0 [38;2;9;146;227mf1 [38;2;8;149;225mf2 [38;2;8;151;224mf3 [38;2;7;153;222mf4 [38;2;6;155;221mf5 [38;2;6;158;219mf6 [38;2;5;160;218mf7 [38;2;4;162;216mf8 [38;2;4;164;214mf9 [38;2;3;166;213mfa [38;2;3;169;211mfb [38;2;2;171;209mfc [38;2;2;173;208mfd [38;2;2;175;206mfe [38;2;1;177;204mff [0m[48;2;0;0;0m[0m[48;2;0;0;0m >[38;2;10;144;228m.[38;2;9;146;227m.[38;2;8;149;225m.[38;2;8;151;224m.[38;2;7;153;222m.[38;2;6;155;221m.[38;2;6;158;219m.[38;2;5;160;218m.[38;2;4;162;216m.[38;2;4;164;214m.[38;2;3;166;213m.[38;2;3;169;211m.[38;2;2;171;209m.[38;2;2;173;208m.[38;2;2;175;206m.[38;2;1;177;204m.[0m[48;2;0;0;0m<
-[38;2;64;64;64m0x000100
-[0m[48;2;0;0;0m[0m
-\ No newline at end of file
diff --git a/test-cmd/outputs/xcd/null b/test-cmd/outputs/xcd/null
@@ -1,3 +0,0 @@
-[0m[48;2;0;0;0m[38;2;64;64;64m0x000000                                                 [0m[48;2;0;0;0m[0m[48;2;0;0;0m >[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[38;2;64;64;64m.[0m[48;2;0;0;0m<
-[38;2;64;64;64m0x000000
-[0m[48;2;0;0;0m[0m
-\ No newline at end of file
diff --git a/test-cmd/pat b/test-cmd/pat
@@ -1,78 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case allfile
-allfile_body() {
-	atf_check -o file:outputs/pat/all_bytes ../cmd/pat outputs/pat/all_bytes
-}
-
-atf_test_case allinput
-allinput_body() {
-	atf_check -o file:outputs/pat/all_bytes ../cmd/pat <outputs/pat/all_bytes
-}
-
-atf_test_case alldashinput
-alldashinput_body() {
-	atf_check -o file:outputs/pat/all_bytes ../cmd/pat - <outputs/pat/all_bytes
-}
-
-atf_test_case devnull
-devnull_body() {
-	atf_check ../cmd/pat /dev/null
-	atf_check ../cmd/pat </dev/null
-	atf_check ../cmd/pat - </dev/null
-}
-
-atf_test_case noperm cleanup
-noperm_body() {
-	touch inputs/chmod_000 || atf_fail "touching chmod_000"
-	chmod 0000 inputs/chmod_000 || atf_fail "chmod 0000 chmod_000"
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:pat: Error opening ‘inputs/chmod_000’: Permission denied\n' ../cmd/pat inputs/chmod_000
-}
-noperm_cleanup() {
-	chmod 0600 inputs/chmod_000 || atf_fail "chmod 0600 chmod_000"
-	rm inputs/chmod_000 || atf_fail "rm chmod_000"
-}
-
-atf_test_case devfull
-devfull_body() {
-	atf_check -s exit:1 -e 'inline:pat: Error writing: No space left on device\n' sh -c '../cmd/pat outputs/pat/all_bytes >/dev/full'
-	atf_check -s exit:1 -e 'inline:pat: Error writing: No space left on device\n' sh -c '../cmd/pat <outputs/pat/all_bytes >/dev/full'
-	atf_check -s exit:1 -e 'inline:pat: Error writing: No space left on device\n' sh -c '../cmd/pat - <outputs/pat/all_bytes >/dev/full'
-}
-
-atf_test_case readslash
-readslash_body() {
-	[ "$(uname -s)" = "NetBSD" ] && atf_skip "NetBSD allows to read directories"
-
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:pat: Error reading ‘/’: Is a directory\n' ../cmd/pat /
-}
-
-atf_test_case enoent
-enoent_body() {
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:pat: Error opening ‘/var/empty/e/no/ent’: No such file or directory\n' ../cmd/pat /var/empty/e/no/ent
-}
-
-atf_test_case doubledash
-doubledash_body() {
-	atf_check -o file:outputs/pat/all_bytes -- ../cmd/pat -- outputs/pat/all_bytes
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:pat: Error opening ‘---’: No such file or directory\n' -o empty -- ../cmd/pat --- outputs/pat/all_bytes
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-	atf_add_test_case allfile
-	atf_add_test_case allinput
-	atf_add_test_case alldashinput
-	atf_add_test_case devnull
-	atf_add_test_case noperm
-	atf_add_test_case devfull
-	atf_add_test_case readslash
-	atf_add_test_case enoent
-	atf_add_test_case doubledash
-}
diff --git a/test-cmd/shellcheck b/test-cmd/shellcheck
@@ -1,14 +0,0 @@
-#!/bin/sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-set -ex
-
-SHELLCHECK="${SHELLCHECK:-shellcheck}"
-
-${SHELLCHECK} "$0"
-
-cd "$(dirname "$0")"
-
-# shellcheck disable=SC2046
-${SHELLCHECK} --shell=sh -x $(grep -v -- '--' ./Kyuafile | grep atf_test_program | sed -E 's;^atf_test_program\{name="([^"]*)".*;./\1;')
diff --git a/test-cmd/sizeof b/test-cmd/sizeof
@@ -1,26 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case empty
-empty_body() {
-	atf_check -o not-empty ../cmd/sizeof
-}
-
-atf_test_case devfull
-devfull_body() {
-	has_glibc && atf_expect_fail "glibc ignoring write errors for printf()"
-	[ "$(uname -s)" = "FreeBSD" ] && atf_skip "FreeBSD ignoring write errors for printf()"
-	[ "$(uname -s)" = "NetBSD" ] && atf_skip "NetBSD ignoring write errors for printf()"
-
-	atf_check -s exit:1 sh -c '../cmd/sizeof >/dev/full'
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	. ../test_functions.sh
-
-	atf_add_test_case empty
-	atf_add_test_case devfull
-}
diff --git a/test-cmd/sname b/test-cmd/sname
@@ -1,39 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case generic
-generic_body() {
-	domainname=""
-	if [ "$(uname -s)" = "Linux" ]; then
-		domainname="$(hostname -d)"
-		domainname="domainname	${domainname:-(none)}\n"
-	fi
-
-	# sed is because of FreeBSD
-	atf_check -o "inline:${domainname}\
-machine	$(uname -m)
-nodename	$(uname -n)
-release	$(uname -r)
-sysname	$(uname -s)
-version	$(uname -v | sed 's; *$;;')
-" ../cmd/sname
-}
-
-atf_test_case devfull
-devfull_body() {
-	has_glibc && atf_expect_fail "glibc ignoring write errors for puts()"
-	[ "$(uname -s)" = "NetBSD" ] && atf_expect_fail "NetBSD ignoring write errors for puts()"
-	[ "$(uname -s)" = "FreeBSD" ] && atf_expect_fail "FreeBSD ignoring write errors for puts()"
-
-	atf_check -s exit:1 -e 'inline:sname: printf: No space left on device\n' sh -c '../cmd/sname >/dev/full'
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-
-	. ../test_functions.sh
-
-	atf_add_test_case generic
-	atf_add_test_case devfull
-}
diff --git a/test-cmd/xcd b/test-cmd/xcd
@@ -1,54 +0,0 @@
-#!/usr/bin/env atf-sh
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-atf_test_case openfile
-openfile_body() {
-	atf_check -o file:outputs/xcd/all_bytes ../cmd/xcd inputs/all_bytes
-}
-
-atf_test_case stdinput
-stdinput_body() {
-	atf_check -o file:outputs/xcd/all_bytes ../cmd/xcd <inputs/all_bytes
-	atf_check -o file:outputs/xcd/all_bytes ../cmd/xcd - <inputs/all_bytes
-}
-
-atf_test_case nullfile
-nullfile_body() {
-	atf_check -o file:outputs/xcd/null ../cmd/xcd /dev/null
-}
-
-atf_test_case nullinput
-nullinput_body() {
-	atf_check -o file:outputs/xcd/null ../cmd/xcd </dev/null
-}
-
-atf_test_case noperm cleanup
-noperm_body() {
-	touch inputs/chmod_000 || atf_fail "touching chmod_000"
-	chmod 0000 inputs/chmod_000 || atf_fail "chmod 0000 chmod_000"
-	# shellcheck disable=SC1112
-	atf_check -s exit:1 -e 'inline:\n[0mxcd: Error opening ‘inputs/chmod_000’: Permission denied\n' -o 'inline:[0m' ../cmd/xcd inputs/chmod_000
-}
-noperm_cleanup() {
-	chmod 0600 inputs/chmod_000 || atf_fail "chmod 0600 chmod_000"
-	rm inputs/chmod_000 || atf_fail "rm chmod_000"
-}
-
-atf_test_case devfull
-devfull_body() {
-	# shellcheck disable=SC1112
-	atf_check -s 'exit:1' -e 'inline:\n[0mxcd: Write error: No space left on device\n\n[0mxcd: Error closing ‘inputs/strings/true’: No space left on device\n' sh -c '../cmd/xcd inputs/strings/true >/dev/full'
-	atf_check -s 'exit:1' -e 'inline:\n[0mxcd: Write error: No space left on device\n' sh -c '../cmd/xcd <inputs/strings/true >/dev/full'
-	atf_check -s 'exit:1' -e 'inline:\n[0mxcd: Write error: No space left on device\n' sh -c '../cmd/xcd - <inputs/strings/true >/dev/full'
-}
-
-atf_init_test_cases() {
-	cd "$(atf_get_srcdir)" || exit 1
-	atf_add_test_case openfile
-	atf_add_test_case stdinput
-	atf_add_test_case nullfile
-	atf_add_test_case nullinput
-	atf_add_test_case noperm
-	atf_add_test_case devfull
-}
diff --git a/test_functions.sh b/test_functions.sh
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-# SPDX-FileCopyrightText: 2017-2022 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
-# SPDX-License-Identifier: MPL-2.0
-
-has_glibc() {
-	test -f /usr/include/features.h && grep -q '#define\W__GLIBC__' /usr/include/features.h
-}
-
-has_musl() {
-	command -v ldd && ldd 2>&1 | grep -q musl
-}