diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2018-11-17 14:38:05 -0800 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2018-11-17 14:39:08 -0800 |
| commit | 7f47d4204039258cec78c767f489b7809b4257ff (patch) | |
| tree | c8533068b75ab453accfe1f688705e9e94c9e279 /lib/base64.nom | |
| parent | 34a3dd22a4e132bd4e0fe3ce89831c3fe761d3d9 (diff) | |
In-progress (but working) overhaul of some elements including: function
calls, lib/thing.nom API, multi-assignments, varargs, etc.
Diffstat (limited to 'lib/base64.nom')
| -rw-r--r-- | lib/base64.nom | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/base64.nom b/lib/base64.nom index 01d4f2f..ea951c8 100644 --- a/lib/base64.nom +++ b/lib/base64.nom @@ -4,12 +4,14 @@ https://tools.ietf.org/html/rfc4648 %b64_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -%reverse_b64 = {: for %i in 1 to (size of %b64_str): add %b64_str.%i = (%i - 1)} -%reverse_b64."=" = 0 +%b64_chars = [: for % in 1 to (size of %b64_str): add (%b64_str::character %)] +%reverse_b64 = {: for %c in %b64_chars at %i: add %c = (%i - 1)} +%reverse_b64."=" = 64 +set %reverse_b64's metatable to {__index: -> 0} test: %cases = ["", "Zg==", "Zm8=", "Zm9v", "Zm9vYg==", "Zm9vYmE=", "Zm9vYmFy"] for %len = %encoded in %cases: - %plain = "foobar".[1, %len - 1] + %plain = ("foobar"::from 1 to (%len - 1)) assume (base64 %plain) == %encoded assume (base64 decode %encoded) == %plain @@ -17,20 +19,20 @@ externally [base64 %str, base64 encode %str, %str base64] all mean: %chars = [] for %i in 1 to (size of %str) via 3: %bytes = [=lua "\%str:byte(\%i, \(%i + 2))"] - %chars::add %b64_str.(((%bytes.1 & 252) >> 2) + 1) + %chars::add %b64_chars.(((%bytes.1 & 252) >> 2) + 1) if (size of %bytes) is: 3: - %chars::add %b64_str.(((%bytes.1 & 3) << 4) + ((%bytes.2 & 240) >> 4) + 1) - %chars::add %b64_str.(((%bytes.2 & 15) << 2) + ((%bytes.3 & 192) >> 6) + 1) - %chars::add %b64_str.((%bytes.3 & 63) + 1) + %chars::add %b64_chars.(((%bytes.1 & 3) << 4) + ((%bytes.2 & 240) >> 4) + 1) + %chars::add %b64_chars.(((%bytes.2 & 15) << 2) + ((%bytes.3 & 192) >> 6) + 1) + %chars::add %b64_chars.((%bytes.3 & 63) + 1) 2: - %chars::add %b64_str.(((%bytes.1 & 3) << 4) + ((%bytes.2 & 240) >> 4) + 1) - %chars::add %b64_str.(((%bytes.2 & 15) << 2) + 1) + %chars::add %b64_chars.(((%bytes.1 & 3) << 4) + ((%bytes.2 & 240) >> 4) + 1) + %chars::add %b64_chars.(((%bytes.2 & 15) << 2) + 1) %chars::add "=" 1: - %chars::add %b64_str.(((%bytes.1 & 3) << 4) + 1) + %chars::add %b64_chars.(((%bytes.1 & 3) << 4) + 1) %chars::add "=" %chars::add "=" return (%chars::joined) @@ -39,10 +41,10 @@ externally (chr %) means (=lua "string.char(\%)") externally [decode base64 %str, %str base64 decoded, base64 decode %str] all mean: %chars = [] for %i in 1 to (size of %str) via 4: - %indices = [: for % in %i to (%i + 3): add %reverse_b64.(%str.%)] + %indices = [: for %j in %i to (%i + 3): add %reverse_b64.(%str::character %j)] %chars::add (chr ((%indices.1 << 2) + ((%indices.2 & 48) >> 4))) - if (%str.(%i + 2) == "="): stop + if ((%str::character (%i + 2)) == "="): stop %chars::add (chr (((%indices.2 & 15) << 4) + ((%indices.3 & 60) >> 2))) - if (%str.(%i + 3) == "="): stop + if ((%str::character (%i + 3)) == "="): stop %chars::add (chr (((%indices.3 & 3) << 6) + %indices.4)) return (%chars::joined) |
