|
|
#!/usr/bin/tclsh
|
|
|
# Naming conventions for typedefs
|
|
|
|
|
|
set typedefRegex [getParameter "type-regex" {^[A-Z][A-Za-z1-9]*$}]
|
|
|
|
|
|
proc createMachine {machineName initState} {
|
|
|
set machine [dict create name $machineName state $initState identifier "" bracesCounter 0]
|
|
|
return $machine
|
|
|
}
|
|
|
|
|
|
set tokenFilter {
|
|
|
typedef
|
|
|
leftbrace
|
|
|
rightbrace
|
|
|
semicolon
|
|
|
identifier
|
|
|
}
|
|
|
|
|
|
foreach fileName [getSourceFileNames] {
|
|
|
|
|
|
set machines [list]
|
|
|
|
|
|
set lastIdentifier ""
|
|
|
set lastIdentifier2 ""
|
|
|
set prev1 ""
|
|
|
set prev2 ""
|
|
|
foreach token [getTokens $fileName 1 0 -1 -1 $tokenFilter] {
|
|
|
set type [lindex $token 3]
|
|
|
set line [lindex $token 1]
|
|
|
|
|
|
# Retrieve identifier value
|
|
|
if {$type == "identifier"} {
|
|
|
set lastIdentifier2 $lastIdentifier
|
|
|
set lastIdentifier [lindex $token 0]
|
|
|
}
|
|
|
|
|
|
# If the type is a typedef, start a typedef state machine
|
|
|
if {$type == "typedef"} {
|
|
|
lappend machines [createMachine "typedef" "waitingForIdentifier"]
|
|
|
}
|
|
|
|
|
|
set machinesToKeep [list]
|
|
|
foreach m $machines {
|
|
|
set keepMachine 1
|
|
|
dict with m {
|
|
|
# typedef
|
|
|
if {$name == "typedef"} {
|
|
|
if {$state == "waitingForIdentifier"} {
|
|
|
if {$type == "leftbrace"} {
|
|
|
set state "consumeBraces"
|
|
|
incr bracesCounter
|
|
|
} elseif {$type == "semicolon"} {
|
|
|
if {$prev1 == "identifier"} {
|
|
|
# Check identifier
|
|
|
if {![regexp $typedefRegex $lastIdentifier]} {
|
|
|
report $fileName $line "The typedef names should match the following regex: $typedefRegex (found: $lastIdentifier)"
|
|
|
}
|
|
|
} else {
|
|
|
# Typedef without identifier
|
|
|
report $fileName $line "A typedef should have a name"
|
|
|
}
|
|
|
# End of the state machine
|
|
|
set keepMachine 0
|
|
|
}
|
|
|
} elseif {$state == "consumeBraces"} {
|
|
|
if {$type == "leftbrace"} {
|
|
|
incr bracesCounter
|
|
|
} elseif {$type == "rightbrace"} {
|
|
|
incr bracesCounter -1
|
|
|
if {$bracesCounter == 0} {
|
|
|
set state "waitingForIdentifier"
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if {$keepMachine} {
|
|
|
lappend machinesToKeep $m
|
|
|
}
|
|
|
}
|
|
|
set machines $machinesToKeep
|
|
|
|
|
|
set prev2 $prev1
|
|
|
set prev1 $type
|
|
|
}
|
|
|
}
|
|
|
|