diff options
Diffstat (limited to 'tools/cmerge.nim')
-rw-r--r--[-rwxr-xr-x] | tools/cmerge.nim | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/tools/cmerge.nim b/tools/cmerge.nim index 729a8f218..35f2f5555 100755..100644 --- a/tools/cmerge.nim +++ b/tools/cmerge.nim @@ -1,31 +1,40 @@ # 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 + ProcessResult = enum prSkipIncludeDir, prAddIncludeDir + +proc process(dir, infile: string, outfile: File, + processed: var HashSet[string]): ProcessResult = + if processed.containsOrIncl(infile): return prSkipIncludeDir + let toProcess = dir / infile + if not fileExists(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: + writeLine(outfile, line) else: - writeln(outfile, line) + writeLine(outfile, line) proc main(dir, outfile: string) = - var o: TFile + var o: File if open(o, outfile, fmWrite): - var processed = newStringTable([outfile, "True"]) - for infile in walkfiles(dir / "*.c"): - process(dir, extractFilename(infile), o, processed) + var processed = initHashSet[string]() + processed.incl(outfile) + for infile in walkFiles(dir / "*.c"): + discard process(dir, extractFilename(infile), o, processed) close(o) else: quit("Cannot open for writing: " & outfile) -if ParamCount() != 2: - echo "Usage: cmerge directory outfile" +if paramCount() != 2: + quit "Usage: cmerge directory outfile" else: - main(ParamStr(1), addFileExt(ParamStr(2), "c")) + main(paramStr(1), addFileExt(paramStr(2), "c")) |