|  | #!/usr/bin/env tclsh | 
|  | # | 
|  | # Copyright (C) 2017-2020  The Project X-Ray Authors. | 
|  | # | 
|  | # Use of this source code is governed by a ISC-style | 
|  | # license that can be found in the LICENSE file or at | 
|  | # https://opensource.org/licenses/ISC | 
|  | # | 
|  | # SPDX-License-Identifier: ISC | 
|  | # From: https://gist.github.com/yyamasak/af250f7ca74e18526734#file-reformat-tcl-L10 | 
|  | # Which is based on https://wiki.tcl-lang.org/page/Reformatting+Tcl+code+indentation | 
|  | # See for licensing | 
|  |  | 
|  | proc reformat {tclcode {pad 4}} { | 
|  | set lines [split $tclcode \n] | 
|  | set out "" | 
|  | set continued no | 
|  | set oddquotes 0 | 
|  | set line [lindex $lines 0] | 
|  | set indent [expr {([string length $line]-[string length [string trimleft $line \ \t]])/$pad}] | 
|  | set pad [string repeat " " $pad] | 
|  |  | 
|  | foreach orig $lines { | 
|  | set newline [string trim $orig \ \t] | 
|  | set line [string repeat $pad $indent]$newline | 
|  | if {[string index $line end] eq "\\"} { | 
|  | if {!$continued} { | 
|  | incr indent 2 | 
|  | set continued yes | 
|  | } | 
|  | } elseif {$continued} { | 
|  | incr indent -2 | 
|  | set continued no | 
|  | } | 
|  |  | 
|  | if { ! [regexp {^[ \t]*\#} $line] } { | 
|  |  | 
|  | # oddquotes contains : 0 when quotes are balanced | 
|  | # and 1 when they are not | 
|  | set oddquotes [expr {([count $line \"] + $oddquotes) % 2}] | 
|  | if {! $oddquotes} { | 
|  | set  nbbraces  [count $line \{] | 
|  | incr nbbraces -[count $line \}] | 
|  | set brace   [string equal [string index $newline end] \{] | 
|  | set unbrace [string equal [string index $newline 0] \}] | 
|  | if {$nbbraces!=0 || $brace || $unbrace} { | 
|  | incr indent $nbbraces ;# [GWM] 010409 multiple close braces | 
|  | if {$indent<0} { | 
|  | error "unbalanced braces" | 
|  | } | 
|  | puts $unbrace | 
|  | puts $pad | 
|  | puts $nbbraces | 
|  | set np [expr {$unbrace? [string length $pad]:-$nbbraces*[string length $pad]}] | 
|  | set line [string range $line $np end] | 
|  | } | 
|  | } else { | 
|  | # unbalanced quotes, preserve original indentation | 
|  | set line $orig | 
|  | } | 
|  | } | 
|  | append out $line\n | 
|  | } | 
|  | return $out | 
|  | } | 
|  |  | 
|  | proc eol {} { | 
|  | switch -- $::tcl_platform(platform) { | 
|  | windows {return \r\n} | 
|  | unix {return \n} | 
|  | macintosh {return \r} | 
|  | default {error "no such platform: $::tc_platform(platform)"} | 
|  | } | 
|  | } | 
|  |  | 
|  | proc count {string char} { | 
|  | set count 0 | 
|  | while {[set idx [string first $char $string]]>=0} { | 
|  | set backslashes 0 | 
|  | set nidx $idx | 
|  | while {[string equal [string index $string [incr nidx -1]] \\]} { | 
|  | incr backslashes | 
|  | } | 
|  | if {$backslashes % 2 == 0} { | 
|  | incr count | 
|  | } | 
|  | set string [string range $string [incr idx] end] | 
|  | } | 
|  | return $count | 
|  | } | 
|  |  | 
|  | set usage "reformat.tcl ?-indent number? filename" | 
|  |  | 
|  | if {[llength $argv]!=0} { | 
|  | if {[lindex $argv 0] eq "-indent"} { | 
|  | set indent [lindex $argv 1] | 
|  | set argv [lrange $argv 2 end] | 
|  | } else  { | 
|  | set indent 4 | 
|  | } | 
|  | if {[llength $argv]>1} { | 
|  | error $usage | 
|  | } | 
|  | set f [open $argv r] | 
|  | set data [read $f] | 
|  | close $f | 
|  |  | 
|  | set filename "$argv.tmp" | 
|  | set f [open $filename  w] | 
|  |  | 
|  | puts -nonewline $f [reformat [string map [list [eol] \n] $data] $indent] | 
|  | close $f | 
|  | file copy -force $filename  $argv | 
|  | file delete -force $filename | 
|  |  | 
|  | } |