suckless unix tools https://core.suckless.org/sbase
Go to file
FRIGN 79e45395e5 Refactor cmp(1) code and manpage
The algorithm had some areas which had potential for improvement.
This should make cmp(1) faster.
There have been changes to behaviour as well:

1) If argv[0] and argv[1] are the same, cmp(1) returns Same.
2) POSIX specifies the format of the difference-message to be:
      "%s %s differ: char %d, line %d\n", file1, file2,
      <byte number>, <line number>
   However, as cmp(1) operates on bytes, not characters, I changed
   it to
      "%s %s differ: byte %d, line %d\n", file1, file2,
      <byte number>, <line number>
   This is one example where the standard just keeps the old format
   for backwards-compatibility. As this is harmful, this change
   makes sense in the sense of consistentcy (and because we take
   the difference of char and byte very seriously in sbase, as
   opposed to GNU coreutils).

The manpage has been annotated, reflecting the second change, and
sections shortened where possible.
Thus I marked cmp(1) as finished in README.
2015-02-07 21:05:33 +01:00
libutf Add explicit boundary to loop in readrune() 2015-02-01 04:20:02 +01:00
libutil Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
arg.h ARGNUMF() only works on base 10 as it uses strtonum underneath 2015-01-30 16:45:44 +00:00
basename.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
basename.c basename: make usage line the same as the man page 2015-02-01 19:26:49 +01:00
cal.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cal.c Convert cal(1) to strtonum 2015-01-30 16:01:37 +01:00
cat.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cat.c read stdin if arg is exactly "-" not just begins with '-' 2014-11-18 21:53:37 +00:00
chgrp.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
chgrp.c chgrp: Only check errno if getgrnam() fails 2014-12-21 12:14:26 +00:00
chmod.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
chmod.c Add mandoc-manpage for chmod(1) 2015-01-17 21:59:37 +00:00
chown.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
chown.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
chroot.1 Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
chroot.c Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
cksum.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
cksum.c Add mandoc-manpage for cksum(1) and clean up code 2015-01-17 23:09:41 +00:00
cmp.1 Refactor cmp(1) code and manpage 2015-02-07 21:05:33 +01:00
cmp.c Refactor cmp(1) code and manpage 2015-02-07 21:05:33 +01:00
cols.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cols.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
comm.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
comm.c Add mandoc-manpage for comm(1) and clean up code 2015-01-17 23:10:07 +00:00
compat.h Add compat.h 2014-11-17 15:46:28 +00:00
config.mk Import strcasestr() from musl and remove -D_GNU_SOURCE 2014-11-20 23:46:06 +00:00
cp.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
cp.c cp: Rename -d option to -P 2014-12-08 10:02:56 +00:00
cron.1 cron.1: path macro for /etc/crontab 2015-02-06 15:43:23 +01:00
cron.c Rename crond to cron 2014-12-16 11:04:07 +00:00
crypt.h checksum tools: implement -c 2014-03-23 18:02:39 +00:00
cut.1 man pages: fix some typos 2015-02-01 21:28:17 +01:00
cut.c Add unescape() to libutil 2015-01-29 21:52:44 +01:00
date.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
date.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
dirname.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
dirname.c man pages: improve consistency 2015-02-01 20:52:28 +01:00
du.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
du.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
echo.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
echo.c Add mandoc-manpage for echo(1) 2015-01-23 23:49:24 +01:00
env.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
env.c Add mandoc-manpage for env(1) 2015-01-24 00:22:06 +01:00
expand.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
expand.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
expr.1 man pages: fix some typos 2015-02-01 21:28:17 +01:00
expr.c Relax with caps in usage 2015-01-25 18:31:25 +00:00
false.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
false.c Simplify true(1) and false(1) 2014-10-03 00:03:08 +01:00
fold.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
fold.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
fs.h Fix return values in rm(1) and mv(1) 2015-01-30 12:45:54 +01:00
grep.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
grep.c grep: getline returns signed (ssize_t) 2015-01-31 15:19:42 +01:00
head.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
head.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
hostname.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
hostname.c Fix coding style 2014-11-13 18:08:43 +00:00
kill.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
kill.c Un-boolify sbase 2014-11-14 10:54:20 +00:00
LICENSE Various cal(1) improvements 2015-01-02 13:14:41 +00:00
link.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
link.c Add mandoc-manpage for link(1) 2015-01-25 22:44:47 +01:00
ln.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
ln.c ln: usage, just use %s 2015-01-31 15:23:59 +01:00
logger.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
logger.c logger: Don't bother freeing buf 2014-12-16 20:14:40 +00:00
logname.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
logname.c Fix coding style 2014-11-13 18:08:43 +00:00
ls.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
ls.c ls: Implement -c and update manpage 2015-01-20 16:50:37 +00:00
Makefile support llvm-ar 2015-02-03 10:08:26 +00:00
md5.h Add crypt.[ch] and update md5sum and sha1sum 2013-07-18 09:51:17 -04:00
md5sum.1 Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
md5sum.c Finish up chroot(1) and md5sum(1) 2015-01-31 23:54:51 +01:00
mkdir.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
mkdir.c Add full mode support to mkdir(1) and fix return values 2015-01-28 20:57:32 +01:00
mkfifo.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
mkfifo.c Add mandoc-manpage for mkfifo(1) and add full mode support 2015-01-28 20:55:50 +01:00
mktemp.1 Finish up printenv(1) 2015-02-01 00:23:38 +01:00
mktemp.c Fix coding style 2014-11-13 18:08:43 +00:00
mv.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
mv.c Staticise mv_status 2015-01-30 11:48:33 +00:00
nice.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
nice.c Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
nl.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
nl.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
nohup.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
nohup.c Add mandoc-manpage for nohup(1) 2015-01-28 23:55:57 +01:00
paste.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
paste.c Add unescape() to libutil 2015-01-29 21:52:44 +01:00
printenv.1 Finish up printenv(1) 2015-02-01 00:23:38 +01:00
printenv.c Style fix 2014-11-16 13:17:06 +00:00
printf.1 add some mandoc pages and fix some warnings 2015-01-30 21:21:50 +01:00
printf.c Import printf(1) from OpenBSD 2014-09-28 15:12:15 +01:00
pwd.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
pwd.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
queue.h Use queue.h in grep(1) 2014-11-16 12:39:15 +00:00
readlink.1 Edit readlink.1 and document missing flags 2015-02-01 00:43:43 +01:00
readlink.c Edit readlink.1 and document missing flags 2015-02-01 00:43:43 +01:00
README Refactor cmp(1) code and manpage 2015-02-07 21:05:33 +01:00
renice.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
renice.c Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
rm.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
rm.c Fix return values in rm(1) and mv(1) 2015-01-30 12:45:54 +01:00
rmdir.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
rmdir.c Properly report return value in rmdir(1) 2015-01-30 12:43:55 +01:00
runetypebody.h Import libutf from http://git.suckless.org/libutf 2014-11-17 15:46:01 +00:00
seq.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
seq.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
setsid.1 Finish up setsid(1) 2015-02-01 00:47:32 +01:00
setsid.c Sort includes and more cleanup and fixes in util/ 2014-11-14 10:54:10 +00:00
sha1.h Add crypt.[ch] and update md5sum and sha1sum 2013-07-18 09:51:17 -04:00
sha1sum.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sha1sum.c Staticise globals 2014-11-17 13:39:11 +00:00
sha256.h Add sha256sum(1) 2013-07-20 13:20:16 -04:00
sha256sum.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sha256sum.c Staticise globals 2014-11-17 13:39:11 +00:00
sha512.h Add sha512sum(1) 2013-08-04 11:00:34 -04:00
sha512sum.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sha512sum.c Staticise globals 2014-11-17 13:39:11 +00:00
sleep.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
sleep.c Remember to include limits.h for UINT_MAX 2015-01-30 14:02:59 +00:00
sort.1 sort: minor manual page adjustments 2015-02-01 21:46:58 +01:00
sort.c Use size_t for number of lines in linebuf 2015-01-31 22:49:43 +00:00
split.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
split.c split: fixes 2015-02-01 16:30:12 +01:00
sponge.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
sponge.c Fix error message 2014-11-16 13:20:36 +00:00
strings.1 man pages: fix some typos 2015-02-01 21:28:17 +01:00
strings.c Respect exit status in strings(1) and update manpage 2014-11-23 12:44:38 +00:00
sync.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
sync.c Fix coding style 2014-11-13 18:08:43 +00:00
tail.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
tail.c ARGNUMF() only works on base 10 as it uses strtonum underneath 2015-01-30 16:45:44 +00:00
tar.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
tar.c No need to specify "rb" and "wb" in fopen, use "r" and "w" 2015-02-01 15:55:30 +00:00
tee.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
tee.c tee: -i option ignores SIGINT 2015-01-22 21:35:36 +00:00
test.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
test.c Un-boolify sbase 2014-11-14 10:54:20 +00:00
text.h Use size_t for number of lines in linebuf 2015-01-31 22:49:43 +00:00
TODO Update TODO 2014-12-21 00:01:58 +00:00
touch.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
touch.c Adjust some limits to more flexibility for strtonum 2015-02-01 01:24:03 +01:00
tr.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
tr.c tr : Revert 97c5986146 2015-02-07 18:09:04 +01:00
true.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
true.c Simplify true(1) and false(1) 2014-10-03 00:03:08 +01:00
tty.1 Add .Os sbase and sed replace to .Os sbase $(VERSION) in make install 2015-01-31 19:37:03 +00:00
tty.c Sort includes and more cleanup and fixes in util/ 2014-11-14 10:54:10 +00:00
uname.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uname.c Un-boolify sbase 2014-11-14 10:54:20 +00:00
unexpand.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
unexpand.c Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
uniq.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uniq.c remove agetline 2014-11-18 21:05:28 +00:00
unlink.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
unlink.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
utf.h Rewrite tr(1) in a sane way 2015-01-10 14:26:30 +00:00
util.h Convert estrto{l, ul} to estrtonum 2015-01-30 16:52:44 +01:00
uudecode.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uudecode.c remove agetline 2014-11-18 21:05:28 +00:00
uuencode.1 man pages: improve consistency 2015-02-01 20:52:28 +01:00
uuencode.c Fix coding style 2014-11-13 18:08:43 +00:00
wc.1 Finish up wc(1) 2015-02-01 03:01:11 +01:00
wc.c wc: Make output POSIX compliant 2015-02-06 19:46:45 +00:00
xargs.1 xargs.1: dont justify text, remove " " 2015-02-06 15:43:46 +01:00
xargs.c Use < 0 instead of == -1 2014-11-19 20:09:29 +00:00
yes.1 Finish up yes(1) by adding multiple string support 2015-02-01 02:13:47 +01:00
yes.c yes: Minor style fix 2015-02-01 01:27:05 +00:00

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 ('*' == finished, '#' == UTF-8 support,
'=' == implicit UTF-8 support):

   UTILITY         POSIX 2008 COMPLIANT            MISSING OPTIONS
   -------         --------------------            ---------------
