/* Curly Free script by D.G Sureau Available with other scripts at: www.scriptol.org This algorithm tests for unterminated blocks delimited by curly braces inside c or like sources. */ int main(int argsize, array arg) int left = 0 int right = 0 int linenum = 1 int last = 0 array stack = () int level = 0 text FLAG = nil boolean MULTI = false boolean MULTICLOSE = false print "Curly - www.scriptol.org" if argsize < 2: print "Usage: curly filename" exit() /if text fname = arg[1] print "Checking", fname, "for missing braces" ` reading the file array lines lines.load(fname) ` parsing for curly braces for text line in lines: boolean COMMENT = false FLAG = nil for text c in line: ` skipping comments if MULTI if MULTICLOSE if c = '/' MULTICLOSE = false MULTI = false continue /if /if if c = '*' MULTICLOSE = true continue /if continue ` any other char is skipped inside multi-lines comment /if if c = '*': if COMMENT MULTI = true COMMENT = false /if continue = '/': if COMMENT ? break ` skip the wholeline COMMENT = true continue /if ` clear flag set by operators / or * COMMENT = false MULTICLOSE = false ` this sequence skips code enclosed in quotes if FLAG <> nil: if c = FLAG ? FLAG = nil continue /if if c = '"': FLAG = c continue = "'": FLAG = c continue = '{': left + 1 level + 1 last = linenum stack.push(linenum) continue = '}': right + 1 level - 1 if level < 0: print "too much } at", linenum else: stack.pop() /if /if /for linenum + 1 /for print "left curly braces =", left print "right curly braces =", right int i = 0 if left = right: print "ok" else: print "unmatched =", level /if while level > 0: print "no closed at=", stack[i] i + 1 level - 1 /while return 0 main($argc, $argv)