写的比较罗嗦,就当抛砖引玉了。
#!/bin/sh
# start tclsh form your PATH \
exec tclsh "$0" "$@"
if {$argc == 0} {
puts "Line counter"
puts "Usage: $argv0 \[file ..\]"
exit
}
#initial result array
set result(all,commentNum) 0
set result(all,codeNum) 0
set result(all,blankNum) 0
set fileNum 0
foreach thisFile $argv {
# if the file is not exist
if {![file isfile $thisFile]} {
puts "$thisFile is not a file, pls check."
continue
}
# if the file can''t be read
if {[catch {set fp [open $thisFile r]} errStr]} {
puts stderr "\n$errStr\n"
continue
}
set commentFlg 0 ;# flag for "\* *\" comment
#initial line counter
set commentNum 0 ;# comment line number
set codeNum 0 ;# code line number
set blankNum 0 ;# blank line or blank line number
foreach line [split [read $fp] \n] {
#puts $line
switch -regexp -- $line {
{^.*/\*.*\*/.*$} {
# when meet */, finish comment
set commentFlg 0
# <code> /* comment */ <code>
if {[regexp {^\s*/\*.*\*/\s*$} $line]} {
# /* comment */
incr commentNum
} else {
# <code> /* comment */
# or
# /* comment */ <code>
incr codeNum
}
}
{^.*/\*} {
# meet /*
set commentFlg 1
if {[regexp {^\s*/\*} $line]} {
# /* comment
incr commentNum
} else {
# <code> /* comment
incr codeNum
}
}
{^.*\*/} {
# meet */
set commentFlg 0
if {[regexp {\*/\s*$} $line]} {
# */ \n
incr commentNum
} else {
# */ <code>
incr codeNum
}
}
{^[[:space:]]*$} {
incr blankNum
}
{^\s*//} {
# /s is same to [[:space:]]
incr commentNum
}
default {
if {$commentFlg} {
incr commentNum
continue
} else {
incr codeNum
}
}
}
}
close $fp
puts "\n*********************************"
puts $thisFile
puts "code line: $codeNum"
puts "comment line: $commentNum"
puts "blank line: $blankNum"
puts "*********************************"
set result(all,commentNum) [expr $result(all,commentNum) + $commentNum]
set result(all,codeNum) [expr $result(all,codeNum) + $codeNum]
set result(all,blankNum) [expr $result(all,blankNum) + $blankNum]
incr fileNum
}
puts "\n*********************************"
puts "total $fileNum files"
puts "code line: $result(all,codeNum)"
puts "comment line: $result(all,commentNum)"
puts "blank line: $result(all,blankNum)"
puts "*********************************\n"
转自edacn
