commit d6116f15c38be34e8d5bba4d5d183f78313b5e9a Author: styan Date: Wed Jun 10 08:16:08 2020 +0000 Initial commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..31e8583 --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +.POSIX: +default: +all: +install:\ + install-baseenc\ + install-basedec\ + install-gmi2html\ + install-tac +install-baseenc: + install -m755 baseenc.sh\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/base64enc" + ln -f -- "$$BASEDIR$${PREFIX-/usr/local}/bin/base64enc"\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/base32enc" + ln -f -- "$$BASEDIR$${PREFIX-/usr/local}/bin/base64enc"\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/base16enc" +install-basedec: + install -m755 basedec.sh\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/base64dec" + ln -f -- "$$BASEDIR$${PREFIX-/usr/local}/bin/base64dec"\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/base32dec" + ln -f -- "$$BASEDIR$${PREFIX-/usr/local}/bin/base64dec"\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/base16dec" +install-gmi2html: + install -m755 gmi2html.sh\ + "$$BASEDIR$${PREFIX-/usr/local}/bin/gmi2html" +install-tac: + install -m755 tac.sh "$$BASEDIR$${PREFIX-/usr/local}/bin/tac" +linstall:\ + linstall-baseenc\ + linstall-basedec\ + linstall-gmi2html\ + linstall-tac +linstall-baseenc: + install -m755 baseenc.sh "$$HOME/bin/base64enc" + ln -f -- "$$HOME/bin/base64enc" "$$HOME/bin/base32enc" + ln -f -- "$$HOME/bin/base64enc" "$$HOME/bin/base16enc" +linstall-basedec: + install -m755 basedec.sh "$$HOME/bin/base64dec" + ln -f -- "$$HOME/bin/base64dec" "$$HOME/bin/base32dec" + ln -f -- "$$HOME/bin/base64dec" "$$HOME/bin/base16dec" +linstall-gmi2html: + install -m755 gmi2html.sh "$$HOME/bin/gmi2html" +linstall-tac: + install -m755 tac.sh "$$HOME/bin/tac" +clean: diff --git a/basedec.sh b/basedec.sh new file mode 100644 index 0000000..79ce856 --- /dev/null +++ b/basedec.sh @@ -0,0 +1,86 @@ +#!/bin/sh +usage() { + printf 'usage: %s [-t type] [file ...]\n' "${0##*/}" >&2 + exit 64 +} +case "$(printf %s "${0##*/}" | tr A-Z a-z)" in + *16*) type=16;; + *32hex*|*32x*) + type=32x;; + *32*) type=32;; + *64s*) type=64s;; + *64*) type=64;; + *) type=64;; +esac +b16=0123456789ABCDEF +b32=ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 +b32hex=0123456789ABCDEFGHIJKLMNOPQRSTUV +b64=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ +b64safe=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ +while getopts t: opt; do + case "$opt" in + t) case "$(printf %s "$OPTARG" | tr A-Z a-z)" in + 16) type=16;; + 32) type=32;; + 32x) type=32x;; + 64) type=64;; + 64s|64safe) + type=64s;; + *) usage;; + esac + ;; + *) usage;; + esac +done +shift $((OPTIND - 1)) +case "$type" in +16) alphabet="$b16" + insensitive=1 + bits=4;; +32) alphabet="$b32" + insensitive=1 + bits=5;; +32x) alphabet="$b32hex" + insensitive=1 + bits=5;; +64) alphabet="$b64" + insensitive=0 + bits=6;; +64s) alphabet="$b64safe" + insensitive=0 + bits=6;; +*) usage;; # Unreachable +esac +cat -- "$@" | awk -vbits="$bits" -valphabet="$alphabet" \ + -vinsensitive="$insensitive" ' + function leftshift(a, b) { + return a * 2 ** b + } + function rightshift(a, b) { + return int(a / 2 ** b) + } + function mask(a, b) { + return a > 0 ? a % leftshift(1, b) : a + } + BEGIN { + FS="" + split(alphabet, al, "") + for (n in al) + a[al[n]] = n - 1 + if (insensitive) + for (c in a) + a[tolower(c)] = a[c] + } { + for (i = 1; i <= NF; i++) { + if ($i in a) { + t = leftshift(t, bits) + a[$i] + b += bits + while (b >= 8) { + b -= 8 + printf "%c", rightshift(t, b) + t = mask(t, b) + count++ + } + } + } + }' diff --git a/baseenc.sh b/baseenc.sh new file mode 100644 index 0000000..909c21c --- /dev/null +++ b/baseenc.sh @@ -0,0 +1,112 @@ +#!/bin/sh +usage() { + printf 'usage: %s [-np] [-a alphabet] [-t type] [file ...]\n' \ + "${0##*/}" >&2 + exit 64 +} +case "$(printf %s "${0##*/}" | tr A-Z a-z)" in + *16l*|*hexl*) + type=16l;; + *16*) type=16u;; + *32hexl*|*32x*l) + type=32x;; + *32hex*|*32x*) + type=32X;; + *32l*) type=32l;; + *32*) type=32u;; + *64s*) type=64s;; + *) type=64;; +esac +b16upper=0123456789ABCDEF +b16lower=0123456789abcdef +b32upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 +b32lower=abcdefghijklmnopqrstuvwxyz234567 +b32hexupper=0123456789ABCDEFGHIJKLMNOPQRSTUV +b32hexlower=0123456789abcdefghijklmnopqrstuv +b64=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ +b64safe=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ +alphabet= +pad=1 +nl=1 +while getopts a:npt: opt; do + case "$opt" in + a) alphabet="$OPTARG";; + n) nl=0;; + p) pad=0;; + t) case "$(printf %s "$OPTARG" | tr A-WYZ a-wyz)" in + 16|16u|16upper) + type=16u;; + 16l|16lower) + type=16l;; + 32|32u|32upper) + type=32u;; + 32l|32lower) + type=32l;; + 32X) type=32X;; + 32x) type=32x;; + 64) type=64;; + 64s|64safe) + type=64s;; + *) usage;; + esac + ;; + *) usage;; + esac +done +shift $((OPTIND - 1)) +case "$type" in +16u) alphabet="${alphabet:-$b16upper}" + bits=4;; +16l) alphabet="${alphabet:-$b16lower}" + bits=4;; +32u) alphabet="${alphabet:-$b32upper}" + bits=5;; +32l) alphabet="${alphabet:-$b32lower}" + bits=5;; +32X) alphabet="${alphabet:-$b32hexupper}" + bits=5;; +32x) alphabet="${alphabet:-$b32hexlower}" + bits=5;; +64) alphabet="${alphabet:-$b64}" + bits=6;; +64s) alphabet="${alphabet:-$b64safe}" + bits=6;; +*) usage;; # Unreachable +esac +od -An -tu1 -v -- "$@" | sed 's/^ *//' | tr -s ' ' '\n' | + sed 's/^00*//' | awk -vbits="$bits" -valphabet="$alphabet" \ + -vnl="$nl" -vpad="$pad" ' + function leftshift(a, b) { + return a * 2 ** b + } + function rightshift(a, b) { + return int(a / 2 ** b) + } + function mask(a, b) { + return a > 0 ? a % leftshift(1, b) : a + } + BEGIN { + split(alphabet, a, "") + } { + t = leftshift(t, 8) + $0 + b += 8 + while (b >= bits) { + b -= bits + printf "%s", a[rightshift(t, b) + 1] + t = mask(t, b) + count++ + } + } END { + if (b > 0) { + printf "%s", a[leftshift(t, bits - b) + 1] + count++ + } + if (pad && bits == 5) + for (count += 0; count % 8 != 0; count++) + printf "=" + if (pad && bits == 6) + for (count += 0; count % 4 != 0; count++) + printf "=" + if (nl) + print "" + }' diff --git a/gmi2html.sh b/gmi2html.sh new file mode 100644 index 0000000..f8b8598 --- /dev/null +++ b/gmi2html.sh @@ -0,0 +1,91 @@ +#!/bin/sh +usage() { + echo >&2 \ + 'usage: gmi2html [-h header] [-p prefix] [-s suffix] [file ...]' + exit 64 +} +gmi2html() { + if [ "$prefix" ]; then + printf '%s\n' "$prefix" + fi + awk ' + function hescape(s) { + gsub(/&/, "&", s) + gsub(//, ">", s) + gsub(/"/, """, s) + return s + } + /^```/ { + sub(/^```/, "") + pre = !pre + if (pre) + print "\t
"
+		else
+			print "\t
" + } !pre && /^=>/ { + u = $2 + $1 = "" + $2 = "" + sub(/^[[:space:]]+/, "") + if ($0 !~ /./) + $0 = u + print "\t" hescape($0) "" + next + } !pre && /^###/ { + sub(/^###[[:space:]]*/, "") + id = tolower($0) + gsub(/[^[:alnum:]]+/, "-", id) + print "\t

