summary refs log tree commit diff
path: root/base64.joy
diff options
context:
space:
mode:
Diffstat (limited to 'base64.joy')
-rw-r--r--base64.joy37
1 files changed, 17 insertions, 20 deletions
diff --git a/base64.joy b/base64.joy
index 0aa97b4..10827c7 100644
--- a/base64.joy
+++ b/base64.joy
@@ -1,29 +1,26 @@
 DEFINE
-shl == 2 *;
-shr == 2 /;
-and63 == [64 / 64 *] nullary -;
+shl 	== 2 *;
+shr 	== 2 /;
+and63 	== dup 64 / 64 * -;
 b64enc1 == ord 16 [shl] times [ord 8 [shl] times] dip + [ord] dip +;
-b64enc2 == "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" swap [] [
-		[18 [shr] times and63 at]
-		[12 [shr] times and63 at]
-		[6  [shr] times and63 at]
-		[and63 at]
-	      ] construct "" cons cons cons cons [pop] dip;
+shrat   == [shr] times and63 at;
+b64enc2 == ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" swap] [
+	# [18 12 6 0 ] [[shrat] cons] map crashes
+		[18 shrat]
+		[12 shrat]
+		[6  shrat]
+		[0  shrat]
+	   ] construct "" 4 [cons] times popd;
 
-s2l == [null]  [pop []]  [uncons]  [cons]  linrec;
-b64enc ==
+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)
+	dup size 3 rem 3 swap - 3 rem
 	[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
+	dup size 3 /
+	[dup 3 take s2l [b64enc1 b64enc2] infra first rollup [swap concat] dip 3 drop] times
 	pop
-	"\n" concat
+	"\n" concat;
 END
 stdin [feof not] [fgets b64enc putchars] while fclose.