=* basename        yes                             none
=* cal             yes                             none
=* cat             yes                             none
=  chgrp           no                              -h, -H, -L, -P
=* chmod           yes                             none
=  chown           no                              -h, -H, -L, -P
=* chroot          non-posix                       none
=* cksum           yes                             none
=* cmp             yes                             none
#* cols            non-posix                       none
=* comm            yes                             none
=  cp              no                              -H, (-i), -L
=* cron            non-posix                       none
#* cut             yes                             none
=* date            yes                             none
=* dirname         yes                             none
=  du              no                              -H, -L, (-x)
=* echo            yes                             none
=* env             yes                             none
#* expand          yes                             none
=* expr            yes                             none
=* false           yes                             none
#* fold            yes                             none
=* grep            yes                             none
=* head            yes                             none
=* hostname        non-posix                       none
=* kill            yes                             none
=* link            yes                             none
=* ln              yes                             none
=* logger          yes                             none
=* logname         yes                             none
=  ls              no                              -C, -R, -q, -u
=* md5sum          non-posix                       none
=* mkdir           yes                             none
=* mkfifo          yes                             none
=* mktemp          non-posix                       none
=* mv              yes                             (-i)
=* nice            yes                             none
=  nl              no                              -d, -f, -h, -l, -n, -p, -v, -w
=* nohup           yes                             none
#* paste           yes                             none
=* printenv        non-posix                       none
   printf          stolen                          stolen
=* pwd             yes                             none
=  readlink        non-posix                       -e, -m
=* renice          yes                             none
=* rm              yes                             (-i)
=* rmdir           yes                             none
=* setsid          non-posix                       none
=* sleep           yes                             none
   sort            no                              -m, -o, -d, -f, -i
=* split           yes                             none
=  sponge          non-posix                       none
   strings         no                              -a, -n, -t
=  sync            non-posix                       none
=  tail            no                              -c, -f
=  tar             non-posix                       none
=* tee             yes                             none
   test            yes                             none
=  touch           no                              -r
#* tr              yes                             none
=* true            yes                             none
=  tty             yes                             none
=  uname           yes                             none
#  unexpand        yes                             none
=  uniq            no                              -f, -s
=  unlink          yes                             none
=  uudecode        no                              -o
=  uuencode        no                              -m
   seq             non-posix                       none
=  sha1sum         non-posix                       none
=  sha256sum       non-posix                       none
=  sha512sum       non-posix                       none
#* wc              yes                             none
=  xargs           no                              -I, -L, -p, -s, -t, -x
=* yes             non-posix                       none

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
--------

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/