From 101e6f1f8090a707f24112bdeb12655a76b2ffc8 Mon Sep 17 00:00:00 2001 From: tzlil Date: Tue, 26 Sep 2023 03:09:22 +0300 Subject: padding --- base64.joy | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/base64.joy b/base64.joy index 0aa97b4..f5216c4 100644 --- a/base64.joy +++ b/base64.joy @@ -12,18 +12,29 @@ b64enc2 == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" sw s2l == [null] [pop []] [uncons] [cons] linrec; b64enc == - s2l - "" swap - # pad with null bytes - # calculate how many bytes to pad - [size 3 rem 3 swap - 3 rem] nullary - # i cant use null bytes in strings (hence s2l) - [0 chr [] cons concat] times - # len(s)/3 times - [size 3 /] nullary - [[3 take] nullary s2l [b64enc1 b64enc2] infra first rollup [swap concat] dip 3 drop] times - # remove the now-empty string - pop - "\n" concat + s2l + "" swap + # pad with null bytes + # calculate how many bytes to pad + [size 3 rem 3 swap - 3 rem] nullary + # save the amount for later + dup [swap] dip [[swap] dip] dip + # i cant use null bytes + [0 chr [] cons concat] times + # len(s)/3 times + [size 3 /] nullary + [[3 take] nullary s2l [b64enc1 b64enc2] infra first rollup [swap concat] dip 3 drop] times + # remove the now-empty string + pop + # add the padding + # encoded characters - characters that need to be padded + [size] nullary swapd [swap -] unary + # take only the non padded characters + swapd take + # add back as many ='s as you took + + # for some reason this part crahes joy with a malloc error if the input is more than 20 characters + swap ["=" concat] times + "\n" concat END stdin [feof not] [fgets b64enc putchars] while fclose. -- cgit 1.4.1