Posted to tcl by sebres at Fri Sep 11 19:43:15 GMT 2020view pretty

proc cm args {
  array set in {-out auto}
  array set in $args
  set scr ""
  puts -nonewline "%cm% "; flush stdout
  while {[gets stdin line] >= 0 && ($line ni {/cm /exit} || $scr ne "")} {
    append scr $line "\n"
    if {![info complete $scr]} {
      puts -nonewline " ... "; flush stdout
      continue
    }
    if {[catch {uplevel 1 $scr} msg]} {
      puts stderr "\7 \[\u212E\] $msg"
    } elseif {$msg ne ""} {
      if {$in(-out) ni {0 off no false}} {
        if {$in(-out) eq "auto"} {
          set msg [string map {"\r\n" "\u255c" "\n" "\u2518" "\r" "\u2534" "\t" "\u25A1" "\b" "\u2190" "\7" "\u266B"} $msg]
          if {[string length $msg] > 80} {set msg [string range $msg 0 77]...}
        }
        puts " \u2550\u2550\u25ba $msg"
      }
    }
    set scr ""
    puts -nonewline "%cm% "; flush stdout
  }
}

return

## ------------------------------------------
## Usage example:
## ------------------------------------------

%
% cm
%cm% set a 5
 PPº 5
%cm% set b
 [.] can't read "b": no such variable
%cm% string repeat a\r\nb\nc 65536
 PPº a\bca\bca\bca\bca\bca\bca\bca\bca\bca\bca\bca\bca\bca\bca\bca\b...
%cm% /cm
%
% cm -out off
%cm% set a 5
%cm% puts $a
5
%cm% /cm
%