diff options
Diffstat (limited to 'AWK')
-rw-r--r-- | AWK/README | 16 | ||||
-rwxr-xr-x | AWK/b91dec.awk | 48 |
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 + } +} |