Artifact 22ecd222db6e6ad091aa98e95ee07101d04c7675:
0000: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 package require
0010: 54 63 6c 20 38 2e 36 0a 70 61 63 6b 61 67 65 20 Tcl 8.6.package
0020: 70 72 6f 76 69 64 65 20 6d 73 67 70 61 63 6b 20 provide msgpack
0030: 32 2e 30 2e 30 0a 0a 6e 61 6d 65 73 70 61 63 65 2.0.0..namespace
0040: 20 65 76 61 6c 20 6d 73 67 70 61 63 6b 20 7b 7d eval msgpack {}
0050: 0a 0a 6f 6f 3a 3a 63 6c 61 73 73 20 63 72 65 61 ..oo::class crea
0060: 74 65 20 6d 73 67 70 61 63 6b 3a 3a 70 61 63 6b te msgpack::pack
0070: 65 72 20 7b 0a 0a 20 20 20 20 76 61 72 69 61 62 er {.. variab
0080: 6c 65 20 64 61 74 61 0a 0a 20 20 20 20 63 6f 6e le data.. con
0090: 73 74 72 75 63 74 6f 72 20 7b 7d 20 7b 0a 20 20 structor {} {.
00a0: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20 22 set data "
00b0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 73 ". }.. des
00c0: 74 72 75 63 74 6f 72 20 7b 7d 0a 0a 20 20 20 20 tructor {}..
00d0: 6d 65 74 68 6f 64 20 64 61 74 61 20 7b 7d 20 7b method data {} {
00e0: 20 72 65 74 75 72 6e 20 24 64 61 74 61 20 7d 0a return $data }.
00f0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 73 65 . method rese
0100: 74 20 7b 7d 20 7b 20 73 65 74 20 64 61 74 61 20 t {} { set data
0110: 22 22 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 "" }.. method
0120: 20 70 61 63 6b 20 7b 74 79 70 65 20 7b 76 61 6c pack {type {val
0130: 75 65 20 30 7d 20 7b 76 61 6c 75 65 31 20 22 22 ue 0} {value1 ""
0140: 7d 20 7b 76 61 6c 75 65 32 20 22 22 7d 7d 20 7b } {value2 ""}} {
0150: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 20 . switch
0160: 2d 65 78 61 63 74 20 2d 2d 20 24 74 79 70 65 20 -exact -- $type
0170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 68 {. sh
0180: 6f 72 74 20 7b 20 61 70 70 65 6e 64 20 64 61 74 ort { append dat
0190: 61 20 5b 6d 79 20 70 61 63 6b 20 69 6e 74 31 36 a [my pack int16
01a0: 20 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20 $value] }.
01b0: 20 20 20 20 20 20 20 69 6e 74 20 7b 20 61 70 70 int { app
01c0: 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 end data [my pac
01d0: 6b 20 69 6e 74 33 32 20 24 76 61 6c 75 65 5d 20 k int32 $value]
01e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f }. lo
01f0: 6e 67 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 ng { append data
0200: 20 5b 6d 79 20 70 61 63 6b 20 69 6e 74 33 32 20 [my pack int32
0210: 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20 20 $value] }.
0220: 20 20 20 20 20 20 6c 6f 6e 67 5f 6c 6f 6e 67 20 long_long
0230: 7b 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 6d { append data [m
0240: 79 20 70 61 63 6b 20 69 6e 74 36 34 20 24 76 61 y pack int64 $va
0250: 6c 75 65 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 lue] }.
0260: 20 20 20 75 6e 73 69 67 6e 65 64 5f 73 68 6f 72 unsigned_shor
0270: 74 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 20 t { append data
0280: 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 31 36 20 [my pack uint16
0290: 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20 20 $value] }.
02a0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 5f 69 unsigned_i
02b0: 6e 74 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 nt { append data
02c0: 20 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 33 32 [my pack uint32
02d0: 20 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 20 20 $value] }.
02e0: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 5f unsigned_
02f0: 6c 6f 6e 67 20 7b 20 61 70 70 65 6e 64 20 64 61 long { append da
0300: 74 61 20 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 ta [my pack uint
0310: 33 32 20 24 76 61 6c 75 65 5d 20 7d 0a 20 20 20 32 $value] }.
0320: 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 unsigne
0330: 64 5f 6c 6f 6e 67 5f 6c 6f 6e 67 20 7b 20 61 70 d_long_long { ap
0340: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 pend data [my pa
0350: 63 6b 20 75 69 6e 74 36 34 20 24 76 61 6c 75 65 ck uint64 $value
0360: 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ] }.
0370: 66 69 78 6e 75 6d 70 6f 73 20 7b 20 61 70 70 65 fixnumpos { appe
0380: 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 nd data [binary
0390: 66 6f 72 6d 61 74 20 63 20 5b 65 78 70 72 20 7b format c [expr {
03a0: 24 76 61 6c 75 65 20 26 20 30 78 37 46 7d 5d 5d $value & 0x7F}]]
03b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 }. f
03c0: 69 78 6e 75 6d 6e 65 67 20 7b 20 61 70 70 65 6e ixnumneg { appen
03d0: 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 d data [binary f
03e0: 6f 72 6d 61 74 20 63 20 5b 65 78 70 72 20 7b 28 ormat c [expr {(
03f0: 24 76 61 6c 75 65 20 26 20 30 78 31 46 29 20 7c $value & 0x1F) |
0400: 20 30 78 45 30 7d 5d 5d 20 7d 0a 20 20 20 20 20 0xE0}]] }.
0410: 20 20 20 20 20 20 20 69 6e 74 38 20 7b 0a 20 20 int8 {.
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 if
0430: 20 7b 24 76 61 6c 75 65 20 3c 20 2d 33 32 7d 20 {$value < -32}
0440: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
0450: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 append dat
0460: 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 69 a [my pack fix_i
0470: 6e 74 38 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 nt8 $value].
0480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c } el
0490: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 se {.
04a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61 if {$va
04b0: 6c 75 65 20 3c 20 30 7d 20 7b 0a 20 20 20 20 20 lue < 0} {.
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
04d0: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b append data [
04e0: 6d 79 20 70 61 63 6b 20 66 69 78 6e 75 6d 6e 65 my pack fixnumne
04f0: 67 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 g $value].
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 }
0510: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 else {.
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
0530: 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 32 38 7d f {$value < 128}
0540: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
0560: 70 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 ppend data [my p
0570: 61 63 6b 20 66 69 78 6e 75 6d 70 6f 73 20 24 76 ack fixnumpos $v
0580: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 alue].
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 }
05a0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 else {.
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
05c0: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b append data [
05d0: 6d 79 20 70 61 63 6b 20 66 69 78 5f 69 6e 74 38 my pack fix_int8
05e0: 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 $value].
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0600: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 }.
0610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
0620: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
0630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
0640: 20 20 20 20 20 69 6e 74 31 36 20 7b 0a 20 20 20 int16 {.
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 if
0660: 7b 24 76 61 6c 75 65 20 3c 20 2d 31 32 38 7d 20 {$value < -128}
0670: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
0680: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 append dat
0690: 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 69 a [my pack fix_i
06a0: 6e 74 31 36 20 24 76 61 6c 75 65 5d 0a 20 20 20 nt16 $value].
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 } e
06c0: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 lseif {$value <
06d0: 31 32 38 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 128} {.
06e0: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e appen
06f0: 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 d data [my pack
0700: 69 6e 74 38 20 24 76 61 6c 75 65 5d 0a 20 20 20 int8 $value].
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 } e
0720: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 lseif {$value <
0730: 32 35 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 256} {.
0740: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e appen
0750: 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 d data [my pack
0760: 66 69 78 5f 75 69 6e 74 38 20 24 76 61 6c 75 65 fix_uint8 $value
0770: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
0780: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 } else {.
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
07a0: 70 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 ppend data [my p
07b0: 61 63 6b 20 66 69 78 5f 75 69 6e 74 31 36 20 24 ack fix_uint16 $
07c0: 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 value].
07d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
07e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
07f0: 20 20 20 69 6e 74 33 32 20 7b 0a 20 20 20 20 20 int32 {.
0800: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 if {$
0810: 76 61 6c 75 65 20 3c 20 2d 33 32 37 36 38 7d 20 value < -32768}
0820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
0830: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 append dat
0840: 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 69 a [my pack fix_i
0850: 6e 74 33 32 20 24 76 61 6c 75 65 5d 0a 20 20 20 nt32 $value].
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 } e
0870: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 lseif {$value <
0880: 36 35 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20 65536} {.
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 app
08a0: 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 end data [my pac
08b0: 6b 20 69 6e 74 31 36 20 24 76 61 6c 75 65 5d 0a k int16 $value].
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
08d0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 } else {.
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 app
08f0: 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 63 end data [my pac
0900: 6b 20 66 69 78 5f 75 69 6e 74 33 32 20 24 76 61 k fix_uint32 $va
0910: 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 lue].
0920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
0930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
0940: 20 69 6e 74 36 34 20 7b 0a 20 20 20 20 20 20 20 int64 {.
0950: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61 if {$va
0960: 6c 75 65 20 3c 20 2d 32 31 34 37 34 38 33 36 34 lue < -214748364
0970: 38 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 8} {.
0980: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 append
0990: 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 66 69 data [my pack fi
09a0: 78 5f 69 6e 74 36 34 20 24 76 61 6c 75 65 5d 0a x_int64 $value].
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
09c0: 7d 20 65 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 } elseif {$value
09d0: 20 3c 20 34 32 39 34 39 36 37 32 39 36 7d 20 7b < 4294967296} {
09e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
09f0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
0a00: 20 5b 6d 79 20 70 61 63 6b 20 69 6e 74 33 32 20 [my pack int32
0a10: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 $value].
0a20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b } else {
0a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0a40: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
0a50: 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 75 69 [my pack fix_ui
0a60: 6e 74 36 34 20 24 76 61 6c 75 65 5d 0a 20 20 20 nt64 $value].
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 }.
0a80: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
0a90: 20 20 20 20 20 20 20 20 20 75 69 6e 74 38 20 7b uint8 {
0aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0ab0: 20 73 65 74 20 76 61 6c 75 65 20 5b 65 78 70 72 set value [expr
0ac0: 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 7d {$value & 0xFF}
0ad0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
0ae0: 20 20 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 if {$value < 1
0af0: 32 38 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 28} {.
0b00: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 append
0b10: 20 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 66 data [my pack f
0b20: 69 78 6e 75 6d 70 6f 73 20 24 76 61 6c 75 65 5d ixnumpos $value]
0b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0b40: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 } else {.
0b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 ap
0b60: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 pend data [my pa
0b70: 63 6b 20 66 69 78 5f 75 69 6e 74 38 20 24 76 61 ck fix_uint8 $va
0b80: 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 lue].
0b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
0ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
0bb0: 20 75 69 6e 74 31 36 20 7b 0a 20 20 20 20 20 20 uint16 {.
0bc0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 set va
0bd0: 6c 75 65 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 lue [expr {$valu
0be0: 65 20 26 20 30 78 46 46 46 46 7d 5d 0a 20 20 20 e & 0xFFFF}].
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 if
0c00: 7b 24 76 61 6c 75 65 20 3c 20 32 35 36 7d 20 7b {$value < 256} {
0c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0c20: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
0c30: 20 5b 6d 79 20 70 61 63 6b 20 75 69 6e 74 38 20 [my pack uint8
0c40: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 $value].
0c50: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b } else {
0c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0c70: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
0c80: 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 75 69 [my pack fix_ui
0c90: 6e 74 31 36 20 24 76 61 6c 75 65 5d 0a 20 20 20 nt16 $value].
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 }.
0cb0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
0cc0: 20 20 20 20 20 20 20 20 20 75 69 6e 74 33 32 20 uint32
0cd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
0ce0: 20 20 73 65 74 20 76 61 6c 75 65 20 5b 65 78 70 set value [exp
0cf0: 72 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 r {$value & 0xFF
0d00: 46 46 46 46 46 46 7d 5d 0a 20 20 20 20 20 20 20 FFFFFF}].
0d10: 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 61 if {$va
0d20: 6c 75 65 20 3c 20 36 35 35 33 36 7d 20 7b 0a 20 lue < 65536} {.
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d40: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b append data [
0d50: 6d 79 20 70 61 63 6b 20 69 6e 74 31 36 20 24 76 my pack int16 $v
0d60: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 alue].
0d70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 } else {.
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d90: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b append data [
0da0: 6d 79 20 70 61 63 6b 20 66 69 78 5f 75 69 6e 74 my pack fix_uint
0db0: 33 32 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 32 $value].
0dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
0dd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
0de0: 20 20 20 20 20 20 20 75 69 6e 74 36 34 20 7b 0a uint64 {.
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0e00: 73 65 74 20 76 61 6c 75 65 20 5b 65 78 70 72 20 set value [expr
0e10: 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 46 46 {$value & 0xFFFF
0e20: 46 46 46 46 46 46 46 46 46 46 46 46 7d 5d 0a 20 FFFFFFFFFFFF}].
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
0e40: 66 20 7b 24 76 61 6c 75 65 20 3c 20 34 32 39 34 f {$value < 4294
0e50: 39 36 37 32 39 36 7d 20 7b 0a 20 20 20 20 20 20 967296} {.
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 ap
0e70: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 pend data [my pa
0e80: 63 6b 20 69 6e 74 33 32 20 24 76 61 6c 75 65 5d ck int32 $value]
0e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0ea0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 } else {.
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 ap
0ec0: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 pend data [my pa
0ed0: 63 6b 20 66 69 78 5f 75 69 6e 74 36 34 20 24 76 ck fix_uint64 $v
0ee0: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 alue].
0ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
0f00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
0f10: 20 20 66 69 78 5f 65 78 74 31 20 7b 0a 20 20 20 fix_ext1 {.
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 24 # $
0f30: 76 61 6c 75 65 20 69 73 20 74 68 65 20 65 78 74 value is the ext
0f40: 65 6e 73 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 ension type and
0f50: 24 76 61 6c 75 65 31 20 69 73 20 74 68 65 20 62 $value1 is the b
0f60: 79 74 65 20 61 72 72 61 79 2e 0a 20 20 20 20 20 yte array..
0f70: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e appen
0f80: 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 d data [binary f
0f90: 6f 72 6d 61 74 20 63 63 61 31 20 30 78 44 34 20 ormat cca1 0xD4
0fa0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 \.
0fb0: 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 76 61 [expr {$va
0fc0: 6c 75 65 20 26 20 30 78 46 46 7d 5d 20 5c 0a 20 lue & 0xFF}] \.
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0fe0: 20 20 20 24 76 61 6c 75 65 31 0a 20 20 20 20 20 $value1.
0ff0: 20 20 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 ].
1000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
1010: 20 20 20 20 20 20 20 66 69 78 5f 65 78 74 32 20 fix_ext2
1020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
1030: 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 append data [b
1040: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 63 61 inary format cca
1050: 32 20 30 78 44 35 20 5c 0a 20 20 20 20 20 20 20 2 0xD5 \.
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 [ex
1070: 70 72 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 pr {$value & 0xF
1080: 46 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 F}] \.
1090: 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65 $value
10a0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1.
10b0: 20 20 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ].
10c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 }. fi
10d0: 78 5f 65 78 74 34 20 7b 0a 20 20 20 20 20 20 20 x_ext4 {.
10e0: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 append
10f0: 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 data [binary for
1100: 6d 61 74 20 63 63 61 34 20 30 78 44 36 20 5c 0a mat cca4 0xD6 \.
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1120: 20 20 20 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 [expr {$valu
1130: 65 20 26 20 30 78 46 46 7d 5d 20 5c 0a 20 20 20 e & 0xFF}] \.
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1150: 20 24 76 61 6c 75 65 31 0a 20 20 20 20 20 20 20 $value1.
1160: 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20 ].
1170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
1180: 20 20 20 20 20 66 69 78 5f 65 78 74 38 20 7b 0a fix_ext8 {.
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11a0: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e append data [bin
11b0: 61 72 79 20 66 6f 72 6d 61 74 20 63 63 61 38 20 ary format cca8
11c0: 30 78 44 37 20 5c 0a 20 20 20 20 20 20 20 20 20 0xD7 \.
11d0: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 [expr
11e0: 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 7d {$value & 0xFF}
11f0: 5d 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ] \.
1200: 20 20 20 20 20 20 20 20 24 76 61 6c 75 65 31 0a $value1.
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1220: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a ]. }.
1230: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 78 5f fix_
1240: 65 78 74 31 36 20 7b 0a 20 20 20 20 20 20 20 20 ext16 {.
1250: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 append d
1260: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d ata [binary form
1270: 61 74 20 63 63 61 31 36 20 30 78 44 38 20 5c 0a at cca16 0xD8 \.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 20 20 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 [expr {$valu
12a0: 65 20 26 20 30 78 46 46 7d 5d 20 5c 0a 20 20 20 e & 0xFF}] \.
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12c0: 20 24 76 61 6c 75 65 31 0a 20 20 20 20 20 20 20 $value1.
12d0: 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 20 20 ].
12e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
12f0: 20 20 20 20 20 66 69 78 5f 69 6e 74 38 20 7b 20 fix_int8 {
1300: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e append data [bin
1310: 61 72 79 20 66 6f 72 6d 61 74 20 63 63 20 30 78 ary format cc 0x
1320: 44 30 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 65 D0 [expr {$value
1330: 20 26 20 30 78 46 46 7d 5d 5d 20 7d 0a 20 20 20 & 0xFF}]] }.
1340: 20 20 20 20 20 20 20 20 20 66 69 78 5f 69 6e 74 fix_int
1350: 31 36 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 16 { append data
1360: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
1370: 63 53 20 30 78 44 31 20 5b 65 78 70 72 20 7b 24 cS 0xD1 [expr {$
1380: 76 61 6c 75 65 20 26 20 30 78 46 46 46 46 7d 5d value & 0xFFFF}]
1390: 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ] }.
13a0: 66 69 78 5f 69 6e 74 33 32 20 7b 20 61 70 70 65 fix_int32 { appe
13b0: 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 nd data [binary
13c0: 66 6f 72 6d 61 74 20 63 49 20 30 78 44 32 20 5b format cI 0xD2 [
13d0: 65 78 70 72 20 7b 24 76 61 6c 75 65 20 26 20 30 expr {$value & 0
13e0: 78 46 46 46 46 46 46 46 46 7d 5d 5d 20 7d 0a 20 xFFFFFFFF}]] }.
13f0: 20 20 20 20 20 20 20 20 20 20 20 66 69 78 5f 69 fix_i
1400: 6e 74 36 34 20 7b 20 61 70 70 65 6e 64 20 64 61 nt64 { append da
1410: 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 ta [binary forma
1420: 74 20 63 57 20 30 78 44 33 20 5b 65 78 70 72 20 t cW 0xD3 [expr
1430: 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 46 46 {$value & 0xFFFF
1440: 46 46 46 46 46 46 46 46 46 46 46 46 7d 5d 5d 20 FFFFFFFFFFFF}]]
1450: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 }. fi
1460: 78 5f 75 69 6e 74 38 20 7b 20 61 70 70 65 6e 64 x_uint8 { append
1470: 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f data [binary fo
1480: 72 6d 61 74 20 63 63 20 30 78 43 43 20 5b 65 78 rmat cc 0xCC [ex
1490: 70 72 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 pr {$value & 0xF
14a0: 46 7d 5d 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 F}]] }.
14b0: 20 20 20 66 69 78 5f 75 69 6e 74 31 36 20 7b 20 fix_uint16 {
14c0: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e append data [bin
14d0: 61 72 79 20 66 6f 72 6d 61 74 20 63 53 20 30 78 ary format cS 0x
14e0: 43 44 20 5b 65 78 70 72 20 7b 24 76 61 6c 75 65 CD [expr {$value
14f0: 20 26 20 30 78 46 46 46 46 7d 5d 5d 20 7d 0a 20 & 0xFFFF}]] }.
1500: 20 20 20 20 20 20 20 20 20 20 20 66 69 78 5f 75 fix_u
1510: 69 6e 74 33 32 20 7b 20 61 70 70 65 6e 64 20 64 int32 { append d
1520: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d ata [binary form
1530: 61 74 20 63 49 20 30 78 43 45 20 5b 65 78 70 72 at cI 0xCE [expr
1540: 20 7b 24 76 61 6c 75 65 20 26 20 30 78 46 46 46 {$value & 0xFFF
1550: 46 46 46 46 46 7d 5d 5d 20 7d 0a 20 20 20 20 20 FFFFF}]] }.
1560: 20 20 20 20 20 20 20 66 69 78 5f 75 69 6e 74 36 fix_uint6
1570: 34 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 20 4 { append data
1580: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 [binary format c
1590: 57 20 30 78 43 46 20 5b 65 78 70 72 20 7b 24 76 W 0xCF [expr {$v
15a0: 61 6c 75 65 20 26 20 30 78 46 46 46 46 46 46 46 alue & 0xFFFFFFF
15b0: 46 46 46 46 46 46 46 46 46 7d 5d 5d 20 7d 0a 20 FFFFFFFFF}]] }.
15c0: 20 20 20 20 20 20 20 20 20 20 20 66 6c 6f 61 74 float
15d0: 33 32 20 7b 20 61 70 70 65 6e 64 20 64 61 74 61 32 { append data
15e0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
15f0: 63 52 20 30 78 43 41 20 24 76 61 6c 75 65 5d 20 cR 0xCA $value]
1600: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6c }. fl
1610: 6f 61 74 36 34 20 7b 20 61 70 70 65 6e 64 20 64 oat64 { append d
1620: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d ata [binary form
1630: 61 74 20 63 51 20 30 78 43 42 20 24 76 61 6c 75 at cQ 0xCB $valu
1640: 65 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 e] }.
1650: 20 6e 69 6c 20 7b 20 61 70 70 65 6e 64 20 64 61 nil { append da
1660: 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 ta [binary forma
1670: 74 20 63 20 30 78 43 30 5d 20 7d 0a 20 20 20 20 t c 0xC0] }.
1680: 20 20 20 20 20 20 20 20 74 72 75 65 20 7b 20 61 true { a
1690: 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 ppend data [bina
16a0: 72 79 20 66 6f 72 6d 61 74 20 63 20 30 78 43 33 ry format c 0xC3
16b0: 5d 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ] }.
16c0: 66 61 6c 73 65 20 7b 20 61 70 70 65 6e 64 20 64 false { append d
16d0: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d ata [binary form
16e0: 61 74 20 63 20 30 78 43 32 5d 20 7d 0a 20 20 20 at c 0xC2] }.
16f0: 20 20 20 20 20 20 20 20 20 61 72 72 61 79 20 7b array {
1700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1710: 20 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 36 if {$value < 16
1720: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
1730: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 append d
1740: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d ata [binary form
1750: 61 74 20 63 20 5b 65 78 70 72 20 7b 30 78 39 30 at c [expr {0x90
1760: 20 7c 20 24 76 61 6c 75 65 7d 5d 5d 0a 20 20 20 | $value}]].
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 } e
1780: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 lseif {$value <
1790: 36 35 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20 65536} {.
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 app
17b0: 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 end data [binary
17c0: 20 66 6f 72 6d 61 74 20 63 53 20 30 78 44 43 20 format cS 0xDC
17d0: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 $value].
17e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b } else {
17f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1800: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
1810: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
1820: 63 49 20 30 78 44 44 20 24 76 61 6c 75 65 5d 0a cI 0xDD $value].
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1840: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }. }.
1850: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73 74 list
1860: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
1870: 20 20 20 73 65 74 20 72 20 5b 6d 79 20 70 61 63 set r [my pac
1880: 6b 20 61 72 72 61 79 20 5b 6c 6c 65 6e 67 74 68 k array [llength
1890: 20 24 76 61 6c 75 65 31 5d 5d 0a 20 20 20 20 20 $value1]].
18a0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 forea
18b0: 63 68 20 65 20 24 76 61 6c 75 65 31 20 7b 0a 20 ch e $value1 {.
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18d0: 20 20 20 61 70 70 65 6e 64 20 72 20 5b 6d 79 20 append r [my
18e0: 70 61 63 6b 20 24 76 61 6c 75 65 20 24 65 5d 0a pack $value $e].
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1900: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 }.
1910: 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 24 72 append data $r
1920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
1930: 20 20 20 20 20 20 20 20 20 20 20 6d 61 70 20 7b map {
1940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1950: 20 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 31 36 if {$value < 16
1960: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
1970: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 append d
1980: 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d ata [binary form
1990: 61 74 20 63 20 5b 65 78 70 72 20 7b 30 78 38 30 at c [expr {0x80
19a0: 20 7c 20 24 76 61 6c 75 65 7d 5d 5d 0a 20 20 20 | $value}]].
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 } e
19c0: 6c 73 65 69 66 20 7b 24 76 61 6c 75 65 20 3c 20 lseif {$value <
19d0: 36 35 35 33 36 7d 20 7b 0a 20 20 20 20 20 20 20 65536} {.
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 app
19f0: 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 end data [binary
1a00: 20 66 6f 72 6d 61 74 20 63 53 20 30 78 44 45 20 format cS 0xDE
1a10: 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 $value].
1a20: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b } else {
1a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1a40: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
1a50: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
1a60: 63 49 20 30 78 44 46 20 24 76 61 6c 75 65 5d 0a cI 0xDF $value].
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a80: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }. }.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 74 63 6c 5f tcl_
1aa0: 61 72 72 61 79 20 7b 0a 20 20 20 20 20 20 20 20 array {.
1ab0: 20 20 20 20 20 20 20 20 75 70 76 61 72 20 24 76 upvar $v
1ac0: 61 6c 75 65 32 20 61 0a 20 20 20 20 20 20 20 20 alue2 a.
1ad0: 20 20 20 20 20 20 20 20 73 65 74 20 72 20 5b 6d set r [m
1ae0: 79 20 70 61 63 6b 20 6d 61 70 20 5b 61 72 72 61 y pack map [arra
1af0: 79 20 73 69 7a 65 20 61 5d 5d 0a 20 20 20 20 20 y size a]].
1b00: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 forea
1b10: 63 68 20 6b 20 5b 6c 73 6f 72 74 20 2d 64 69 63 ch k [lsort -dic
1b20: 74 69 6f 6e 61 72 79 20 5b 61 72 72 61 79 20 6e tionary [array n
1b30: 61 6d 65 73 20 61 5d 5d 20 7b 0a 20 20 20 20 20 ames a]] {.
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
1b50: 70 70 65 6e 64 20 72 20 5b 6d 79 20 70 61 63 6b ppend r [my pack
1b60: 20 24 76 61 6c 75 65 20 24 6b 5d 0a 20 20 20 20 $value $k].
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b80: 61 70 70 65 6e 64 20 72 20 5b 6d 79 20 70 61 63 append r [my pac
1b90: 6b 20 24 76 61 6c 75 65 31 20 24 61 28 24 6b 29 k $value1 $a($k)
1ba0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
1bb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
1bc0: 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 append data
1bd0: 24 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d $r. }
1be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 . dic
1bf0: 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 t {.
1c00: 20 20 20 20 73 65 74 20 72 20 5b 6d 79 20 70 61 set r [my pa
1c10: 63 6b 20 6d 61 70 20 5b 64 69 63 74 20 73 69 7a ck map [dict siz
1c20: 65 20 24 76 61 6c 75 65 32 5d 5d 0a 20 20 20 20 e $value2]].
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 63 74 dict
1c40: 20 66 6f 72 20 7b 6b 20 76 7d 20 24 76 61 6c 75 for {k v} $valu
1c50: 65 32 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 e2 {.
1c60: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 append
1c70: 72 20 5b 6d 79 20 70 61 63 6b 20 24 76 61 6c 75 r [my pack $valu
1c80: 65 20 24 6b 5d 0a 20 20 20 20 20 20 20 20 20 20 e $k].
1c90: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 append
1ca0: 20 72 20 5b 6d 79 20 70 61 63 6b 20 24 76 61 6c r [my pack $val
1cb0: 75 65 31 20 24 76 5d 0a 20 20 20 20 20 20 20 20 ue1 $v].
1cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
1cd0: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 append
1ce0: 20 64 61 74 61 20 24 72 0a 20 20 20 20 20 20 20 data $r.
1cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
1d00: 20 20 20 62 69 6e 20 7b 0a 20 20 20 20 20 20 20 bin {.
1d10: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 5b set n [
1d20: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 string length $v
1d30: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 alue].
1d40: 20 20 20 20 20 20 69 66 20 7b 24 6e 20 3c 20 32 if {$n < 2
1d50: 35 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 56} {.
1d60: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 append
1d70: 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 6f data [binary fo
1d80: 72 6d 61 74 20 63 63 61 2a 20 30 78 43 34 20 24 rmat cca* 0xC4 $
1d90: 6e 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 20 n $value].
1da0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 } else
1db0: 69 66 20 7b 24 6e 20 3c 20 36 35 35 33 36 7d 20 if {$n < 65536}
1dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
1dd0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 append dat
1de0: 61 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 a [binary format
1df0: 20 63 53 61 2a 20 30 78 43 35 20 24 6e 20 24 76 cSa* 0xC5 $n $v
1e00: 61 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 alue].
1e10: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 } else {.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e30: 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b append data [
1e40: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 49 binary format cI
1e50: 61 2a 20 30 78 43 36 20 24 6e 20 24 76 61 6c 75 a* 0xC6 $n $valu
1e60: 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e].
1e70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
1e80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 }. s
1e90: 74 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 tr {.
1ea0: 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b set value [
1eb0: 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 74 encoding convert
1ec0: 74 6f 20 75 74 66 2d 38 20 24 76 61 6c 75 65 5d to utf-8 $value]
1ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1ee0: 20 73 65 74 20 6e 20 5b 73 74 72 69 6e 67 20 6c set n [string l
1ef0: 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 0a 20 20 ength $value].
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 if
1f10: 20 7b 24 6e 20 3c 20 33 32 7d 20 7b 0a 20 20 20 {$n < 32} {.
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f30: 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 append data [bi
1f40: 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 61 2a 20 nary format ca*
1f50: 5b 65 78 70 72 20 7b 30 78 41 30 20 7c 20 24 6e [expr {0xA0 | $n
1f60: 7d 5d 20 24 76 61 6c 75 65 5d 0a 20 20 20 20 20 }] $value].
1f70: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 } els
1f80: 65 69 66 20 7b 24 6e 20 3c 20 32 35 36 7d 20 7b eif {$n < 256} {
1f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1fa0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
1fb0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
1fc0: 63 63 61 2a 20 30 78 44 39 20 24 6e 20 24 76 61 cca* 0xD9 $n $va
1fd0: 6c 75 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 lue].
1fe0: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 } elseif {$
1ff0: 6e 20 3c 20 36 35 35 33 36 7d 20 7b 0a 20 20 20 n < 65536} {.
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2010: 20 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 append data [bi
2020: 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 53 61 2a nary format cSa*
2030: 20 30 78 44 41 20 24 6e 20 24 76 61 6c 75 65 5d 0xDA $n $value]
2040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2050: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 } else {.
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 ap
2070: 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e 61 72 pend data [binar
2080: 79 20 66 6f 72 6d 61 74 20 63 49 61 2a 20 30 78 y format cIa* 0x
2090: 44 42 20 24 6e 20 24 76 61 6c 75 65 5d 0a 20 20 DB $n $value].
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }.
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 }.
20c0: 20 20 20 20 20 20 20 20 20 20 65 78 74 20 7b 0a ext {.
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20e0: 23 20 24 76 61 6c 75 65 20 69 73 20 74 68 65 20 # $value is the
20f0: 65 78 74 65 6e 73 69 6f 6e 20 74 79 70 65 20 61 extension type a
2100: 6e 64 20 24 76 61 6c 75 65 31 20 69 73 20 74 68 nd $value1 is th
2110: 65 20 62 79 74 65 20 61 72 72 61 79 2e 0a 20 20 e byte array..
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 se
2130: 74 20 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 t n [string leng
2140: 74 68 20 24 76 61 6c 75 65 31 5d 0a 20 20 20 20 th $value1].
2150: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b if {
2160: 24 6e 20 3c 20 32 35 36 7d 20 7b 0a 20 20 20 20 $n < 256} {.
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2180: 61 70 70 65 6e 64 20 64 61 74 61 20 5b 62 69 6e append data [bin
2190: 61 72 79 20 66 6f 72 6d 61 74 20 63 63 63 61 2a ary format ccca*
21a0: 20 30 78 43 37 20 24 6e 20 24 76 61 6c 75 65 20 0xC7 $n $value
21b0: 24 76 61 6c 75 65 31 5d 0a 20 20 20 20 20 20 20 $value1].
21c0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 } elsei
21d0: 66 20 7b 24 6e 20 3c 20 36 35 35 33 36 7d 20 7b f {$n < 65536} {
21e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
21f0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
2200: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
2210: 63 53 63 61 2a 20 30 78 43 38 20 24 6e 20 24 76 cSca* 0xC8 $n $v
2220: 61 6c 75 65 20 24 76 61 6c 75 65 31 5d 0a 20 20 alue $value1].
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 }
2240: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 else {.
2250: 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e appen
2260: 64 20 64 61 74 61 20 5b 62 69 6e 61 72 79 20 66 d data [binary f
2270: 6f 72 6d 61 74 20 63 49 63 61 2a 20 30 78 43 39 ormat cIca* 0xC9
2280: 20 24 6e 20 24 76 61 6c 75 65 20 24 76 61 6c 75 $n $value $valu
2290: 65 31 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 e1].
22a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
22b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
22c0: 74 69 6d 65 73 74 61 6d 70 33 32 20 7b 0a 20 20 timestamp32 {.
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 ap
22e0: 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 61 pend data [my pa
22f0: 63 6b 20 66 69 78 5f 65 78 74 34 20 2d 31 20 5b ck fix_ext4 -1 [
2300: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 20 binary format I
2310: 5b 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20 [expr {.
2320: 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c $val
2330: 75 65 20 26 20 30 78 46 46 46 46 46 46 46 46 0a ue & 0xFFFFFFFF.
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2350: 7d 5d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 }]]].
2360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 }. t
2370: 69 6d 65 73 74 61 6d 70 36 34 20 7b 0a 20 20 20 imestamp64 {.
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 24 # $
2390: 76 61 6c 75 65 20 69 73 20 73 65 63 6f 6e 64 73 value is seconds
23a0: 20 28 33 34 20 62 69 74 73 20 75 6e 73 69 67 6e (34 bits unsign
23b0: 65 64 29 2c 20 24 76 61 6c 75 65 31 20 69 73 20 ed), $value1 is
23c0: 6e 61 6e 6f 73 65 63 6f 6e 64 73 0a 20 20 20 20 nanoseconds.
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 28 33 # (3
23e0: 30 20 62 69 74 73 20 75 6e 73 69 67 6e 65 64 29 0 bits unsigned)
23f0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
2400: 20 20 69 66 20 7b 24 76 61 6c 75 65 31 20 3e 20 if {$value1 >
2410: 39 39 39 39 39 39 39 39 39 7d 20 7b 20 65 72 72 999999999} { err
2420: 6f 72 20 7b 6e 61 6e 6f 73 65 63 6f 6e 64 73 20 or {nanoseconds
2430: 65 78 63 65 65 64 20 39 39 39 39 39 39 39 39 39 exceed 999999999
2440: 7d 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 } }..
2450: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
2460: 20 5b 6d 79 20 70 61 63 6b 20 66 69 78 5f 65 78 [my pack fix_ex
2470: 74 38 20 2d 31 20 5b 62 69 6e 61 72 79 20 66 6f t8 -1 [binary fo
2480: 72 6d 61 74 20 57 20 5b 65 78 70 72 20 7b 0a 20 rmat W [expr {.
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24a0: 20 20 20 28 28 24 76 61 6c 75 65 31 20 3c 3c 20 (($value1 <<
24b0: 33 34 29 20 7c 20 24 76 61 6c 75 65 29 20 26 20 34) | $value) &
24c0: 30 78 46 46 46 46 46 46 46 46 46 46 46 46 46 46 0xFFFFFFFFFFFFFF
24d0: 46 46 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 FF.
24e0: 20 20 20 7d 5d 5d 5d 0a 20 20 20 20 20 20 20 20 }]]].
24f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
2500: 20 20 74 69 6d 65 73 74 61 6d 70 39 36 20 7b 0a timestamp96 {.
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2520: 23 20 24 76 61 6c 75 65 20 69 73 20 73 65 63 6f # $value is seco
2530: 6e 64 73 20 28 36 34 20 62 69 74 73 20 73 69 67 nds (64 bits sig
2540: 6e 65 64 29 2c 20 24 76 61 6c 75 65 31 20 69 73 ned), $value1 is
2550: 20 6e 61 6e 6f 73 65 63 6f 6e 64 73 0a 20 20 20 nanoseconds.
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 28 # (
2570: 33 32 20 62 69 74 73 20 75 6e 73 69 67 6e 65 64 32 bits unsigned
2580: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ).
2590: 20 20 69 66 20 7b 24 76 61 6c 75 65 31 20 3e 20 if {$value1 >
25a0: 39 39 39 39 39 39 39 39 39 7d 20 7b 20 65 72 72 999999999} { err
25b0: 6f 72 20 7b 6e 61 6e 6f 73 65 63 6f 6e 64 73 20 or {nanoseconds
25c0: 65 78 63 65 65 64 20 39 39 39 39 39 39 39 39 39 exceed 999999999
25d0: 7d 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 } }..
25e0: 20 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 append data
25f0: 20 5b 6d 79 20 70 61 63 6b 20 65 78 74 20 2d 31 [my pack ext -1
2600: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 [binary format
2610: 49 57 20 5b 65 78 70 72 20 7b 0a 20 20 20 20 20 IW [expr {.
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 $
2630: 76 61 6c 75 65 31 20 26 20 30 78 46 46 46 46 46 value1 & 0xFFFFF
2640: 46 46 46 0a 20 20 20 20 20 20 20 20 20 20 20 20 FFF.
2650: 20 20 20 20 7d 5d 20 24 76 61 6c 75 65 5d 5d 0a }] $value]].
2660: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 }.
2670: 20 20 20 20 20 20 20 20 20 20 6d 69 6c 6c 69 73 millis
2680: 65 63 6f 6e 64 73 20 7b 0a 20 20 20 20 20 20 20 econds {.
2690: 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 append
26a0: 64 61 74 61 20 5b 6d 79 20 70 61 63 6b 20 74 69 data [my pack ti
26b0: 6d 65 73 74 61 6d 70 39 36 20 5b 65 78 70 72 20 mestamp96 [expr
26c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
26d0: 20 20 20 20 20 20 72 6f 75 6e 64 28 24 76 61 6c round($val
26e0: 75 65 20 2f 20 31 30 30 30 29 0a 20 20 20 20 20 ue / 1000).
26f0: 20 20 20 20 20 20 20 20 20 20 20 7d 5d 20 5b 65 }] [e
2700: 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 xpr {.
2710: 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 65 $value
2720: 20 25 20 31 30 30 30 20 2a 20 31 30 30 30 30 30 % 1000 * 100000
2730: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0.
2740: 20 20 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 }]].
2750: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
2760: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 7b 0a 20 microseconds {.
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
2780: 70 70 65 6e 64 20 64 61 74 61 20 5b 6d 79 20 70 ppend data [my p
2790: 61 63 6b 20 74 69 6d 65 73 74 61 6d 70 39 36 20 ack timestamp96
27a0: 5b 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20 [expr {.
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 75 6e roun
27c0: 64 28 24 76 61 6c 75 65 20 2f 20 31 30 30 30 30 d($value / 10000
27d0: 30 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 00).
27e0: 20 20 20 20 7d 5d 20 5b 65 78 70 72 20 7b 0a 20 }] [expr {.
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2800: 20 20 20 24 76 61 6c 75 65 20 25 20 31 30 30 30 $value % 1000
2810: 30 30 30 20 2a 20 31 30 30 30 0a 20 20 20 20 20 000 * 1000.
2820: 20 20 20 20 20 20 20 20 20 20 20 7d 5d 5d 0a 20 }]].
2830: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
2840: 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 default
2850: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
2860: 20 20 20 65 72 72 6f 72 20 5b 6c 69 73 74 20 75 error [list u
2870: 6e 6b 6e 6f 77 6e 20 74 79 70 65 3a 20 24 74 79 nknown type: $ty
2880: 70 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 pe].
2890: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
28a0: 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20 7d return. }
28b0: 0a 7d 0a 0a 6f 6f 3a 3a 63 6c 61 73 73 20 63 72 .}..oo::class cr
28c0: 65 61 74 65 20 6d 73 67 70 61 63 6b 3a 3a 75 6e eate msgpack::un
28d0: 70 61 63 6b 65 72 20 7b 0a 0a 20 20 20 20 76 61 packer {.. va
28e0: 72 69 61 62 6c 65 20 64 61 74 61 20 73 74 72 65 riable data stre
28f0: 61 6d 20 63 61 6c 6c 62 61 63 6b 20 63 6f 72 6f am callback coro
2900: 20 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 0a 0a ext_unpackers..
2910: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 constructor
2920: 7b 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 {} {. set
2930: 20 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 7b ext_unpackers {
2940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 20 . -1
2950: 7b 61 70 70 6c 79 20 7b 7b 74 79 70 65 20 64 61 {apply {{type da
2960: 74 61 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 ta} {.
2970: 20 20 20 20 20 20 73 65 74 20 6c 65 6e 20 5b 73 set len [s
2980: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 tring length $da
2990: 74 61 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 ta].
29a0: 20 20 20 20 69 66 20 7b 24 6c 65 6e 20 3d 3d 20 if {$len ==
29b0: 34 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 4} {.
29c0: 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 binary
29d0: 73 63 61 6e 20 24 64 61 74 61 20 49 20 73 0a 20 scan $data I s.
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29f0: 20 20 20 73 65 74 20 73 20 5b 65 78 70 72 20 7b set s [expr {
2a00: 20 24 73 20 26 20 30 78 46 46 46 46 46 46 46 46 $s & 0xFFFFFFFF
2a10: 20 7d 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 }]..
2a20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
2a30: 5b 6c 69 73 74 20 74 69 6d 65 73 74 61 6d 70 20 [list timestamp
2a40: 24 73 20 30 5d 0a 20 20 20 20 20 20 20 20 20 20 $s 0].
2a50: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b } elseif {
2a60: 24 6c 65 6e 20 3d 3d 20 38 7d 20 7b 0a 20 20 20 $len == 8} {.
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a80: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 binary scan $da
2a90: 74 61 20 57 20 74 0a 20 20 20 20 20 20 20 20 20 ta W t.
2aa0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 set t
2ab0: 20 5b 65 78 70 72 20 7b 20 24 74 20 26 20 30 78 [expr { $t & 0x
2ac0: 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 FFFFFFFFFFFFFFFF
2ad0: 20 7d 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 }]..
2ae0: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 73 20 set ns
2af0: 5b 65 78 70 72 20 7b 20 24 74 20 3e 3e 20 33 34 [expr { $t >> 34
2b00: 20 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }].
2b10: 20 20 20 20 20 20 20 20 73 65 74 20 73 20 5b 65 set s [e
2b20: 78 70 72 20 7b 20 24 74 20 26 20 30 58 30 30 30 xpr { $t & 0X000
2b30: 30 30 30 30 33 46 46 46 46 46 46 46 46 20 7d 5d 00003FFFFFFFF }]
2b40: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
2b50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 return [li
2b60: 73 74 20 74 69 6d 65 73 74 61 6d 70 20 24 73 20 st timestamp $s
2b70: 24 6e 73 5d 0a 20 20 20 20 20 20 20 20 20 20 20 $ns].
2b80: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 } elseif {$
2b90: 6c 65 6e 20 3d 3d 20 31 32 7d 20 7b 0a 20 20 20 len == 12} {.
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bb0: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 binary scan $da
2bc0: 74 61 20 49 57 20 6e 73 20 73 0a 0a 20 20 20 20 ta IW ns s..
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2be0: 73 65 74 20 6e 73 20 5b 65 78 70 72 20 7b 20 24 set ns [expr { $
2bf0: 6e 73 20 26 20 30 78 46 46 46 46 46 46 46 46 46 ns & 0xFFFFFFFFF
2c00: 46 46 46 46 46 46 46 20 7d 5d 0a 20 20 20 20 20 FFFFFFF }].
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
2c20: 65 74 75 72 6e 20 5b 6c 69 73 74 20 74 69 6d 65 eturn [list time
2c30: 73 74 61 6d 70 20 24 73 20 24 6e 73 5d 0a 20 20 stamp $s $ns].
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 }
2c50: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 else {.
2c60: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 error
2c70: 20 5b 6c 69 73 74 20 63 61 6e 27 74 20 64 65 63 [list can't dec
2c80: 6f 64 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 66 ode timestamp of
2c90: 20 6c 65 6e 67 74 68 20 24 6c 65 6e 5d 0a 20 20 length $len].
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a }.
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 7d 7d 0a }}}.
2cc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }.
2cd0: 0a 20 20 20 20 64 65 73 74 72 75 63 74 6f 72 20 . destructor
2ce0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 {. if {[i
2cf0: 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 72 6f 5d nfo exists coro]
2d00: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
2d10: 72 65 6e 61 6d 65 20 24 63 6f 72 6f 20 7b 7d 0a rename $coro {}.
2d20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }.
2d30: 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 65 74 5f . method set_
2d40: 65 78 74 5f 75 6e 70 61 63 6b 65 72 20 61 72 67 ext_unpacker arg
2d50: 73 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 73 s {. lass
2d60: 69 67 6e 20 24 61 72 67 73 20 74 79 70 65 20 73 ign $args type s
2d70: 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 73 77 cript. sw
2d80: 69 74 63 68 20 5b 6c 6c 65 6e 67 74 68 20 24 61 itch [llength $a
2d90: 72 67 73 5d 20 7b 0a 20 20 20 20 20 20 20 20 20 rgs] {.
2da0: 20 20 20 30 20 7b 20 72 65 74 75 72 6e 20 24 65 0 { return $e
2db0: 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 7d 0a 20 xt_unpackers }.
2dc0: 20 20 20 20 20 20 20 20 20 20 20 31 20 7b 20 72 1 { r
2dd0: 65 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 eturn [dict get
2de0: 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 24 $ext_unpackers $
2df0: 74 79 70 65 5d 20 7d 0a 20 20 20 20 20 20 20 20 type] }.
2e00: 20 20 20 20 32 20 7b 0a 20 20 20 20 20 20 20 20 2 {.
2e10: 20 20 20 20 20 20 20 20 64 69 63 74 20 73 65 74 dict set
2e20: 20 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 20 24 ext_unpackers $
2e30: 74 79 70 65 20 24 73 63 72 69 70 74 0a 20 20 20 type $script.
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 ret
2e50: 75 72 6e 20 7b 7d 0a 20 20 20 20 20 20 20 20 20 urn {}.
2e60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
2e70: 20 64 65 66 61 75 6c 74 20 7b 0a 20 20 20 20 20 default {.
2e80: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 error
2e90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 "wrong # args:
2ea0: 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20 should be.
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ec0: 20 5c 22 73 65 74 5f 65 78 74 5f 75 6e 70 61 63 \"set_ext_unpac
2ed0: 6b 65 72 20 3f 74 79 70 65 3f 20 3f 73 63 72 69 ker ?type? ?scri
2ee0: 70 74 3f 5c 22 22 0a 20 20 20 20 20 20 20 20 20 pt?\"".
2ef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
2f00: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
2f10: 20 75 6e 70 61 63 6b 5f 65 78 74 20 7b 74 79 70 unpack_ext {typ
2f20: 65 20 64 61 74 61 7d 20 7b 0a 20 20 20 20 20 20 e data} {.
2f30: 20 20 69 66 20 7b 5b 64 69 63 74 20 65 78 69 73 if {[dict exis
2f40: 74 73 20 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 ts $ext_unpacker
2f50: 73 20 24 74 79 70 65 5d 0a 20 20 20 20 20 20 20 s $type].
2f60: 20 20 20 20 20 26 26 20 5b 64 69 63 74 20 67 65 && [dict ge
2f70: 74 20 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 t $ext_unpackers
2f80: 20 24 74 79 70 65 5d 20 6e 65 20 7b 7d 7d 20 7b $type] ne {}} {
2f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
2fa0: 75 72 6e 20 5b 7b 2a 7d 5b 64 69 63 74 20 67 65 urn [{*}[dict ge
2fb0: 74 20 24 65 78 74 5f 75 6e 70 61 63 6b 65 72 73 t $ext_unpackers
2fc0: 20 24 74 79 70 65 5d 20 24 74 79 70 65 20 24 64 $type] $type $d
2fd0: 61 74 61 5d 0a 20 20 20 20 20 20 20 20 7d 0a 0a ata]. }..
2fe0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b return [
2ff0: 6c 69 73 74 20 65 78 74 20 24 74 79 70 65 20 24 list ext $type $
3000: 64 61 74 61 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 data]. }..
3010: 20 6d 65 74 68 6f 64 20 75 6e 70 61 63 6b 5f 73 method unpack_s
3020: 74 72 65 61 6d 20 7b 69 73 74 72 65 61 6d 20 69 tream {istream i
3030: 63 61 6c 6c 62 61 63 6b 7d 20 7b 0a 20 20 20 20 callback} {.
3040: 20 20 20 20 73 65 74 20 63 6f 72 6f 20 3a 3a 6d set coro ::m
3050: 73 67 70 61 63 6b 3a 3a 75 70 73 5b 63 6c 6f 63 sgpack::ups[cloc
3060: 6b 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 5d 0a k milliseconds].
3070: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 set data
3080: 20 22 22 0a 20 20 20 20 20 20 20 20 73 65 74 20 "". set
3090: 73 74 72 65 61 6d 20 24 69 73 74 72 65 61 6d 0a stream $istream.
30a0: 20 20 20 20 20 20 20 20 73 65 74 20 63 61 6c 6c set call
30b0: 62 61 63 6b 20 24 69 63 61 6c 6c 62 61 63 6b 0a back $icallback.
30c0: 20 20 20 20 20 20 20 20 63 6f 72 6f 75 74 69 6e coroutin
30d0: 65 20 24 63 6f 72 6f 20 5b 73 65 6c 66 5d 20 75 e $coro [self] u
30e0: 6e 70 61 63 6b 5f 63 6f 72 6f 20 30 20 31 0a 20 npack_coro 0 1.
30f0: 20 20 20 20 20 20 20 63 68 61 6e 20 63 6f 6e 66 chan conf
3100: 69 67 75 72 65 20 24 73 74 72 65 61 6d 20 2d 62 igure $stream -b
3110: 6c 6f 63 6b 69 6e 67 20 30 20 2d 62 75 66 66 65 locking 0 -buffe
3120: 72 69 6e 67 20 6e 6f 6e 65 20 2d 74 72 61 6e 73 ring none -trans
3130: 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 20 2d 65 lation binary -e
3140: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 0a 20 ncoding binary.
3150: 20 20 20 20 20 20 20 63 68 61 6e 20 65 76 65 6e chan even
3160: 74 20 24 73 74 72 65 61 6d 20 72 65 61 64 61 62 t $stream readab
3170: 6c 65 20 24 63 6f 72 6f 0a 20 20 20 20 7d 0a 0a le $coro. }..
3180: 20 20 20 20 6d 65 74 68 6f 64 20 75 6e 70 61 63 method unpac
3190: 6b 5f 73 74 72 69 6e 67 20 7b 69 64 61 74 61 20 k_string {idata
31a0: 7b 69 63 61 6c 6c 62 61 63 6b 20 7b 7d 7d 7d 20 {icallback {}}}
31b0: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 61 {. set da
31c0: 74 61 20 24 69 64 61 74 61 0a 20 20 20 20 20 20 ta $idata.
31d0: 20 20 73 65 74 20 63 61 6c 6c 62 61 63 6b 20 24 set callback $
31e0: 69 63 61 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 icallback.
31f0: 20 20 73 65 74 20 6c 20 5b 6d 79 20 75 6e 70 61 set l [my unpa
3200: 63 6b 5f 63 6f 72 6f 20 30 20 30 5d 0a 20 20 20 ck_coro 0 0].
3210: 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 if {[llengt
3220: 68 20 24 63 61 6c 6c 62 61 63 6b 5d 20 3d 3d 20 h $callback] ==
3230: 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0} {.
3240: 20 72 65 74 75 72 6e 20 24 6c 0a 20 20 20 20 20 return $l.
3250: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
3260: 6d 65 74 68 6f 64 20 4e 65 65 64 43 6f 72 6f 20 method NeedCoro
3270: 7b 6e 7d 20 7b 0a 20 20 20 20 20 20 20 20 77 68 {n} {. wh
3280: 69 6c 65 20 7b 31 7d 20 7b 0a 20 20 20 20 20 20 ile {1} {.
3290: 20 20 20 20 20 20 23 20 43 61 74 63 68 20 74 68 # Catch th
32a0: 65 20 5b 65 6f 66 5d 20 61 6e 64 20 5b 72 65 61 e [eof] and [rea
32b0: 64 5d 2c 20 73 6f 63 6b 65 74 20 6d 61 79 20 62 d], socket may b
32c0: 65 20 63 6c 6f 73 65 20 61 6c 72 65 61 64 79 2e e close already.
32d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 . cat
32e0: 63 68 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 ch {.
32f0: 20 20 20 20 20 69 66 20 7b 5b 65 6f 66 20 24 73 if {[eof $s
3300: 74 72 65 61 6d 5d 7d 20 7b 0a 20 20 20 20 20 20 tream]} {.
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 2a {*
3320: 7d 24 63 61 6c 6c 62 61 63 6b 20 65 6f 66 20 24 }$callback eof $
3330: 73 74 72 65 61 6d 0a 20 20 20 20 20 20 20 20 20 stream.
3340: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
3350: 6e 20 2d 63 6f 64 65 20 72 65 74 75 72 6e 20 7b n -code return {
3360: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 }.
3370: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
3380: 20 20 20 20 61 70 70 65 6e 64 20 64 61 74 61 20 append data
3390: 5b 72 65 61 64 20 24 73 74 72 65 61 6d 5d 0a 20 [read $stream].
33a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
33b0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 if {[st
33c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 ring length $dat
33d0: 61 5d 20 3e 3d 20 24 6e 7d 20 62 72 65 61 6b 0a a] >= $n} break.
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 79 69 65 6c yiel
33f0: 64 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 d. }.
3400: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 4e 65 }.. method Ne
3410: 65 64 53 74 72 69 6e 67 20 7b 6e 7d 20 7b 0a 20 edString {n} {.
3420: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 if {[stri
3430: 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74 61 5d ng length $data]
3440: 20 3c 20 24 6e 7d 20 7b 0a 20 20 20 20 20 20 20 < $n} {.
3450: 20 20 20 20 20 65 72 72 6f 72 20 22 69 6e 70 75 error "inpu
3460: 74 20 73 74 72 69 6e 67 20 6e 6f 74 20 6c 6f 6e t string not lon
3470: 67 20 65 6e 6f 75 67 68 2c 20 6e 65 65 64 20 24 g enough, need $
3480: 6e 20 62 79 74 65 28 73 29 2c 20 6f 6e 6c 79 20 n byte(s), only
3490: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 [string length $
34a0: 64 61 74 61 5d 20 6c 65 66 74 22 0a 20 20 20 20 data] left".
34b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
34c0: 20 6d 65 74 68 6f 64 20 75 6e 70 61 63 6b 5f 63 method unpack_c
34d0: 6f 72 6f 20 7b 6e 65 73 74 65 64 20 63 6f 72 6f oro {nested coro
34e0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b } {. if {
34f0: 24 63 6f 72 6f 7d 20 7b 0a 20 20 20 20 20 20 20 $coro} {.
3500: 20 20 20 20 20 69 66 20 7b 21 24 6e 65 73 74 65 if {!$neste
3510: 64 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 d} {.
3520: 20 20 20 20 20 23 20 59 69 65 6c 64 20 63 72 65 # Yield cre
3530: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 ation.
3540: 20 20 20 20 20 20 79 69 65 6c 64 0a 20 20 20 20 yield.
3550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
3560: 20 20 20 20 20 20 73 65 74 20 6e 65 65 64 5f 70 set need_p
3570: 72 6f 63 20 4e 65 65 64 43 6f 72 6f 0a 20 20 20 roc NeedCoro.
3580: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 } else {.
3590: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 set ne
35a0: 65 64 5f 70 72 6f 63 20 4e 65 65 64 53 74 72 69 ed_proc NeedStri
35b0: 6e 67 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 ng. }.
35c0: 20 20 20 20 20 73 65 74 20 6c 20 7b 7d 0a 20 20 set l {}.
35d0: 20 20 20 20 20 20 77 68 69 6c 65 20 7b 31 7d 20 while {1}
35e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 {. my
35f0: 20 24 6e 65 65 64 5f 70 72 6f 63 20 31 0a 20 20 $need_proc 1.
3600: 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 binary
3610: 20 73 63 61 6e 20 24 64 61 74 61 20 63 20 63 0a scan $data c c.
3620: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 set
3630: 74 63 20 5b 65 78 70 72 20 7b 24 63 20 26 20 30 tc [expr {$c & 0
3640: 78 46 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 xFF}].
3650: 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 set data [stri
3660: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 31 ng range $data 1
3670: 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 end].
3680: 20 20 69 66 20 7b 24 74 63 20 3c 20 30 78 38 30 if {$tc < 0x80
3690: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
36a0: 20 20 20 20 23 20 50 6f 73 69 74 69 76 65 20 46 # Positive F
36b0: 69 78 4e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 ixNum.
36c0: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 lappend l
36d0: 5b 6c 69 73 74 20 69 6e 74 65 67 65 72 20 5b 65 [list integer [e
36e0: 78 70 72 20 7b 24 63 20 26 20 30 78 37 46 7d 5d xpr {$c & 0x7F}]
36f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 ]. }
3700: 65 6c 73 65 69 66 20 7b 28 24 74 63 20 26 20 30 elseif {($tc & 0
3710: 78 45 30 29 20 3e 3d 20 30 78 45 30 7d 20 7b 0a xE0) >= 0xE0} {.
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3730: 23 20 4e 65 67 61 74 69 76 65 20 46 69 78 4e 75 # Negative FixNu
3740: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m.
3750: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 5b 62 binary scan [b
3760: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 20 5b inary format c [
3770: 65 78 70 72 20 7b 28 24 63 20 26 20 30 78 31 46 expr {($c & 0x1F
3780: 29 20 7c 20 30 78 45 30 7d 5d 5d 20 63 20 63 0a ) | 0xE0}]] c c.
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
37a0: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 lappend l [list
37b0: 69 6e 74 65 67 65 72 20 24 63 5d 0a 20 20 20 20 integer $c].
37c0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 } elseif
37d0: 20 7b 24 74 63 20 3e 3d 20 30 78 38 30 20 26 26 {$tc >= 0x80 &&
37e0: 20 24 74 63 20 3c 3d 20 30 78 38 46 7d 20 7b 0a $tc <= 0x8F} {.
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3800: 23 20 46 69 78 4d 61 70 0a 20 20 20 20 20 20 20 # FixMap.
3810: 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 5b set n [
3820: 65 78 70 72 20 7b 24 74 63 20 26 20 30 78 46 7d expr {$tc & 0xF}
3830: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
3840: 20 20 73 65 74 20 61 20 7b 7d 0a 20 20 20 20 20 set a {}.
3850: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b for {
3860: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 set i 0} {$i < $
3870: 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 n} {incr i} {.
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3890: 20 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b lappend a {*}[
38a0: 6d 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 my unpack_coro 1
38b0: 20 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 $coro].
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 lapp
38d0: 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79 20 75 6e 70 end a {*}[my unp
38e0: 61 63 6b 5f 63 6f 72 6f 20 31 20 24 63 6f 72 6f ack_coro 1 $coro
38f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
3900: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
3910: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c lappend l [l
3920: 69 73 74 20 6d 61 70 20 24 61 5d 0a 20 20 20 20 ist map $a].
3930: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 } elseif
3940: 20 7b 24 74 63 20 3e 3d 20 30 78 39 30 20 26 26 {$tc >= 0x90 &&
3950: 20 24 74 63 20 3c 3d 20 30 78 39 46 7d 20 7b 0a $tc <= 0x9F} {.
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3970: 23 20 46 69 78 41 72 72 61 79 0a 20 20 20 20 20 # FixArray.
3980: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e set n
3990: 20 5b 65 78 70 72 20 7b 24 74 63 20 26 20 30 78 [expr {$tc & 0x
39a0: 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 F}].
39b0: 20 20 20 20 73 65 74 20 61 20 7b 7d 0a 20 20 20 set a {}.
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 for
39d0: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c {set i 0} {$i <
39e0: 20 24 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a $n} {incr i} {.
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3a00: 20 20 20 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a lappend a {*
3a10: 7d 5b 6d 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f }[my unpack_coro
3a20: 20 31 20 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 1 $coro].
3a30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 lapp
3a50: 65 6e 64 20 6c 20 5b 6c 69 73 74 20 61 72 72 61 end l [list arra
3a60: 79 20 24 61 5d 0a 20 20 20 20 20 20 20 20 20 20 y $a].
3a70: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 } elseif {$tc
3a80: 3e 3d 20 30 78 41 30 20 26 26 20 24 74 63 20 3c >= 0xA0 && $tc <
3a90: 3d 20 30 78 42 46 7d 20 7b 0a 20 20 20 20 20 20 = 0xBF} {.
3aa0: 20 20 20 20 20 20 20 20 20 20 23 20 46 69 78 53 # FixS
3ab0: 74 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 tr.
3ac0: 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b set n [expr {
3ad0: 24 74 63 20 26 20 30 78 31 46 7d 5d 0a 20 20 20 $tc & 0x1F}].
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 my
3af0: 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 $need_proc $n.
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 bi
3b10: 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 nary scan $data
3b20: 61 24 6e 20 63 0a 20 20 20 20 20 20 20 20 20 20 a$n c.
3b30: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 lappend l
3b40: 5b 6c 69 73 74 20 73 74 72 20 5b 65 6e 63 6f 64 [list str [encod
3b50: 69 6e 67 20 63 6f 6e 76 65 72 74 66 72 6f 6d 20 ing convertfrom
3b60: 75 74 66 2d 38 20 24 63 5d 5d 0a 20 20 20 20 20 utf-8 $c]].
3b70: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 set d
3b80: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 ata [string rang
3b90: 65 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a e $data $n end].
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c } el
3bb0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 se {.
3bc0: 20 20 20 20 20 69 66 20 7b 24 74 63 20 3d 3d 20 if {$tc ==
3bd0: 30 78 43 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 0xC0} {.
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 6e 69 # ni
3bf0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 l.
3c00: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 lappend l
3c10: 6e 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 nil.
3c20: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 } elseif {$t
3c30: 63 20 3d 3d 20 30 78 43 32 7d 20 7b 0a 20 20 20 c == 0xC2} {.
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3c50: 20 23 20 66 61 6c 73 65 0a 20 20 20 20 20 20 20 # false.
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 lap
3c70: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 62 6f 6f pend l [list boo
3c80: 6c 65 61 6e 20 30 5d 0a 20 20 20 20 20 20 20 20 lean 0].
3c90: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 } elseif
3ca0: 20 7b 24 74 63 20 3d 3d 20 30 78 43 33 7d 20 7b {$tc == 0xC3} {
3cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
3cc0: 20 20 20 20 20 23 20 74 72 75 65 0a 20 20 20 20 # true.
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3ce0: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 lappend l [list
3cf0: 62 6f 6f 6c 65 61 6e 20 31 5d 0a 20 20 20 20 20 boolean 1].
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 } els
3d10: 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 34 eif {$tc == 0xC4
3d20: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
3d30: 20 20 20 20 20 20 20 20 23 20 62 69 6e 20 38 0a # bin 8.
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3d50: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f my $need_pro
3d60: 63 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 c 1.
3d70: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 binary s
3d80: 63 61 6e 20 24 64 61 74 61 20 63 20 6e 0a 20 20 can $data c n.
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3da0: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 set n [expr {$
3db0: 6e 20 26 20 30 78 46 46 7d 5d 0a 20 20 20 20 20 n & 0xFF}].
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
3dd0: 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 et data [string
3de0: 72 61 6e 67 65 20 24 64 61 74 61 20 31 20 65 6e range $data 1 en
3df0: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 d].
3e00: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f my $need_
3e10: 70 72 6f 63 20 24 6e 0a 20 20 20 20 20 20 20 20 proc $n.
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 bina
3e30: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 61 24 ry scan $data a$
3e40: 6e 20 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 n c.
3e50: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 lappend
3e60: 6c 20 5b 6c 69 73 74 20 62 69 6e 20 24 63 5d 0a l [list bin $c].
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3e80: 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 set data [st
3e90: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 ring range $data
3ea0: 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 $n end].
3eb0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 } elsei
3ec0: 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 35 7d 20 f {$tc == 0xC5}
3ed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
3ee0: 20 20 20 20 20 20 23 20 62 69 6e 20 31 36 0a 20 # bin 16.
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3f00: 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 my $need_proc
3f10: 20 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2.
3f20: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 binary sc
3f30: 61 6e 20 24 64 61 74 61 20 53 20 6e 0a 20 20 20 an $data S n.
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3f50: 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e set n [expr {$n
3f60: 20 26 20 30 78 46 46 46 46 7d 5d 0a 20 20 20 20 & 0xFFFF}].
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3f80: 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 set data [string
3f90: 20 72 61 6e 67 65 20 24 64 61 74 61 20 32 20 65 range $data 2 e
3fa0: 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 nd].
3fb0: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 my $need
3fc0: 5f 70 72 6f 63 20 24 6e 0a 20 20 20 20 20 20 20 _proc $n.
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e bin
3fe0: 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 61 ary scan $data a
3ff0: 24 6e 20 63 0a 20 20 20 20 20 20 20 20 20 20 20 $n c.
4000: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 lappend
4010: 20 6c 20 5b 6c 69 73 74 20 62 69 6e 20 24 63 5d l [list bin $c]
4020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4030: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
4040: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
4050: 61 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 20 a $n end].
4060: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 } else
4070: 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 36 7d if {$tc == 0xC6}
4080: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
4090: 20 20 20 20 20 20 20 23 20 62 69 6e 20 33 32 0a # bin 32.
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
40b0: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f my $need_pro
40c0: 63 20 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 c 4.
40d0: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 binary s
40e0: 63 61 6e 20 24 64 61 74 61 20 49 20 6e 0a 20 20 can $data I n.
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4100: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 set n [expr {$
4110: 6e 20 26 20 30 78 46 46 46 46 46 46 46 46 7d 5d n & 0xFFFFFFFF}]
4120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4130: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
4140: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
4150: 61 20 34 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 a 4 end].
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 my
4170: 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 $need_proc $n.
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4190: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 binary scan $d
41a0: 61 74 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20 ata a$n c.
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 la
41c0: 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 62 69 ppend l [list bi
41d0: 6e 20 24 63 5d 0a 20 20 20 20 20 20 20 20 20 20 n $c].
41e0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 set da
41f0: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 ta [string range
4200: 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a 20 $data $n end].
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d }
4220: 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 elseif {$tc ==
4230: 30 78 43 37 7d 20 7b 0a 20 20 20 20 20 20 20 20 0xC7} {.
4240: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 65 78 # ex
4250: 74 20 38 0a 20 20 20 20 20 20 20 20 20 20 20 20 t 8.
4260: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 my $need
4270: 5f 70 72 6f 63 20 32 0a 20 20 20 20 20 20 20 20 _proc 2.
4280: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 bina
4290: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 63 63 ry scan $data cc
42a0: 20 6e 20 65 78 74 5f 74 79 70 65 0a 20 20 20 20 n ext_type.
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
42c0: 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e 20 set n [expr {$n
42d0: 26 20 30 78 46 46 7d 5d 0a 20 20 20 20 20 20 20 & 0xFF}].
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 set
42f0: 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 data [string ra
4300: 6e 67 65 20 24 64 61 74 61 20 32 20 65 6e 64 5d nge $data 2 end]
4310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4320: 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 my $need_pr
4330: 6f 63 20 24 6e 0a 20 20 20 20 20 20 20 20 20 20 oc $n.
4340: 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 binary
4350: 20 73 63 61 6e 20 24 64 61 74 61 20 61 24 6e 20 scan $data a$n
4360: 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c.
4370: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 lappend l
4380: 5b 6d 79 20 75 6e 70 61 63 6b 5f 65 78 74 20 24 [my unpack_ext $
4390: 65 78 74 5f 74 79 70 65 20 24 63 5d 0a 20 20 20 ext_type $c].
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
43b0: 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e set data [strin
43c0: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 24 6e g range $data $n
43d0: 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 end].
43e0: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b } elseif {
43f0: 24 74 63 20 3d 3d 20 30 78 43 38 7d 20 7b 0a 20 $tc == 0xC8} {.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4410: 20 20 20 23 20 65 78 74 20 31 36 0a 20 20 20 20 # ext 16.
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4430: 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 33 0a my $need_proc 3.
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4450: 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 binary scan
4460: 24 64 61 74 61 20 53 63 20 6e 20 65 78 74 5f 74 $data Sc n ext_t
4470: 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 ype.
4480: 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 5b 65 set n [e
4490: 78 70 72 20 7b 24 6e 20 26 20 30 78 46 46 46 46 xpr {$n & 0xFFFF
44a0: 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 }].
44b0: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20 set data
44c0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 [string range $d
44d0: 61 74 61 20 33 20 65 6e 64 5d 0a 20 20 20 20 20 ata 3 end].
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d m
44f0: 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a y $need_proc $n.
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4510: 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 binary scan
4520: 24 64 61 74 61 20 61 24 6e 20 63 0a 20 20 20 20 $data a$n c.
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4540: 6c 61 70 70 65 6e 64 20 6c 20 5b 6d 79 20 75 6e lappend l [my un
4550: 70 61 63 6b 5f 65 78 74 20 24 65 78 74 5f 74 79 pack_ext $ext_ty
4560: 70 65 20 24 63 5d 0a 20 20 20 20 20 20 20 20 20 pe $c].
4570: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 set d
4580: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 ata [string rang
4590: 65 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a e $data $n end].
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
45b0: 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d } elseif {$tc ==
45c0: 20 30 78 43 39 7d 20 7b 0a 20 20 20 20 20 20 20 0xC9} {.
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 65 # e
45e0: 78 74 20 33 32 0a 20 20 20 20 20 20 20 20 20 20 xt 32.
45f0: 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 my $ne
4600: 65 64 5f 70 72 6f 63 20 35 0a 20 20 20 20 20 20 ed_proc 5.
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 bi
4620: 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 nary scan $data
4630: 49 63 20 6e 20 65 78 74 5f 74 79 70 65 0a 20 20 Ic n ext_type.
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4650: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 set n [expr {$
4660: 6e 20 26 20 30 78 46 46 46 46 46 46 46 46 7d 5d n & 0xFFFFFFFF}]
4670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4680: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
4690: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
46a0: 61 20 35 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 a 5 end].
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 my
46c0: 24 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 $need_proc $n.
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
46e0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 binary scan $d
46f0: 61 74 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20 ata a$n c.
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 la
4710: 70 70 65 6e 64 20 6c 20 5b 6d 79 20 75 6e 70 61 ppend l [my unpa
4720: 63 6b 5f 65 78 74 20 24 65 78 74 5f 74 79 70 65 ck_ext $ext_type
4730: 20 24 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 $c].
4740: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 set dat
4750: 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 a [string range
4760: 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a 20 20 $data $n end].
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d }
4780: 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 elseif {$tc ==
4790: 30 78 43 41 7d 20 7b 0a 20 20 20 20 20 20 20 20 0xCA} {.
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 66 6c # fl
47b0: 6f 61 74 33 32 0a 20 20 20 20 20 20 20 20 20 20 oat32.
47c0: 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 my $ne
47d0: 65 64 5f 70 72 6f 63 20 34 0a 20 20 20 20 20 20 ed_proc 4.
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 bi
47f0: 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 nary scan $data
4800: 52 20 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 R c.
4810: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 set data
4820: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 [string range $
4830: 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20 20 20 data 4 end].
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4850: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 lappend l [list
4860: 66 6c 6f 61 74 33 32 20 24 63 5d 0a 20 20 20 20 float32 $c].
4870: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c } el
4880: 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 seif {$tc == 0xC
4890: 42 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 B} {.
48a0: 20 20 20 20 20 20 20 20 20 23 20 66 6c 6f 61 74 # float
48b0: 36 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 64.
48c0: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f my $need_
48d0: 70 72 6f 63 20 38 0a 20 20 20 20 20 20 20 20 20 proc 8.
48e0: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 binar
48f0: 79 20 73 63 61 6e 20 24 64 61 74 61 20 51 20 63 y scan $data Q c
4900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4910: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
4920: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
4930: 61 20 38 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 a 8 end].
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 lap
4950: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 66 6c 6f pend l [list flo
4960: 61 74 36 34 20 24 63 5d 0a 20 20 20 20 20 20 20 at64 $c].
4970: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 } elsei
4980: 66 20 7b 24 74 63 20 3d 3d 20 30 78 43 43 7d 20 f {$tc == 0xCC}
4990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
49a0: 20 20 20 20 20 20 23 20 75 69 6e 74 38 0a 20 20 # uint8.
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
49c0: 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 my $need_proc
49d0: 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1.
49e0: 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 binary sca
49f0: 6e 20 24 64 61 74 61 20 63 20 63 0a 20 20 20 20 n $data c c.
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4a10: 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 set data [string
4a20: 20 72 61 6e 67 65 20 24 64 61 74 61 20 31 20 65 range $data 1 e
4a30: 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 nd].
4a40: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 lappend
4a50: 6c 20 5b 6c 69 73 74 20 69 6e 74 65 67 65 72 20 l [list integer
4a60: 5b 65 78 70 72 20 7b 24 63 20 26 20 30 78 46 46 [expr {$c & 0xFF
4a70: 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }]].
4a80: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 } elseif {$t
4a90: 63 20 3d 3d 20 30 78 43 44 7d 20 7b 0a 20 20 20 c == 0xCD} {.
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4ab0: 20 23 20 75 69 6e 74 31 36 0a 20 20 20 20 20 20 # uint16.
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 my
4ad0: 20 24 6e 65 65 64 5f 70 72 6f 63 20 32 0a 20 20 $need_proc 2.
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4af0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 binary scan $d
4b00: 61 74 61 20 53 20 63 0a 20 20 20 20 20 20 20 20 ata S c.
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 set
4b20: 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e data [string ran
4b30: 67 65 20 24 64 61 74 61 20 32 20 65 6e 64 5d 0a ge $data 2 end].
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4b50: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c lappend l [l
4b60: 69 73 74 20 69 6e 74 65 67 65 72 20 5b 65 78 70 ist integer [exp
4b70: 72 20 7b 24 63 20 26 20 30 78 46 46 46 46 7d 5d r {$c & 0xFFFF}]
4b80: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
4b90: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 } elseif {$tc
4ba0: 3d 3d 20 30 78 43 45 7d 20 7b 0a 20 20 20 20 20 == 0xCE} {.
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 #
4bc0: 20 75 69 6e 74 33 32 0a 20 20 20 20 20 20 20 20 uint32.
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 my $
4be0: 6e 65 65 64 5f 70 72 6f 63 20 34 0a 20 20 20 20 need_proc 4.
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4c00: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 binary scan $dat
4c10: 61 20 49 20 63 0a 20 20 20 20 20 20 20 20 20 20 a I c.
4c20: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 set da
4c30: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 ta [string range
4c40: 20 24 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20 $data 4 end].
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4c60: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 lappend l [lis
4c70: 74 20 69 6e 74 65 67 65 72 20 5b 65 78 70 72 20 t integer [expr
4c80: 7b 24 63 20 26 20 30 78 46 46 46 46 46 46 46 46 {$c & 0xFFFFFFFF
4c90: 7d 5d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }]].
4ca0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 } elseif {$t
4cb0: 63 20 3d 3d 20 30 78 43 46 7d 20 7b 0a 20 20 20 c == 0xCF} {.
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4cd0: 20 23 20 75 69 6e 74 36 34 0a 20 20 20 20 20 20 # uint64.
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 my
4cf0: 20 24 6e 65 65 64 5f 70 72 6f 63 20 38 0a 20 20 $need_proc 8.
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4d10: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 binary scan $d
4d20: 61 74 61 20 57 20 63 0a 20 20 20 20 20 20 20 20 ata W c.
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 set
4d40: 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e data [string ran
4d50: 67 65 20 24 64 61 74 61 20 38 20 65 6e 64 5d 0a ge $data 8 end].
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4d70: 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c lappend l [l
4d80: 69 73 74 20 69 6e 74 65 67 65 72 20 5b 65 78 70 ist integer [exp
4d90: 72 20 7b 24 63 20 26 20 30 78 46 46 46 46 46 46 r {$c & 0xFFFFFF
4da0: 46 46 46 46 46 46 46 46 46 46 7d 5d 5d 0a 20 20 FFFFFFFFFF}]].
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 }
4dc0: 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 elseif {$tc == 0
4dd0: 78 44 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 xD0} {.
4de0: 20 20 20 20 20 20 20 20 20 20 20 23 20 69 6e 74 # int
4df0: 38 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 8.
4e00: 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 my $need_p
4e10: 72 6f 63 20 31 0a 20 20 20 20 20 20 20 20 20 20 roc 1.
4e20: 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 binary
4e30: 20 73 63 61 6e 20 24 64 61 74 61 20 63 20 63 0a scan $data c c.
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4e50: 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 set data [st
4e60: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 ring range $data
4e70: 20 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 1 end].
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 lapp
4e90: 65 6e 64 20 6c 20 5b 6c 69 73 74 20 69 6e 74 65 end l [list inte
4ea0: 67 65 72 20 24 63 5d 0a 20 20 20 20 20 20 20 20 ger $c].
4eb0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 } elseif
4ec0: 20 7b 24 74 63 20 3d 3d 20 30 78 44 31 7d 20 7b {$tc == 0xD1} {
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4ee0: 20 20 20 20 20 23 20 69 6e 74 31 36 0a 20 20 20 # int16.
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4f00: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 32 my $need_proc 2
4f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4f20: 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e binary scan
4f30: 20 24 64 61 74 61 20 53 20 63 0a 20 20 20 20 20 $data S c.
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
4f50: 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 et data [string
4f60: 72 61 6e 67 65 20 24 64 61 74 61 20 32 20 65 6e range $data 2 en
4f70: 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 d].
4f80: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c lappend l
4f90: 20 5b 6c 69 73 74 20 69 6e 74 65 67 65 72 20 24 [list integer $
4fa0: 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 c].
4fb0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 } elseif {$tc
4fc0: 20 3d 3d 20 30 78 44 32 7d 20 7b 0a 20 20 20 20 == 0xD2} {.
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4fe0: 23 20 69 6e 74 33 32 0a 20 20 20 20 20 20 20 20 # int32.
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 my $
5000: 6e 65 65 64 5f 70 72 6f 63 20 34 0a 20 20 20 20 need_proc 4.
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5020: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 binary scan $dat
5030: 61 20 49 20 63 0a 20 20 20 20 20 20 20 20 20 20 a I c.
5040: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 set da
5050: 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 ta [string range
5060: 20 24 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20 $data 4 end].
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5080: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 lappend l [lis
5090: 74 20 69 6e 74 65 67 65 72 20 24 63 5d 0a 20 20 t integer $c].
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 }
50b0: 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 elseif {$tc == 0
50c0: 78 44 33 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 xD3} {.
50d0: 20 20 20 20 20 20 20 20 20 20 20 23 20 69 6e 74 # int
50e0: 36 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 64.
50f0: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f my $need_
5100: 70 72 6f 63 20 38 0a 20 20 20 20 20 20 20 20 20 proc 8.
5110: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 binar
5120: 79 20 73 63 61 6e 20 24 64 61 74 61 20 57 20 63 y scan $data W c
5130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5140: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
5150: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
5160: 61 20 38 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 a 8 end].
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 lap
5180: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 69 6e 74 pend l [list int
5190: 65 67 65 72 20 24 63 5d 0a 20 20 20 20 20 20 20 eger $c].
51a0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 } elsei
51b0: 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 34 7d 20 f {$tc == 0xD4}
51c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
51d0: 20 20 20 20 20 20 23 20 66 69 78 65 78 74 20 31 # fixext 1
51e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
51f0: 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 my $need_pr
5200: 6f 63 20 32 0a 20 20 20 20 20 20 20 20 20 20 20 oc 2.
5210: 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 binary
5220: 73 63 61 6e 20 24 64 61 74 61 20 63 61 31 20 65 scan $data ca1 e
5230: 78 74 5f 74 79 70 65 20 63 0a 20 20 20 20 20 20 xt_type c.
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 se
5250: 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 t data [string r
5260: 61 6e 67 65 20 24 64 61 74 61 20 32 20 65 6e 64 ange $data 2 end
5270: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
5280: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 lappend l
5290: 5b 6c 69 73 74 20 65 78 74 20 24 65 78 74 5f 74 [list ext $ext_t
52a0: 79 70 65 20 24 63 5d 0a 20 20 20 20 20 20 20 20 ype $c].
52b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 } elseif
52c0: 20 7b 24 74 63 20 3d 3d 20 30 78 44 35 7d 20 7b {$tc == 0xD5} {
52d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
52e0: 20 20 20 20 20 23 20 66 69 78 65 78 74 20 32 0a # fixext 2.
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5300: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f my $need_pro
5310: 63 20 33 0a 20 20 20 20 20 20 20 20 20 20 20 20 c 3.
5320: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 binary s
5330: 63 61 6e 20 24 64 61 74 61 20 63 61 32 20 65 78 can $data ca2 ex
5340: 74 5f 74 79 70 65 20 63 0a 20 20 20 20 20 20 20 t_type c.
5350: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 set
5360: 20 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 data [string ra
5370: 6e 67 65 20 24 64 61 74 61 20 33 20 65 6e 64 5d nge $data 3 end]
5380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5390: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b lappend l [
53a0: 6d 79 20 75 6e 70 61 63 6b 5f 65 78 74 20 24 65 my unpack_ext $e
53b0: 78 74 5f 74 79 70 65 20 24 63 5d 0a 20 20 20 20 xt_type $c].
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c } el
53d0: 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 seif {$tc == 0xD
53e0: 36 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 6} {.
53f0: 20 20 20 20 20 20 20 20 20 23 20 66 69 78 65 78 # fixex
5400: 74 20 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 t 4.
5410: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 my $need
5420: 5f 70 72 6f 63 20 35 0a 20 20 20 20 20 20 20 20 _proc 5.
5430: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 bina
5440: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 63 61 ry scan $data ca
5450: 34 20 65 78 74 5f 74 79 70 65 20 63 0a 20 20 20 4 ext_type c.
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5470: 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e set data [strin
5480: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 35 20 g range $data 5
5490: 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 end].
54a0: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 lappend
54b0: 20 6c 20 5b 6d 79 20 75 6e 70 61 63 6b 5f 65 78 l [my unpack_ex
54c0: 74 20 24 65 78 74 5f 74 79 70 65 20 24 63 5d 0a t $ext_type $c].
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
54e0: 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d } elseif {$tc ==
54f0: 20 30 78 44 37 7d 20 7b 0a 20 20 20 20 20 20 20 0xD7} {.
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 66 # f
5510: 69 78 65 78 74 20 38 0a 20 20 20 20 20 20 20 20 ixext 8.
5520: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 my $
5530: 6e 65 65 64 5f 70 72 6f 63 20 39 0a 20 20 20 20 need_proc 9.
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5550: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 binary scan $dat
5560: 61 20 63 61 38 20 65 78 74 5f 74 79 70 65 20 63 a ca8 ext_type c
5570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5580: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
5590: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
55a0: 61 20 39 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 a 9 end].
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 lap
55c0: 70 65 6e 64 20 6c 20 5b 6d 79 20 75 6e 70 61 63 pend l [my unpac
55d0: 6b 5f 65 78 74 20 24 65 78 74 5f 74 79 70 65 20 k_ext $ext_type
55e0: 24 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 $c].
55f0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 } elseif {$t
5600: 63 20 3d 3d 20 30 78 44 38 7d 20 7b 0a 20 20 20 c == 0xD8} {.
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5620: 20 23 20 66 69 78 65 78 74 20 31 36 0a 20 20 20 # fixext 16.
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5640: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 31 my $need_proc 1
5650: 37 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7.
5660: 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 binary sca
5670: 6e 20 24 64 61 74 61 20 63 61 31 36 20 65 78 74 n $data ca16 ext
5680: 5f 74 79 70 65 20 63 0a 20 20 20 20 20 20 20 20 _type c.
5690: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 set
56a0: 64 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e data [string ran
56b0: 67 65 20 24 64 61 74 61 20 31 37 20 65 6e 64 5d ge $data 17 end]
56c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
56d0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b lappend l [
56e0: 6d 79 20 75 6e 70 61 63 6b 5f 65 78 74 20 24 65 my unpack_ext $e
56f0: 78 74 5f 74 79 70 65 20 24 63 5d 0a 20 20 20 20 xt_type $c].
5700: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c } el
5710: 73 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 seif {$tc == 0xD
5720: 39 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 9} {.
5730: 20 20 20 20 20 20 20 20 20 23 20 73 74 72 69 6e # strin
5740: 67 20 38 0a 20 20 20 20 20 20 20 20 20 20 20 20 g 8.
5750: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 my $need
5760: 5f 70 72 6f 63 20 31 0a 20 20 20 20 20 20 20 20 _proc 1.
5770: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 bina
5780: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 63 20 ry scan $data c
5790: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n.
57a0: 20 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 set n [exp
57b0: 72 20 7b 24 6e 20 26 20 30 78 46 46 7d 5d 0a 20 r {$n & 0xFF}].
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
57d0: 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 set data [str
57e0: 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 ing range $data
57f0: 31 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 1 end].
5800: 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 6e my $n
5810: 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 20 20 eed_proc $n.
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5830: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 binary scan $dat
5840: 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20 20 20 a a$n c.
5850: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 lapp
5860: 65 6e 64 20 6c 20 5b 6c 69 73 74 20 73 74 72 20 end l [list str
5870: 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 72 [encoding conver
5880: 74 66 72 6f 6d 20 75 74 66 2d 38 20 24 63 5d 5d tfrom utf-8 $c]]
5890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
58a0: 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 set data [s
58b0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 tring range $dat
58c0: 61 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 20 a $n end].
58d0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 } else
58e0: 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 41 7d if {$tc == 0xDA}
58f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
5900: 20 20 20 20 20 20 20 23 20 73 74 72 69 6e 67 20 # string
5910: 31 36 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 16.
5920: 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 5f my $need_
5930: 70 72 6f 63 20 32 0a 20 20 20 20 20 20 20 20 20 proc 2.
5940: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 72 binar
5950: 79 20 73 63 61 6e 20 24 64 61 74 61 20 53 20 6e y scan $data S n
5960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5970: 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 set n [expr
5980: 20 7b 24 6e 20 26 20 30 78 46 46 46 46 7d 5d 0a {$n & 0xFFFF}].
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
59a0: 20 20 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 set data [st
59b0: 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 ring range $data
59c0: 20 32 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 2 end].
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 my $
59e0: 6e 65 65 64 5f 70 72 6f 63 20 24 6e 0a 20 20 20 need_proc $n.
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5a00: 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 binary scan $da
5a10: 74 61 20 61 24 6e 20 63 0a 20 20 20 20 20 20 20 ta a$n c.
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 lap
5a30: 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 73 74 72 pend l [list str
5a40: 20 5b 65 6e 63 6f 64 69 6e 67 20 63 6f 6e 76 65 [encoding conve
5a50: 72 74 66 72 6f 6d 20 75 74 66 2d 38 20 24 63 5d rtfrom utf-8 $c]
5a60: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ].
5a70: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 20 5b set data [
5a80: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 64 61 string range $da
5a90: 74 61 20 24 6e 20 65 6e 64 5d 0a 20 20 20 20 20 ta $n end].
5aa0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 } els
5ab0: 65 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 42 eif {$tc == 0xDB
5ac0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 } {.
5ad0: 20 20 20 20 20 20 20 20 23 20 73 74 72 69 6e 67 # string
5ae0: 20 33 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 32.
5af0: 20 20 20 20 20 20 20 20 6d 79 20 24 6e 65 65 64 my $need
5b00: 5f 70 72 6f 63 20 34 0a 20 20 20 20 20 20 20 20 _proc 4.
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 61 bina
5b20: 72 79 20 73 63 61 6e 20 24 64 61 74 61 20 49 20 ry scan $data I
5b30: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n.
5b40: 20 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 set n [exp
5b50: 72 20 7b 24 6e 20 26 20 30 78 46 46 46 46 46 46 r {$n & 0xFFFFFF
5b60: 46 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 FF}].
5b70: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 set dat
5b80: 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 a [string range
5b90: 24 64 61 74 61 20 34 20 65 6e 64 5d 0a 20 20 20 $data 4 end].
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5bb0: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 24 my $need_proc $
5bc0: 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n.
5bd0: 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 binary sca
5be0: 6e 20 24 64 61 74 61 20 61 24 6e 20 63 0a 20 20 n $data a$n c.
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c00: 20 20 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 lappend l [lis
5c10: 74 20 73 74 72 20 5b 65 6e 63 6f 64 69 6e 67 20 t str [encoding
5c20: 63 6f 6e 76 65 72 74 66 72 6f 6d 20 75 74 66 2d convertfrom utf-
5c30: 38 20 24 63 5d 5d 0a 20 20 20 20 20 20 20 20 20 8 $c]].
5c40: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 set d
5c50: 61 74 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 ata [string rang
5c60: 65 20 24 64 61 74 61 20 24 6e 20 65 6e 64 5d 0a e $data $n end].
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c80: 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 20 3d 3d } elseif {$tc ==
5c90: 20 30 78 44 43 7d 20 7b 0a 20 20 20 20 20 20 20 0xDC} {.
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 61 # a
5cb0: 72 72 61 79 20 31 36 0a 20 20 20 20 20 20 20 20 rray 16.
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 20 24 my $
5cd0: 6e 65 65 64 5f 70 72 6f 63 20 32 0a 20 20 20 20 need_proc 2.
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5cf0: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 64 61 74 binary scan $dat
5d00: 61 20 53 20 6e 0a 20 20 20 20 20 20 20 20 20 20 a S n.
5d10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 20 set n
5d20: 5b 65 78 70 72 20 7b 24 6e 20 26 20 30 78 46 46 [expr {$n & 0xFF
5d30: 46 46 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 FF}].
5d40: 20 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 set dat
5d50: 61 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 a [string range
5d60: 24 64 61 74 61 20 32 20 65 6e 64 5d 0a 20 20 20 $data 2 end].
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5d80: 20 73 65 74 20 61 20 7b 7d 0a 20 20 20 20 20 20 set a {}.
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f fo
5da0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 r {set i 0} {$i
5db0: 3c 20 24 6e 7d 20 7b 69 6e 63 72 20 69 7d 20 7b < $n} {incr i} {
5dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5dd0: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 lappend
5de0: 20 61 20 7b 2a 7d 5b 6d 79 20 75 6e 70 61 63 6b a {*}[my unpack
5df0: 5f 63 6f 72 6f 20 31 20 24 63 6f 72 6f 5d 0a 20 _coro 1 $coro].
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
5e20: 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 lappend
5e30: 20 6c 20 5b 6c 69 73 74 20 61 72 72 61 79 20 24 l [list array $
5e40: 61 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 a].
5e50: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 74 63 } elseif {$tc
5e60: 20 3d 3d 20 30 78 44 44 7d 20 7b 0a 20 20 20 20 == 0xDD} {.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e80: 23 20 61 72 72 61 79 20 33 32 0a 20 20 20 20 20 # array 32.
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d m
5ea0: 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 34 0a 20 y $need_proc 4.
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5ec0: 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 binary scan $
5ed0: 64 61 74 61 20 49 20 6e 0a 20 20 20 20 20 20 20 data I n.
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 set
5ef0: 20 6e 20 5b 65 78 70 72 20 7b 24 6e 20 26 20 30 n [expr {$n & 0
5f00: 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 20 20 xFFFFFFFF}].
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5f20: 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e 67 set data [string
5f30: 20 72 61 6e 67 65 20 24 64 61 74 61 20 34 20 65 range $data 4 e
5f40: 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 nd].
5f50: 20 20 20 20 20 20 20 20 73 65 74 20 61 20 7b 7d set a {}
5f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5f70: 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 for {set i
5f80: 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b 69 6e 0} {$i < $n} {in
5f90: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 20 20 cr i} {.
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5fb0: 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79 lappend a {*}[my
5fc0: 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 24 unpack_coro 1 $
5fd0: 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 20 coro].
5fe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6000: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 lappend l [list
6010: 61 72 72 61 79 20 24 61 5d 0a 20 20 20 20 20 20 array $a].
6020: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 } else
6030: 69 66 20 7b 24 74 63 20 3d 3d 20 30 78 44 45 7d if {$tc == 0xDE}
6040: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
6050: 20 20 20 20 20 20 20 23 20 6d 61 70 20 31 36 0a # map 16.
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6070: 20 20 20 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f my $need_pro
6080: 63 20 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 c 2.
6090: 20 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 73 binary s
60a0: 63 61 6e 20 24 64 61 74 61 20 53 20 6e 0a 20 20 can $data S n.
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60c0: 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 set n [expr {$
60d0: 6e 20 26 20 30 78 46 46 46 46 7d 5d 0a 20 20 20 n & 0xFFFF}].
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60f0: 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 6e set data [strin
6100: 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 32 20 g range $data 2
6110: 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 20 end].
6120: 20 20 20 20 20 20 20 20 20 73 65 74 20 61 20 7b set a {
6130: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 }.
6140: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 for {set i
6150: 20 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b 69 0} {$i < $n} {i
6160: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 20 ncr i} {.
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6180: 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d lappend a {*}[m
6190: 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 y unpack_coro 1
61a0: 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 $coro].
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c l
61c0: 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79 20 append a {*}[my
61d0: 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 24 63 unpack_coro 1 $c
61e0: 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 20 20 oro].
61f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c l
6210: 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 6d append l [list m
6220: 61 70 20 24 61 5d 0a 20 20 20 20 20 20 20 20 20 ap $a].
6230: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 } elseif
6240: 7b 24 74 63 20 3d 3d 20 30 78 44 46 7d 20 7b 0a {$tc == 0xDF} {.
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6260: 20 20 20 20 23 20 6d 61 70 20 33 32 0a 20 20 20 # map 32.
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6280: 20 6d 79 20 24 6e 65 65 64 5f 70 72 6f 63 20 34 my $need_proc 4
6290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
62a0: 20 20 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e binary scan
62b0: 20 24 64 61 74 61 20 49 20 6e 0a 20 20 20 20 20 $data I n.
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
62d0: 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e 20 26 et n [expr {$n &
62e0: 20 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 0xFFFFFFFF}].
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6300: 20 20 73 65 74 20 64 61 74 61 20 5b 73 74 72 69 set data [stri
6310: 6e 67 20 72 61 6e 67 65 20 24 64 61 74 61 20 34 ng range $data 4
6320: 20 65 6e 64 5d 0a 20 20 20 20 20 20 20 20 20 20 end].
6330: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 20 set a
6340: 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {}.
6350: 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 for {set
6360: 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 7d 20 7b i 0} {$i < $n} {
6370: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 incr i} {.
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6390: 20 20 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b lappend a {*}[
63a0: 6d 79 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 my unpack_coro 1
63b0: 20 24 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 $coro].
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
63d0: 6c 61 70 70 65 6e 64 20 61 20 7b 2a 7d 5b 6d 79 lappend a {*}[my
63e0: 20 75 6e 70 61 63 6b 5f 63 6f 72 6f 20 31 20 24 unpack_coro 1 $
63f0: 63 6f 72 6f 5d 0a 20 20 20 20 20 20 20 20 20 20 coro].
6400: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6420: 6c 61 70 70 65 6e 64 20 6c 20 5b 6c 69 73 74 20 lappend l [list
6430: 6d 61 70 20 24 61 5d 0a 20 20 20 20 20 20 20 20 map $a].
6440: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b } else {
6450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
6460: 20 20 20 20 20 65 72 72 6f 72 20 5b 6c 69 73 74 error [list
6470: 20 75 6e 6b 6e 6f 77 6e 20 74 79 70 65 3a 20 24 unknown type: $
6480: 74 63 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 tc].
6490: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
64a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
64b0: 69 66 20 7b 24 6e 65 73 74 65 64 7d 20 7b 0a 20 if {$nested} {.
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
64d0: 65 74 75 72 6e 20 24 6c 0a 20 20 20 20 20 20 20 eturn $l.
64e0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 } else {.
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 if
6500: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 63 61 6c 6c {[llength $call
6510: 62 61 63 6b 5d 7d 20 7b 0a 20 20 20 20 20 20 20 back]} {.
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 for
6530: 65 61 63 68 20 69 20 24 6c 20 7b 0a 20 20 20 20 each i $l {.
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6550: 20 20 20 20 7b 2a 7d 24 63 61 6c 6c 62 61 63 6b {*}$callback
6560: 20 64 61 74 61 20 24 69 0a 20 20 20 20 20 20 20 data $i.
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 }.
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6590: 20 20 20 73 65 74 20 6c 20 7b 7d 0a 20 20 20 20 set l {}.
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 }.
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 if
65c0: 20 7b 21 24 63 6f 72 6f 7d 20 7b 0a 20 20 20 20 {!$coro} {.
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
65e0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 if {[string leng
65f0: 74 68 20 24 64 61 74 61 5d 20 3d 3d 20 30 7d 20 th $data] == 0}
6600: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
6610: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
6620: 20 24 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 $l.
6630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
6640: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
6650: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
6660: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 6e 61 6d }. }.}..nam
6670: 65 73 70 61 63 65 20 65 76 61 6c 20 6d 73 67 70 espace eval msgp
6680: 61 63 6b 20 7b 0a 0a 20 20 20 20 70 72 6f 63 20 ack {.. proc
6690: 70 61 63 6b 20 7b 74 79 70 65 20 7b 76 61 6c 75 pack {type {valu
66a0: 65 20 30 7d 20 7b 76 61 6c 75 65 31 20 22 22 7d e 0} {value1 ""}
66b0: 20 7b 76 61 6c 75 65 32 20 22 22 7d 7d 20 7b 0a {value2 ""}} {.
66c0: 20 20 20 20 20 20 20 20 73 65 74 20 6f 20 5b 6d set o [m
66d0: 73 67 70 61 63 6b 3a 3a 70 61 63 6b 65 72 20 6e sgpack::packer n
66e0: 65 77 5d 0a 20 20 20 20 20 20 20 20 69 66 20 7b ew]. if {
66f0: 24 74 79 70 65 20 65 71 20 22 74 63 6c 5f 61 72 $type eq "tcl_ar
6700: 72 61 79 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 ray"} {.
6710: 20 20 20 20 75 70 76 61 72 20 24 76 61 6c 75 65 upvar $value
6720: 32 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 2 a.
6730: 24 6f 20 70 61 63 6b 20 24 74 79 70 65 20 24 76 $o pack $type $v
6740: 61 6c 75 65 20 24 76 61 6c 75 65 31 20 61 0a 20 alue $value1 a.
6750: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a } else {.
6760: 20 20 20 20 20 20 20 20 20 20 20 20 24 6f 20 70 $o p
6770: 61 63 6b 20 24 74 79 70 65 20 24 76 61 6c 75 65 ack $type $value
6780: 20 24 76 61 6c 75 65 31 20 24 76 61 6c 75 65 32 $value1 $value2
6790: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
67a0: 20 20 20 73 65 74 20 73 20 5b 24 6f 20 64 61 74 set s [$o dat
67b0: 61 5d 0a 20 20 20 20 20 20 20 20 24 6f 20 64 65 a]. $o de
67c0: 73 74 72 6f 79 0a 20 20 20 20 20 20 20 20 72 65 stroy. re
67d0: 74 75 72 6e 20 24 73 0a 20 20 20 20 7d 0a 0a 20 turn $s. }..
67e0: 20 20 20 70 72 6f 63 20 75 6e 70 61 63 6b 20 7b proc unpack {
67f0: 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 s} {. set
6800: 20 6f 20 5b 6d 73 67 70 61 63 6b 3a 3a 75 6e 70 o [msgpack::unp
6810: 61 63 6b 65 72 20 6e 65 77 5d 0a 20 20 20 20 20 acker new].
6820: 20 20 20 73 65 74 20 6c 20 5b 24 6f 20 75 6e 70 set l [$o unp
6830: 61 63 6b 5f 73 74 72 69 6e 67 20 24 73 5d 0a 20 ack_string $s].
6840: 20 20 20 20 20 20 20 24 6f 20 64 65 73 74 72 6f $o destro
6850: 79 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e y. return
6860: 20 24 6c 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 $l. }.. p
6870: 72 6f 63 20 6d 61 70 32 64 69 63 74 20 7b 6d 7d roc map2dict {m}
6880: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 {. set d
6890: 20 5b 64 69 63 74 20 63 72 65 61 74 65 5d 0a 20 [dict create].
68a0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b foreach {
68b0: 6b 69 20 76 69 7d 20 24 6d 20 7b 0a 20 20 20 20 ki vi} $m {.
68c0: 20 20 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 lassign
68d0: 24 6b 69 20 6b 74 20 6b 76 0a 20 20 20 20 20 20 $ki kt kv.
68e0: 20 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 76 lassign $v
68f0: 69 20 76 74 20 76 76 0a 20 20 20 20 20 20 20 20 i vt vv.
6900: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 20 24 dict set d $
6910: 6b 76 20 24 76 76 0a 20 20 20 20 20 20 20 20 7d kv $vv. }
6920: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
6930: 24 64 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 $d. }.. pr
6940: 6f 63 20 6d 61 70 32 61 72 72 61 79 20 7b 6d 20 oc map2array {m
6950: 61 6e 6d 7d 20 7b 0a 20 20 20 20 20 20 20 20 75 anm} {. u
6960: 70 76 61 72 20 24 61 6e 6d 20 61 0a 20 20 20 20 pvar $anm a.
6970: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6b 69 20 foreach {ki
6980: 76 69 7d 20 24 6d 20 7b 0a 20 20 20 20 20 20 20 vi} $m {.
6990: 20 20 20 20 20 6c 61 73 73 69 67 6e 20 24 6b 69 lassign $ki
69a0: 20 6b 74 20 6b 76 0a 20 20 20 20 20 20 20 20 20 kt kv.
69b0: 20 20 20 6c 61 73 73 69 67 6e 20 24 76 69 20 76 lassign $vi v
69c0: 74 20 76 76 0a 20 20 20 20 20 20 20 20 20 20 20 t vv.
69d0: 20 73 65 74 20 61 28 24 6b 76 29 20 24 76 76 0a set a($kv) $vv.
69e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }.
69f0: 0a 20 20 20 20 70 72 6f 63 20 61 72 72 61 79 32 . proc array2
6a00: 6c 69 73 74 20 7b 61 7d 20 7b 0a 20 20 20 20 20 list {a} {.
6a10: 20 20 20 73 65 74 20 6c 20 5b 6c 69 73 74 5d 0a set l [list].
6a20: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 foreach
6a30: 69 20 24 61 20 7b 0a 20 20 20 20 20 20 20 20 20 i $a {.
6a40: 20 20 20 6c 61 73 73 69 67 6e 20 24 69 20 74 20 lassign $i t
6a50: 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 v. la
6a60: 70 70 65 6e 64 20 6c 20 24 76 0a 20 20 20 20 20 ppend l $v.
6a70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 }. ret
6a80: 75 72 6e 20 24 6c 0a 20 20 20 20 7d 0a 0a 20 20 urn $l. }..
6a90: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f namespace expo
6aa0: 72 74 20 2a 0a 20 20 20 20 6e 61 6d 65 73 70 61 rt *. namespa
6ab0: 63 65 20 65 6e 73 65 6d 62 6c 65 20 63 72 65 61 ce ensemble crea
6ac0: 74 65 0a 7d 0a te.}.