summary refs log tree commit diff stats
path: root/tools/cmerge.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tools/cmerge.nim')
-rw-r--r--[-rwxr-xr-x]tools/cmerge.nim39
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"))