1# Curly brackets from the same pair should be either in the same line or in the same column
2
3proc acceptPairs {} {
4    global file parens index end
5
6    while {$index != $end} {
7        set nextToken [lindex $parens $index]
8        set tokenValue [lindex $nextToken 0]
9
10        if {$tokenValue == "\{"} {
11            incr index
12            set leftParenLine [lindex $nextToken 1]
13            set leftParenColumn [lindex $nextToken 2]
14
15            acceptPairs
16
17            if {$index == $end} {
18                report $file $leftParenLine "opening curly bracket is not closed"
19                return
20            }
21
22            set nextToken [lindex $parens $index]
23            incr index
24            set tokenValue [lindex $nextToken 0]
25            set rightParenLine [lindex $nextToken 1]
26            set rightParenColumn [lindex $nextToken 2]
27
28            if {($leftParenLine != $rightParenLine) && ($leftParenColumn != $rightParenColumn)} {
29                # make an exception for line continuation
30                set leftLine [getLine $file $leftParenLine]
31                set rightLine [getLine $file $rightParenLine]
32                if {[string index $leftLine end] != "\\" && [string index $rightLine end] != "\\"} {
33                    report $file $rightParenLine "closing curly bracket not in the same line or column"
34                }
35            }
36        } else {
37            return
38        }
39    }
40}
41
42foreach file [getSourceFileNames] {
43    set parens [getTokens $file 1 0 -1 -1 {leftbrace rightbrace}]
44    set index 0
45    set end [llength $parens]
46    acceptPairs
47    if {$index != $end} {
48        report $file [lindex [lindex $parens $index] 1] "excessive closing bracket?"
49    }
50}
51