extending puts

# extended_puts.tcl v1.0
# M.Hoffmann, 20.10.2005
# based on https://wiki.tcl-lang.org/8502

package provide extend_puts 1.0

proc extend_puts {{stdoutadd {}} {stderradd {}}} {
    if {![llength [info command ::tcl::puts]]} {
        rename puts ::tcl::puts
    }
    proc puts args [format {
        set explicit_stdout 1
        set la [llength $args]
        if {$la<1 || $la>3} {
            catch {::tcl::puts} rc; # read original helptxt
            error [string map {::tcl:: ""} $rc]; # trigger error/SyntaxHelp
        }
        set nl \n
        if {[lindex $args 0]=="-nonewline"} {
            set nl ""
            set args [lrange $args 1 end]
        }
        if {[llength $args]==1} {
            set args [list stdout [join $args]]
            set explicit_stdout 0
        }
        foreach {channel s} $args break
        set stdoutadd "%s"
        set stderradd "%s"
        if {$explicit_stdout == 1 && [llength $stdoutadd] && $channel=="stdout"} {
            catch {uplevel [list $stdoutadd $s]}
        } elseif {[llength $stderradd] && $channel=="stderr"} {
            catch {uplevel [list $stderradd $s]}
        }
        set cmd ::tcl::puts
        if {$nl==""} {lappend cmd -nonewline}
        lappend cmd $channel $s
        uplevel $cmd
    } $stdoutadd $stderradd]
}

One intended use of this is to automatically write stderr-output to the windows-eventlogs.


See also puts - puts workaround