From 27a1dead1ad0cfe1596f4ad34c7a3fbdecd7d7b9 Mon Sep 17 00:00:00 2001 From: Deven Blake Date: Sat, 14 May 2022 20:52:57 -0400 Subject: [PATCH] utilities/bin --- bin/++ | 3 ++ bin/abs | 15 +++++++++ bin/bak | 24 +++++++++++++ bin/calculate | Bin 0 -> 15632 bytes bin/cat | 13 ++++++++ bin/cscript | 14 ++++++++ bin/head | 61 +++++++++++++++++++++++++++++++++ bin/id | Bin 0 -> 11328 bytes bin/levenshtein | Bin 0 -> 18408 bytes bin/man | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ bin/mod | 13 ++++++++ bin/pow | 26 +++++++++++++++ bin/runlength | Bin 0 -> 21536 bytes bin/seq | 44 ++++++++++++++++++++++++ bin/subtract | 14 ++++++++ bin/true | 0 bin/uwu | 10 ++++++ 17 files changed, 324 insertions(+) create mode 100755 bin/++ create mode 100755 bin/abs create mode 100755 bin/bak create mode 100755 bin/calculate create mode 100755 bin/cat create mode 100755 bin/cscript create mode 100755 bin/head create mode 100755 bin/id create mode 100755 bin/levenshtein create mode 100755 bin/man create mode 100755 bin/mod create mode 100755 bin/pow create mode 100755 bin/runlength create mode 100755 bin/seq create mode 100755 bin/subtract create mode 100755 bin/true create mode 100755 bin/uwu diff --git a/bin/++ b/bin/++ new file mode 100755 index 0000000..e6952b5 --- /dev/null +++ b/bin/++ @@ -0,0 +1,3 @@ +#!/bin/sh + +add $1 1 diff --git a/bin/abs b/bin/abs new file mode 100755 index 0000000..f4d77b4 --- /dev/null +++ b/bin/abs @@ -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 diff --git a/bin/bak b/bin/bak new file mode 100755 index 0000000..8ea90ec --- /dev/null +++ b/bin/bak @@ -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 diff --git a/bin/calculate b/bin/calculate new file mode 100755 index 0000000000000000000000000000000000000000..caa5c384832b2d653fc190d9b5b4f838c0b06088 GIT binary patch literal 15632 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 Fe*@o&gCzg} literal 0 HcmV?d00001 diff --git a/bin/cat b/bin/cat new file mode 100755 index 0000000..a96140e --- /dev/null +++ b/bin/cat @@ -0,0 +1,13 @@ +#!/bin/sh + +alias dd="dd bs=1 2>/dev/null" + +if [ -z "$1" ]; then + dd "$TMPSRC" + +cc -o "$TMPOUT" "$TMPSRC" + +dd bs=1 2>/dev/null | "$TMPOUT" diff --git a/bin/head b/bin/head new file mode 100755 index 0000000..84b6540 --- /dev/null +++ b/bin/head @@ -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 diff --git a/bin/id b/bin/id new file mode 100755 index 0000000000000000000000000000000000000000..ac53031be42675c8afd46a9042c66099191ab360 GIT binary patch literal 11328 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 literal 0 HcmV?d00001 diff --git a/bin/levenshtein b/bin/levenshtein new file mode 100755 index 0000000000000000000000000000000000000000..24b193a92643588f277379db47a80bc1bd33c085 GIT binary patch literal 18408 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 literal 0 HcmV?d00001 diff --git a/bin/man b/bin/man new file mode 100755 index 0000000..3f7b62d --- /dev/null +++ b/bin/man @@ -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 diff --git a/bin/mod b/bin/mod new file mode 100755 index 0000000..bbb63e4 --- /dev/null +++ b/bin/mod @@ -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 diff --git a/bin/pow b/bin/pow new file mode 100755 index 0000000..3158f07 --- /dev/null +++ b/bin/pow @@ -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 diff --git a/bin/runlength b/bin/runlength new file mode 100755 index 0000000000000000000000000000000000000000..9e4c0c9d19016f53483b85b129df4cb60537ad1f GIT binary patch literal 21536 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 literal 0 HcmV?d00001 diff --git a/bin/seq b/bin/seq new file mode 100755 index 0000000..3b4ab1d --- /dev/null +++ b/bin/seq @@ -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 diff --git a/bin/subtract b/bin/subtract new file mode 100755 index 0000000..e0d4b45 --- /dev/null +++ b/bin/subtract @@ -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 diff --git a/bin/true b/bin/true new file mode 100755 index 0000000..e69de29 diff --git a/bin/uwu b/bin/uwu new file mode 100755 index 0000000..2fc7f0f --- /dev/null +++ b/bin/uwu @@ -0,0 +1,10 @@ +#!/bin/sh + +# Simple script of substitutions to uwuify English. +# Not a great use of disk... +dd 2>/dev/null \ +| sed \ + -e 's/l/w/g' \ + -e 's/r/w/g' \ + -e 's/smaww/smol/g' \ + -e 's/wove/wuv/g'