chiark / gitweb /
cli.c: Make a fixed string const-correct
[base91.git] / AWK / b91dec.awk
1 #!/usr/bin/awk -f
2
3 # basE91 decoder
4 # Copyright (c) 2000-2006 Joachim Henke
5 # http://base91.sourceforge.net/
6
7 BEGIN {
8         b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~\""
9         for (i = 0; i < 256; ++i) {
10                 --d[sprintf("%c", i)]
11         }
12         for (i = 0; i < 91; ++i) {
13                 d[substr(b, i + 1, 1)] = i
14         }
15         b = 0
16         n = 0
17         v = -1
18 }
19
20 {
21         l = length($0)
22         for (i = 1; i <= l; ++i) {
23                 c = d[substr($0, i, 1)]
24                 if (c < 0) {
25                         continue
26                 }
27                 if (v < 0) {
28                         v = c
29                 } else {
30                         v += c * 91
31                         b += v * 2 ^ n
32                         n += v % 8192 > 88 ? 13 : 14
33                         do {
34                                 b -= c = b % 256
35                                 printf "%c", c
36                                 b /= 256
37                                 n -= 8
38                         } while (n > 7)
39                         v = -1
40                 }
41         }
42 }
43
44 END {
45         if (v + 1) {
46                 printf "%c", b + v * 2 ^ n
47         }
48 }