# You should have received a copy of the GNU Lesser General Public
# License along with this program. If not, see <http://www.gnu.org/licenses/>.
-set YACBuf {}
+namespace eval YAC {
-proc yacAdd {v} {
- global YACBuf
- lappend YACBuf [binary format c $v]
+variable buf {}
+
+proc add {v} {
+ variable buf
+ set buf [string cat $buf $v]
}
-proc EOC {} { yacAdd [expr 0x00] }
-proc NIL {} { yacAdd [expr 0x01] }
-proc FALSE {} { yacAdd [expr 0x02] }
-proc TRUE {} { yacAdd [expr 0x03] }
+proc char {v} { add [binary format c $v] }
+
+proc EOC {} { char [expr 0x00] }
+proc NIL {} { char [expr 0x01] }
+proc FALSE {} { char [expr 0x02] }
+proc TRUE {} { char [expr 0x03] }
proc UUID {v} {
set v [binary decode hex [string map {- ""} $v]]
if {[string length $v] != 16} { error "bad UUID len" }
- yacAdd [expr 0x04]
- global YACBuf
- lappend YACBuf $v
+ char [expr 0x04]
+ add $v
}
proc toBE {l v} {
for {set i 0} {$i < $l} {incr i} {
set b [expr {($l - $i - 1) * 8}]
- yacAdd [expr {($v & (0xFF << $b)) >> $b}]
+ char [expr {($v & (0xFF << $b)) >> $b}]
}
}
}
if {$v < 32} {
if {$neg} {
- yacAdd [expr {0x60 | $v}]
+ char [expr {0x60 | $v}]
} {
- yacAdd [expr {0x40 | $v}]
+ char [expr {0x40 | $v}]
}
return
}
incr l
incr bits 8
}
- yacAdd [expr {$b | $l}]
+ char [expr {$b | $l}]
toBE [expr {$l + 1}] $v
}
set lv 61
set ll 1
}
- yacAdd [expr {$atom | $lv}]
+ char [expr {$atom | $lv}]
if {$ll > 0} { toBE $ll $vl }
- global YACBuf
- lappend YACBuf $v
+ add $v
}
-proc STR {v} { _str [expr {0x80 | 0x40}] [encoding convertto utf-8 $v]}
proc BIN {v} { _str [expr 0x80] $v}
+proc STR {v} { _str [expr {0x80 | 0x40}] [encoding convertto utf-8 $v]}
proc LIST {v} {
- yacAdd [expr 0x08]
+ char [expr 0x08]
foreach i $v { eval $i }
EOC
}
-proc lenFirstSort {a b} {
+proc LenFirstSort {a b} {
set a [encoding convertto utf-8 $a]
set b [encoding convertto utf-8 $b]
set al [string length $a]
lappend keys $k
dict set d $k $v
}
- set keys [lsort -command lenFirstSort $keys]
- yacAdd [expr 0x09]
+ set keys [lsort -command LenFirstSort $keys]
+ char [expr 0x09]
foreach k $keys {
STR $k
eval [dict get $d $k]
}
proc BLOB {chunkLen v} {
- yacAdd [expr 0x0B]
+ char [expr 0x0B]
INT $chunkLen
set vl [string length $v]
set chunks [expr {$vl / $chunkLen}]
- global YACBuf
for {set i 0} {$i < $chunks} {incr i} {
NIL
- lappend YACBuf [string range $v \
+ add [string range $v \
[expr {$i * $chunkLen}] \
[expr {(($i + 1) * $chunkLen) - 1}]]
}
}
}
-set Leapsecs1972 10
-set Leapsecs [list \
- 1483228800 \
- 1435708800 \
- 1341100800 \
- 1230768000 \
- 1136073600 \
- 915148800 \
- 867715200 \
- 820454400 \
- 773020800 \
- 741484800 \
- 709948800 \
- 662688000 \
- 631152000 \
- 567993600 \
- 489024000 \
- 425865600 \
- 394329600 \
- 362793600 \
- 315532800 \
- 283996800 \
- 252460800 \
- 220924800 \
- 189302400 \
- 157766400 \
- 126230400 \
- 94694400 \
- 78796800]
+variable Leapsecs {
+ 1483228800
+ 1435708800
+ 1341100800
+ 1230768000
+ 1136073600
+ 915148800
+ 867715200
+ 820454400
+ 773020800
+ 741484800
+ 709948800
+ 662688000
+ 631152000
+ 567993600
+ 489024000
+ 425865600
+ 394329600
+ 362793600
+ 315532800
+ 283996800
+ 252460800
+ 220924800
+ 189302400
+ 157766400
+ 126230400
+ 94694400
+ 78796800
+}
proc toTAI64 {v} {
- global Leapsecs Leapsecs1972
- set diff $Leapsecs1972
+ variable Leapsecs
+ set diff 10
for {set i 0} {$i < [llength $Leapsecs]} {incr i} {
if {$v > [lindex $Leapsecs $i]} {
set diff [expr {$diff + [llength $Leapsecs] - $i}]
proc TAI64 {v {n 0} {a 0}} {
if {$a != 0} {
- yacAdd [expr 0x1A]
+ char [expr 0x1A]
toTAI64 $v
toBE 4 $n
toBE 4 $a
} elseif {$n != 0} {
- yacAdd [expr 0x19]
+ char [expr 0x19]
toTAI64 $v
toBE 4 $n
} else {
- yacAdd [expr 0x18]
+ char [expr 0x18]
toTAI64 $v
}
}
return [clock scan $v -format {%Y-%m-%d %H:%M:%S} -gmt 1]
}
-proc Raw {t v} {
- yacAdd $t
- global YACBuf
- lappend YACBuf $v
+proc RAW {t v} {
+ char $t
+ add $v
}
-proc YACBufGet {} {
- global YACBuf
- return [string cat {*}$YACBuf]
+namespace export EOC NIL FALSE TRUE UUID INT STR BIN RAW
+namespace export TAI64 UTCFromISO
+namespace export LIST MAP LenFirstSort BLOB
+
}