| #!/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 | |
| } |