1 # vim: foldmarker=<<<,>>>
3 class tlc
::Protocol_mpack {
7 method server_read
{con
}
8 method server_write
{con res id msg
}
9 method client_read
{con
}
10 method client_write
{con tag subcmd id msg
}
11 method parse_tabular
{data
}
12 method compile_tabular
{data
}
17 body tlc
::Protocol_mpack::server_read {con
} { #<<<1
19 set cmdlist
[split $cmd :]
20 set tag
[lindex $cmdlist 0]
21 set subcmd
[lindex $cmdlist 1]
22 set id
[lindex $cmdlist 2]
23 set len
[lindex $cmdlist 3]
24 if {![string is integer
-strict $len]} {
27 set dat
[read $con $len]
29 return [list $tag $subcmd $id $dat]
33 body tlc
::Protocol_mpack::server_write {con res id msg
} { #<<<1
35 puts $con [join [list $res $id [string bytelength
$lmsg]] :]
36 puts -nonewline $con $lmsg
41 body tlc
::Protocol_mpack::client_read {con
} { #<<<1
43 set cmdlist
[split $cmd :]
45 set res
[lindex $cmdlist 0]
46 set previd
[lindex $cmdlist 1]
47 set len
[lindex $cmdlist 2]
49 error "Error parsing control line: ($cmd):\n%::errorInfo"
51 if {![string is integer
-strict $len]} {
54 set dat
[read $con $len]
56 return [list $res $previd $dat]
60 body tlc
::Protocol_mpack::client_write {con tag subcmd id msg
} { #<<<1
62 puts $con [join [list $tag $subcmd $id [string bytelength
$lmsg]] :]
63 puts -nonewline $con $lmsg
68 body tlc
::Protocol_mpack::parse_tabular {data
} { #<<<1
70 # WARNING: this is for demo purposes only! "split" won't skip quoted
72 foreach srow
[split $data \n] {
74 foreach col
[split $srow :] {
75 lappend row
[string map
{"\\:" ":" "\\\\" "\\" "\\n" "\n"} $col]
83 body tlc
::Protocol_mpack::compile_tabular {data
} { #<<<1
88 lappend row
[string map
{":" "\\:" "\\" "\\\\" "\n" "\\n"} $col]
90 append build
[join $row :] "\n"