mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-22 08:51:21 +00:00
bugfix: optimization of complex constant string concatenations
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user