utilities/bin
This commit is contained in:
parent
3334b25b77
commit
27a1dead1a
15
bin/abs
Executable file
15
bin/abs
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
! eq $# 1 \
|
||||||
|
&& printf "Usage: %b [integer]\n" "$0" >/dev/stderr \
|
||||||
|
&& exit 1
|
||||||
|
|
||||||
|
! stris int "$1" \
|
||||||
|
&& printf "%b: %b: Not an integer\n" "$0" "$1" >/dev/stderr \
|
||||||
|
&& exit 1
|
||||||
|
|
||||||
|
lt $1 0 \
|
||||||
|
&& printf "%b\n" $(multiply $1 -1) \
|
||||||
|
|| printf "%b\n" $1
|
||||||
|
|
||||||
|
exit 0
|
24
bin/bak
Executable file
24
bin/bak
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
argv0="$0" [ -n "$SUFFIX" ] \
|
||||||
|
|| SUFFIX=".bak"
|
||||||
|
|
||||||
|
shift 1
|
||||||
|
|
||||||
|
while [ -n "$0" ]; do
|
||||||
|
if [ -e "$0$SUFFIX" ] && ! [ -d "$0$SUFFIX" ]; then
|
||||||
|
"$argv0" "$0$SUFFIX" \
|
||||||
|
|| exit $?
|
||||||
|
elif [ -d "$0$SUFFIX" ]; then
|
||||||
|
printf "%s: %s: Cannot bak directories.\n" "$argv0" "$0" 1>&2
|
||||||
|
exit 64 # sysexits(3) EX_USAGE
|
||||||
|
elif ! [ -e "$0" ]; then
|
||||||
|
printf "%s: %s: File does not exit.\n" "$argv0" "$0" 1>&2
|
||||||
|
exit 64
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv "$0" "$0$SUFFIX" \
|
||||||
|
|| exit $?
|
||||||
|
shift 1
|
||||||
|
done
|
BIN
bin/calculate
Executable file
BIN
bin/calculate
Executable file
Binary file not shown.
13
bin/cat
Executable file
13
bin/cat
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
alias dd="dd bs=1 2>/dev/null"
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
dd </dev/stdin
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
while [ -n "$1" ]; do
|
||||||
|
dd <"$1"
|
||||||
|
shift 1
|
||||||
|
done
|
14
bin/cscript
Executable file
14
bin/cscript
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TMPDIR="/tmp/cscript/"
|
||||||
|
TMPSRC="$TMPDIR/script.c"
|
||||||
|
TMPOUT="$TMPDIR/a.out"
|
||||||
|
|
||||||
|
[ -d "$TMPDIR" ] || mkdir -p "$TMPDIR"
|
||||||
|
|
||||||
|
printf "%s" "$1" >"$TMPSRC"
|
||||||
|
|
||||||
|
cc -o "$TMPOUT" "$TMPSRC"
|
||||||
|
|
||||||
|
dd bs=1 2>/dev/null | "$TMPOUT"
|
61
bin/head
Executable file
61
bin/head
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
length=10 # default length
|
||||||
|
|
||||||
|
# core [input] [output] [length]
|
||||||
|
core() {
|
||||||
|
sed $3q <"$1" >"$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
printf "Usage: %b [-h] [-n number]\n" "$1"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
argc=$#
|
||||||
|
argv0="$0"
|
||||||
|
output="/dev/stdout"
|
||||||
|
|
||||||
|
while getopts 'hn:' c; do
|
||||||
|
case $c in
|
||||||
|
(h) usage "$0";;
|
||||||
|
(n)
|
||||||
|
stris uint "$OPTARG" \
|
||||||
|
&& length=$OPTARG \
|
||||||
|
|| usage "$argv0"
|
||||||
|
;;
|
||||||
|
(:)
|
||||||
|
printf "%b: \"-$OPTARG\" requires an argument (number)\n" "$argv0" >/dev/stderr
|
||||||
|
exit 1;;
|
||||||
|
(?)
|
||||||
|
stris uint $OPTOPT >/dev/null \
|
||||||
|
&& printf "%b: This program doesn't support -[number] arguments as they're not POSIX\n" "$argv0" >/dev/stderr \
|
||||||
|
|| usage "$argv0"
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if eq $OPTIND $(add $argc 1); then # no file specified, assume stdin
|
||||||
|
core /dev/stdin "$output" $length
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
shift $OPTIND
|
||||||
|
temp0="$0"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
! [ -e "$0" ] \
|
||||||
|
&& printf "%b: %b: File does not exist\n" "$argv0" "$0" >/dev/stderr \
|
||||||
|
&& exit 1
|
||||||
|
|
||||||
|
[ -n "$1" ] && ! streq "$0" "$temp0" \
|
||||||
|
&& printf "\n" >"$output"
|
||||||
|
[ -n "$1" ] \
|
||||||
|
&& printf "==> %b <==\n" "$0" >"$output"
|
||||||
|
|
||||||
|
core "$0" "$output" $length
|
||||||
|
|
||||||
|
[ -n "$1" ] && shift 1 || break
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
BIN
bin/levenshtein
Executable file
BIN
bin/levenshtein
Executable file
Binary file not shown.
87
bin/man
Executable file
87
bin/man
Executable file
@ -0,0 +1,87 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
argv0="$0"
|
||||||
|
|
||||||
|
die() { printf "$*" >/dev/stderr && exit 1; }
|
||||||
|
|
||||||
|
# A lot of these break convention when recording errors because this tries to
|
||||||
|
# imitate other implementations.
|
||||||
|
[ -n "$1" ] || die "What manual page do you want?\nFor example, try 'man man'.\n"
|
||||||
|
|
||||||
|
[ -n "$LANG" ] || LANG="C"
|
||||||
|
|
||||||
|
[ -n "$MANPATH" ] || MANPATH="/usr/share/man"
|
||||||
|
[ -d "$MANPATH" ] || die "$0: \$MANPATH: $MANPATH: Does not exist\n"
|
||||||
|
[ -n "$MANSECTIONS" ] \
|
||||||
|
&& default_mansections="$MANSECTIONS" \
|
||||||
|
|| default_mansections="1nl830254967"
|
||||||
|
[ -d "$MANPATH"/"$LANG" ] \
|
||||||
|
&& MANDIR="$MANPATH/$LANG" \
|
||||||
|
|| MANDIR="$MANPATH"
|
||||||
|
|
||||||
|
if [ -z "$PAGER" ]; then
|
||||||
|
for prog in $(printf "
|
||||||
|
less
|
||||||
|
more
|
||||||
|
cat
|
||||||
|
dd
|
||||||
|
"); do
|
||||||
|
if which "$prog" >/dev/null 2>&1; then
|
||||||
|
PAGER="$prog"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
man() {
|
||||||
|
eq $# 2 || die "$argv0: man() called with $# arguments. Expected 2. This is a programmer error\n"
|
||||||
|
MANSECTIONS="$1"
|
||||||
|
NAME="$2"
|
||||||
|
|
||||||
|
# the way manpages are laid out SUCKS
|
||||||
|
# so, yeah, each man section is one character. which means it's totally
|
||||||
|
# bueno to just iterate over the string like this. but $MANDIR/man1 can
|
||||||
|
# have both man.1.gz AND man.1p.gz. ARGH!!!!
|
||||||
|
for SECTION in $(printf "$MANSECTIONS" | sed 's/\(.\)/\1\n/g'); do
|
||||||
|
PAGE="$(find "$MANDIR/man$SECTION" -type f 2>/dev/null | grep "\/$NAME\.\|\/$NAME$" | sed q)"
|
||||||
|
[ -z "$PAGE" ] || break
|
||||||
|
done
|
||||||
|
|
||||||
|
! [ -n "$PAGE" ] \
|
||||||
|
&& printf "No manual entry for $NAME\n" \
|
||||||
|
&& return 1
|
||||||
|
|
||||||
|
case "$(file -bir --no-buffer "$PAGE")" in
|
||||||
|
("text/"*)
|
||||||
|
COMMAND="cat" ;;
|
||||||
|
("application/gzip"*)
|
||||||
|
COMMAND="zcat" ;;
|
||||||
|
(*)
|
||||||
|
die "$argv0: $PAGE: Unknown file type.\n" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
$COMMAND "$PAGE" | nroff -man | $PAGER
|
||||||
|
}
|
||||||
|
|
||||||
|
# this seems to be what the popular man does
|
||||||
|
# so like `man foo -k bar` will show the manpages for foo, -k, and bar
|
||||||
|
# expected behavior imo would be manpage for foo, then gist for bar
|
||||||
|
# but let's not break things
|
||||||
|
if streq "$1" "-k"; then # -k
|
||||||
|
printf "Not yet implemented\n" && exit 1
|
||||||
|
else # not -k
|
||||||
|
while gt $# 0; do
|
||||||
|
if eq $(fdivide $# 2) 0 && gt 1 $# || ! stris int "$1"; then
|
||||||
|
MANSECTIONS="$default_mansections"
|
||||||
|
NAME="$1"
|
||||||
|
SHIFTING=1
|
||||||
|
elif gt 1 $(fdivide $# 2); then
|
||||||
|
MANSECTIONS="$1"
|
||||||
|
NAME="$2"
|
||||||
|
SHIFTING=2
|
||||||
|
else exit 0 # no more args
|
||||||
|
fi
|
||||||
|
man "$MANSECTIONS" "$NAME"
|
||||||
|
shift $SHIFTING
|
||||||
|
done
|
||||||
|
fi
|
13
bin/mod
Executable file
13
bin/mod
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
! eq $# 2 && printf "Usage: $0 [dividend] [divisor]\n" >/dev/stderr && exit 1
|
||||||
|
|
||||||
|
! stris int "$1" && printf "$0: $1: Not an integer\n" >/dev/stderr && exit 1
|
||||||
|
! stris int "$2" && printf "$0: $2: Not an integer\n" >/dev/stderr && exit 1
|
||||||
|
|
||||||
|
dividend=$1
|
||||||
|
divisor=$2
|
||||||
|
|
||||||
|
# (% a b) == (- a (* b (// a b)))
|
||||||
|
printf "%b\n" $(subtract $dividend $(multiply $divisor $(fdivide $dividend $divisor)))
|
||||||
|
exit 0
|
26
bin/pow
Executable file
26
bin/pow
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
! eq $# 2 && printf "Usage: $0 [base] [exponent]\n" >/dev/stderr && exit 1
|
||||||
|
|
||||||
|
! stris int "$1" && printf -- "%b: %b: Not an integer\n" "$0" "$1" >/dev/stderr && exit 1
|
||||||
|
! stris int "$2" && printf -- "%b: %b: Not an integer\n" "$0" "$2" >/dev/stderr && exit 1
|
||||||
|
|
||||||
|
base=$1
|
||||||
|
exponent=$2
|
||||||
|
|
||||||
|
result=1
|
||||||
|
|
||||||
|
while gt $exponent 0; do
|
||||||
|
result=$(multiply $result $base)
|
||||||
|
exponent=$(-- $exponent)
|
||||||
|
done
|
||||||
|
|
||||||
|
if ! eq $result $(abs $result) && eq $base $(abs $base); then
|
||||||
|
printf "$0: Result is unexpectedly negative, possible integer overflow\n" >/dev/stderr && exit 1
|
||||||
|
elif eq $result 0 && ! eq $base 0; then
|
||||||
|
printf "$0: Result is unexpectedly zero, possible integer overflow\n" >/dev/stderr && exit 1
|
||||||
|
else
|
||||||
|
printf "%b\n" $result
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
BIN
bin/runlength
Executable file
BIN
bin/runlength
Executable file
Binary file not shown.
44
bin/seq
Executable file
44
bin/seq
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
argv0="$0"
|
||||||
|
|
||||||
|
nai() {
|
||||||
|
printf "$argv0: $1: Not an integer\n"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
printf "Usage:\n \
|
||||||
|
$argv0 [last]
|
||||||
|
$argv0 [first] [last]
|
||||||
|
$argv0 [first] [increment] [last]\n" \
|
||||||
|
>/dev/stderr
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
[ -n "$1" ] || usage
|
||||||
|
if [ -n "$3" ]; then
|
||||||
|
stris int "$3" \
|
||||||
|
|| nai "$3" \
|
||||||
|
&& last=$3
|
||||||
|
stris int "$2" \
|
||||||
|
|| nai "$2" \
|
||||||
|
&& increment=$2
|
||||||
|
stris int "$1" \
|
||||||
|
|| nai "$1" \
|
||||||
|
&& first=$1
|
||||||
|
elif [ -n "$2" ]; then
|
||||||
|
stris int "$2" \
|
||||||
|
|| nai "$2" \
|
||||||
|
&& last=$2
|
||||||
|
stris int "$1" \
|
||||||
|
|| nai "$1" \
|
||||||
|
&& first=$1
|
||||||
|
increment=1
|
||||||
|
else
|
||||||
|
stris int "$1" \
|
||||||
|
|| nai "$1" \
|
||||||
|
&& last=$1
|
||||||
|
first=1
|
||||||
|
increment=1
|
||||||
|
fi
|
14
bin/subtract
Executable file
14
bin/subtract
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# science speak from wikipedia
|
||||||
|
! eq $# 2 && printf "Usage: $0 [minuend] [subtrahend]\n" >/dev/stderr && exit 1
|
||||||
|
|
||||||
|
! stris int "$1" && printf "$0: $1: Not an integer\n" >/dev/stderr && exit 1
|
||||||
|
! stris int "$2" && printf "$0: $2: Not an integer\n" >/dev/stderr && exit 1
|
||||||
|
|
||||||
|
minuend=$1
|
||||||
|
subtrahend=$2
|
||||||
|
|
||||||
|
# (- a b) == (+ a (* b -1))
|
||||||
|
printf "%b\n" $(add $minuend $(multiply $subtrahend -1))
|
||||||
|
exit 0
|
Loading…
Reference in New Issue
Block a user