bugfix: optimization of complex constant string concatenations

This commit is contained in:
Araq
2012-02-17 02:16:33 +01:00
parent 88f9eff38f
commit 97366d4419
7 changed files with 43 additions and 16 deletions

View File

@@ -1,26 +1,35 @@
# Simple tool to merge C projects into a single C file
import os, strtabs, pegs
import os, sets, pegs
proc process(dir, infile: string, outfile: TFile, processed: PStringTable) =
if processed.hasKey(infile): return
processed[infile] = "True"
echo "adding: ", infile
for line in lines(dir / infile):
type
TProcessResult = enum prSkipIncludeDir, prAddIncludeDir
proc process(dir, infile: string, outfile: TFile,
processed: var TSet[string]): TProcessResult =
if processed.containsOrIncl(infile): return prSkipIncludeDir
let toProcess = dir / infile
if not existsFile(toProcess):
echo "Warning: could not process: ", toProcess
return prAddIncludeDir
echo "adding: ", toProcess
for line in lines(toProcess):
if line =~ peg"""s <- ig '#include' ig '"' {[^"]+} '"' ig
comment <- '/*' !'*/'* '*/' / '//' .*
ig <- (comment / \s+)* """:
# follow the include file:
process(dir, matches[0], outfile, processed)
if process(dir, matches[0], outfile, processed) == prAddIncludeDir:
writeln(outfile, line)
else:
writeln(outfile, line)
proc main(dir, outfile: string) =
var o: TFile
if open(o, outfile, fmWrite):
var processed = newStringTable([outfile, "True"])
var processed = initSet[string]()
processed.incl(outfile)
for infile in walkfiles(dir / "*.c"):
process(dir, extractFilename(infile), o, processed)
discard process(dir, extractFilename(infile), o, processed)
close(o)
else:
quit("Cannot open for writing: " & outfile)