proc chan-read {chan} {
upvar #0 chandesc($chan) desc
for-chan $chan {
- while {[gets $chan l] > 0} {
+ if {[gets $chan l] > 0} {
log "$desc << $l"
if {![regexp {^([-0-9a-z]+)(?:\s+(.*))?$} $l dummy cmd rhs]} {
chan-error $chan "bad cli cmd syntax"
- continue
+ return
}
if {[catch { set al [info args cmd/$cmd] } emsg]} {
chan-error $chan "unknown command $emsg"
- continue
+ return
}
set basel [list cmd/$cmd $chan $desc]
if {[llength $al]==2} {
} else {
if {[catch { set all [llength $rhs] } emsg]} {
chan-error $chan "bad list syntax $emsg"
- continue
+ return
}
set alexp [lrange $al 2 end]
if {![string compare [lindex $al end] args]} {
if {$all+2 < [llength $al]-1} {
chan-error $chan "too few args ($alexp)"
- continue
+ return
}
} else {
if {$all+2 != [llength $al]} {
chan-error $chan "wrong number of args ($alexp)"
- continue
+ return
}
}
eval $basel [lreplace $rhs -1 -1]
}
- if {![info exists desc]} return
+ return
}
if {[eof $chan]} {
puts-chan-desc $chan {$$}