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
}
if {$l > 12} {
error "too long"
}
+ upvar buf buf
add "KEKS"
add $v
add [string repeat [binary format c 0] [expr {12 - $l}]]
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]
} {
set ll 1
set vl [expr {$vl - 61}]
}
+ upvar buf buf
char [expr {$atom | $lv}]
if {$ll > 0} {
toBE $ll $vl
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
dict set d $k $v
}
set keys [lsort -command LenFirstSort $keys]
+ upvar buf buf
char [expr 0x09]
foreach k $keys {
STR $k
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]
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