tr(1) always used to be a saddening part of sbase, which was
inherently broken and crufted.
But to be fair, the POSIX-standard doesn't make it very simple.
Given the current version was unfixable and broken by design, I
sat down and rewrote tr(1) very close to the concept of set theory
and the POSIX-standard with a few exceptions:
- UTF-8: not allowed in POSIX, but in my opinion a must. This
finally allows you to work with UTF-8 streams without
problems or unexpected behaviour.
- Equivalence classes: Left out, even GNU coreutils ignore them
and depending on LC_COLLATE, which sucks.
- Character classes: No experiments or environment-variable-trickery.
Just plain definitions derived from the POSIX-
standard, working as expected.
I tested this thoroughly, but expect problems to show up in some
way given the wide range of input this program has to handle.
The only thing left on the TODO is to add support for literal
expressions ('\n', '\t', '\001', ...) and probably rethinking
the way [_*n] is unnecessarily restricted to string2.
sbase - suckless unix tools
===========================
sbase is a collection of unix tools that are inherently portable
across UNIX and UNIX-like systems.
The following tools are implemented:
UTILITY POSIX 2008 COMPLIANT MISSING OPTIONS
------- -------------------- ---------------
basename
cal
cat yes none
chgrp
chmod
chown
chroot
cksum
cmp
cols
comm
cp
cron
cut
date
dirname
du
echo
env
expand
expr
false
fold
grep
head
hostname
kill yes none
link
ln
logger yes
logname
ls
md5sum
mkdir
mkfifo
mktemp
mv
nice
nl
nohup
paste
printenv
printf
pwd
readlink
renice
rm
rmdir
sleep
setsid
sort
split
sponge
strings
sync
tail
tar
tee
test
touch
tr
true
tty
uudecode
uuencode
uname
unexpand
uniq
unlink
seq
sha1sum
sha256sum
sha512sum
wc
xargs
yes
The complement of sbase is ubase[1] which is Linux-specific and
provides all the non-portable tools. Together they are intended to
form a base system similar to busybox but much smaller and suckless.
Building
--------
You need GNU make to build sbase on OpenBSD.
To build sbase, simply type make. You may have to fiddle with
config.mk depending on your system.
You can also build sbase-box, which generates a single binary
containing all the required tools. You can then symlink the
individual tools to sbase-box.
Ideally you will want to statically link sbase. If you are on Linux
we recommend using musl-libc[2].
Portability
-----------
sbase has been compiled on a variety of different operating systems,
including Linux, *BSD, OSX, Haiku, Solaris, SCO OpenServer and others.
Various combinations of operating systems and architectures have also
been built.
You can build sbase with gcc, clang, tcc, nwcc and pcc.
[1] http://git.suckless.org/ubase/
[2] http://www.musl-libc.org/