" \ + hescape($0) "

" + next + } !pre && /^##/ { + sub(/^##[[:space:]]*/, "") + id = tolower($0) + gsub(/[^[:alnum:]]+/, "-", id) + print "\t

" \ + hescape($0) "

" + next + } !pre && /^#/ { + sub(/^#[[:space:]]*/, "") + id = tolower($0) + gsub(/[^[:alnum:]]+/, "-", id) + print "\t

" \ + hescape($0) "

" + next + } !pre && /^[[:space:]]*$/ { + print "\t
" + next + } { + print hescape($0) + } + END { + if (pre) + print "\t" + }' + if [ "$suffix" ]; then + printf '%s\n' "$suffix" + fi +} +header='' +prefix='

' +suffix='

' +while getopts h:p:s: opt; do + case "$opt" in + h) header="$OPTARG";; + p) prefix="$OPTARG";; + s) suffix="$OPTARG";; + *) usage;; + esac +done +shift $((OPTIND - 1)) +if [ "$header" ]; then + printf '%s\n' "$header" +fi +if [ "$#" -eq 0 ]; then + gmi2html + exit +fi +for f in "$@"; do + gmi2html < "$f" +done diff --git a/tac.sh b/tac.sh new file mode 100644 index 0000000..913ae4f --- /dev/null +++ b/tac.sh @@ -0,0 +1,26 @@ +#!/bin/sh +usage() { + echo 'usage: tac [-b] [-s separator] [file ...]' >&2 + exit 64 +} +bflag= +rs='\n' +while getopts bs: opt; do + case "$opt" in + b) bflag=1;; + s) rs="$OPTARG";; + *) usage;; + esac +done +shift $((OPTIND - 1)) +rs="$(printf %s "$rs" | sed 's/[][)(}{.+?*^$]/\\&/g')" +awk -vRS="$rs" -vORS="$rs" -vb="$bflag" '{ + a[NR] = $0 +} END { + if (b) + for (i = NR; i > 0; i--) + printf "%s%s", ORS, a[i] + else + for (i = NR; i > 0; i--) + printf "%s%s", a[i], ORS +}' "$@"