]> Cypherpunks repositories - keks.git/commitdiff
No hard-coded single buffer
authorSergey Matveev <stargrave@stargrave.org>
Wed, 9 Apr 2025 08:37:44 +0000 (11:37 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 9 Apr 2025 08:44:37 +0000 (11:44 +0300)
tcl/keks.tcl
tcl/test-vector.tcl

index a1afda13ad88a725566f38b2bc47aac489a52c256f7bd4fbbbfe44cc3641c6c7..24165179011194449c862c2fa3f38e533b08028c4ed88ab058bf645edf2ea865 100644 (file)
 
 namespace eval KEKS {
 
-variable buf {}
-
 proc add {v} {
-    variable buf
+    upvar buf buf
     set buf [string cat $buf $v]
 }
 
-proc char {v} {add [binary format c $v]}
+proc char {v} {
+    upvar buf buf
+    add [binary format c $v]
+}
+
+proc RAW {v} {
+    upvar buf buf
+    add $v
+}
+
+proc EOC {} {
+    upvar buf buf
+    char [expr 0x00]
+}
+
+proc NIL {} {
+    upvar buf buf
+    char [expr 0x01]
+}
+
+proc FALSE {} {
+    upvar buf buf
+    char [expr 0x02]
+}
 
-proc RAW {v} {add $v}
-proc EOC {} {char [expr 0x00]}
-proc NIL {} {char [expr 0x01]}
-proc FALSE {} {char [expr 0x02]}
-proc TRUE {} {char [expr 0x03]}
+proc TRUE {} {
+    upvar buf buf
+    char [expr 0x03]
+}
 
 proc HEXLET {v} {
     set v [binary decode hex [string map {- ""} $v]]
     if {[string length $v] != 16} {
         error "bad len"
     }
+    upvar buf buf
     char [expr 0x04]
     add $v
 }
@@ -44,6 +65,7 @@ proc MAGIC {v} {
     if {$l > 12} {
         error "too long"
     }
+    upvar buf buf
     add "KEKS"
     add $v
     add [string repeat [binary format c 0] [expr {12 - $l}]]
@@ -58,9 +80,13 @@ proc toBEbin {l v} {
     return [join $a ""]
 }
 
-proc toBE {l v} {add [toBEbin $l $v]}
+proc toBE {l v} {
+    upvar buf buf
+    add [toBEbin $l $v]
+}
 
 proc INT {v} {
+    upvar buf buf
     if {$v >= 0} {
         char [expr 0x0C]
     } {
@@ -98,6 +124,7 @@ proc _str {atom v} {
         set ll 1
         set vl [expr {$vl - 61}]
     }
+    upvar buf buf
     char [expr {$atom | $lv}]
     if {$ll > 0} {
         toBE $ll $vl
@@ -105,10 +132,18 @@ proc _str {atom v} {
     add $v
 }
 
-proc BIN {v} {_str [expr 0x80] $v}
-proc STR {v} {_str [expr {0x80 | 0x40}] [encoding convertto utf-8 $v]}
+proc BIN {v} {
+    upvar buf buf
+    _str [expr 0x80] $v
+}
+
+proc STR {v} {
+    upvar buf buf
+    _str [expr {0x80 | 0x40}] [encoding convertto utf-8 $v]
+}
 
 proc LIST {v} {
+    upvar buf buf
     char [expr 0x08]
     foreach i $v {
         eval $i
@@ -148,6 +183,7 @@ proc MAP {pairs} {
         dict set d $k $v
     }
     set keys [lsort -command LenFirstSort $keys]
+    upvar buf buf
     char [expr 0x09]
     foreach k $keys {
         STR $k
@@ -161,10 +197,12 @@ proc SET {v} {
     foreach k $v {
         lappend args $k NIL
     }
+    upvar buf buf
     MAP $args
 }
 
 proc BLOB {chunkLen v} {
+    upvar buf buf
     char [expr 0x0B]
     toBE 8 [expr {$chunkLen - 1}]
     set vl [string length $v]
@@ -235,10 +273,12 @@ proc toTAI64 {v} {
         incr v
     }
     set v [expr {$v + 0x4000000000000000}]
+    upvar buf buf
     toBE 8 $v
 }
 
 proc TAI64 {v {n 0} {a 0}} {
+    upvar buf buf
     if {$a != 0} {
         char [expr 0x1A]
         toTAI64 $v
index 27609bcfc0209272027cf8aae38f4228bf2db41a0d0ba478a4169dffcc54cc38..2b471357c401bcf9b38ba08701ca9a3b125945758b4da5b0a77d0c929ef0b0a5 100644 (file)
@@ -1,5 +1,6 @@
 source keks.tcl
 namespace import KEKS::*
+set buf ""
 
 MAGIC test-vector
 MAP {
@@ -69,4 +70,4 @@ MAP {
     ip {HEXLET 20010db8-85a3-08d3-1319-8a2e03707348}
 }
 
-puts [binary encode hex $::KEKS::buf]
+puts [binary encode hex $buf]