Posted to tcl by dbohdan at Thu Sep 24 09:45:39 GMT 2020view raw
- #! /usr/bin/env tclsh
- proc awksplit {0 {split default}} {
- if {$split eq "default"} {
- set t [lsearch -all -inline -not [split $0] {}]
- } else {
- set t [split $0 $split]
- }
- set result [dict create]
- dict set result NF [llength $t]
- set i 1
- foreach field $t {
- dict set result $i $field
- incr i
- }
- return $result
- }
- proc print args {
- upvar 1 OFS OFS
- if {[catch {
- puts [join $args $OFS]
- }]} {
- exit 0
- }
- }
- proc usage {} {
- puts "usage: owh patterns
- performs action (in Tcl) for each line (\$0) from stdin
- owh: Ousterhout - Welch - Hobbs, to name a few"
- }
- proc main args {
- if {[llength $args] != 1} {
- usage
- exit -1
- }
- set FS default
- set OFS { }
- # Process $args.
- set __begin {}
- set __end {}
- set __patterns {}
- # Do not use [dict unset] to retain the key order in Jim Tcl 0.79 and
- # earlier.
- dict for {__expr __body} [lindex $args 0] {
- switch -- $__expr {
- BEGIN { set __begin $__body }
- END { set __end $__body }
- default { lappend __patterns $__expr $__body }
- }
- }
- unset args
- # Prepare for the main loop.
- set NF 0
- set NR 0
- eval $__begin
- while true {
- if {[gets stdin 0] == -1} break
- for {set __i 1} {$__i <= $NF} {incr __i} {
- unset $__i
- }
- unset __i
- incr NR
- set __split [awksplit $0 $FS]
- dict with __split {}
- unset __split
- dict for {__expr __body} $__patterns {
- if $__expr { eval $__body }
- }
- }
- set res [eval $__end]
- if {[string length $res]} {
- puts $res
- }
- }
- main {*}$argv