summaryrefslogtreecommitdiff
path: root/AWK
diff options
context:
space:
mode:
Diffstat (limited to 'AWK')
-rw-r--r--AWK/README16
-rwxr-xr-xAWK/b91dec.awk48
2 files changed, 64 insertions, 0 deletions
diff --git a/AWK/README b/AWK/README
new file mode 100644
index 0000000..ff1a834
--- /dev/null
+++ b/AWK/README
@@ -0,0 +1,16 @@
+This is a (slow) AWK implementation of the basE91 decoder. It decodes from
+standard input to standard output.
+
+Example usage:
+
+ awk -f b91dec.awk < file.b91 > file.bin
+ or
+ ./b91dec.awk < file.b91 > file.bin
+
+
+Be careful on non-Unix systems! - During output, some ported versions of awk
+automatically convert byte values of 0x0A to the native line break sequence of
+the host system (e.g. 0x0D 0x0A under DOS/Windows). This can result in corrupt
+binary files.
+You should test on some examples and compare the output of b91dec.awk with the
+original data before relying on it.
diff --git a/AWK/b91dec.awk b/AWK/b91dec.awk
new file mode 100755
index 0000000..8a15fc3
--- /dev/null
+++ b/AWK/b91dec.awk
@@ -0,0 +1,48 @@
+#!/usr/bin/awk -f
+
+# basE91 decoder
+# Copyright (c) 2000-2006 Joachim Henke
+# http://base91.sourceforge.net/
+
+BEGIN {
+ b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\""
+ for (i = 0; i < 256; ++i) {
+ --d[sprintf("%c", i)]
+ }
+ for (i = 0; i < 91; ++i) {
+ d[substr(b, i + 1, 1)] = i
+ }
+ b = 0
+ n = 0
+ v = -1
+}
+
+{
+ l = length($0)
+ for (i = 1; i <= l; ++i) {
+ c = d[substr($0, i, 1)]
+ if (c < 0) {
+ continue
+ }
+ if (v < 0) {
+ v = c
+ } else {
+ v += c * 91
+ b += v * 2 ^ n
+ n += v % 8192 > 88 ? 13 : 14
+ do {
+ b -= c = b % 256
+ printf "%c", c
+ b /= 256
+ n -= 8
+ } while (n > 7)
+ v = -1
+ }
+ }
+}
+
+END {
+ if (v + 1) {
+ printf "%c", b + v * 2 ^ n
+ }
+}