code / nomsu

Lines6.6K Lua5.1K PEG1.3K make117
2 others 83
Markdown60 Bourne Again Shell23
(51 lines)
1 #!/usr/bin/env nomsu -V7.0.0
2 ###
3 This file defines actions for encoding/decoding base 64, as specified in:
4 https://tools.ietf.org/html/rfc4648
6 $b64_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
7 $b64_chars = [: for $ in (1 to #$b64_str): add ($b64_str, character $)]
8 $reverse_b64 = {: for ($i = $c) in $b64_chars: add $c = ($i - 1)}
9 $reverse_b64."=" = 64
10 set $reverse_b64's metatable to {.__index = ->0}
11 test:
12 $cases = ["", "Zg==", "Zm8=", "Zm9v", "Zm9vYg==", "Zm9vYmE=", "Zm9vYmFy"]
13 for ($len = $encoded) in $cases:
14 $plain = ("foobar", from 1 to ($len - 1))
15 assume (base64 $plain) == $encoded
16 assume (base64 decode $encoded) == $plain
18 external:
19 [base64 $str, base64 encode $str, $str base64] all mean:
20 $chars = []
21 for $i in (1 to #$str by 3):
22 $bytes = [=lua "\$str:byte(\$i, \($i + 2))"]
23 $chars, add $b64_chars.((($bytes.1 & 252) >> 2) + 1)
24 if #$bytes is:
25 3:
26 $chars, add $b64_chars.((($bytes.1 & 3) << 4) + (($bytes.2 & 240) >> 4) + 1)
27 $chars, add $b64_chars.((($bytes.2 & 15) << 2) + (($bytes.3 & 192) >> 6) + 1)
28 $chars, add $b64_chars.(($bytes.3 & 63) + 1)
30 2:
31 $chars, add $b64_chars.((($bytes.1 & 3) << 4) + (($bytes.2 & 240) >> 4) + 1)
32 $chars, add $b64_chars.((($bytes.2 & 15) << 2) + 1)
33 $chars, add "="
35 1:
36 $chars, add $b64_chars.((($bytes.1 & 3) << 4) + 1)
37 $chars, add "="
38 $chars, add "="
40 return ($chars, joined)
41 (chr $) means (=lua "string.char(\$)")
42 [decode base64 $str, $str base64 decoded, base64 decode $str] all mean:
43 $chars = []
44 for $i in (1 to #$str by 4):
45 $indices = [: for $j in ($i to ($i + 3)): add $reverse_b64.($str, character $j)]
46 $chars, add (chr (($indices.1 << 2) + (($indices.2 & 48) >> 4)))
47 if (($str, character ($i + 2)) == "="): stop
48 $chars, add (chr ((($indices.2 & 15) << 4) + (($indices.3 & 60) >> 2)))
49 if (($str, character ($i + 3)) == "="): stop
50 $chars, add (chr ((($indices.3 & 3) << 6) + $indices.4))
51 return ($chars, joined)