Add function to remove function bodies

This commit is contained in:
Joey Yakimowich-Payne 2019-03-22 09:53:23 -06:00
commit d6f8d140cc
4 changed files with 39 additions and 2 deletions

View file

@ -28,6 +28,9 @@ proc c2nim*(fl, outfile: string, c2nimConfig: c2nimConfigObj) =
cfile = "temp-$#.c" % [outfile.extractFilename()]
writeFileFlush(cfile, runCtags(file))
if c2nimConfig.removeBodies:
removeBodies(cfile)
if c2nimConfig.defines and (c2nimConfig.preprocess or c2nimConfig.ctags):
prepend(cfile, getDefines(file, c2nimConfig.inline))
@ -103,6 +106,8 @@ proc c2nim*(fl, outfile: string, c2nimConfig: c2nimConfigObj) =
except:
discard
else:
if c2nimConfig.removeBodies:
reAddBodies(cfile)
reAddStatic(cfile)
# Nim doesn't like {.cdecl.} for type proc()

View file

@ -91,6 +91,36 @@ proc removeStatic*(filename: string) =
result.add(body.replace(re"(?m)^(.*\n?)", "//$1"))
)
proc removeBodies*(filename: string) =
## Replace function bodies with a semicolon and commented
## out body
withFile(filename):
content = content.replace(
re"(?m)(.*?\))(\s*\{(\s*?.*?$)*?[\n\r]\})",
proc (m: RegexMatch, s: string): string =
let funcDecl = s[m.group(0)[0]]
let body = s[m.group(1)[0]].strip()
result = ""
result.add("$#;" % [funcDecl])
result.add(body.replace(re"(?m)^(.*\n?)", "//$1"))
)
proc reAddBodies*(filename: string) =
## Uncomment out the body and remove the semicolon. Undoes
## removeBodies
withFile(filename):
content = content.replace(
re"(?m)(.*?\))(\s*\{(\s*?.*?$)*?[\n\r]\})",
proc (m: RegexMatch, s: string): string =
let funcDecl = s[m.group(0)[0]]
let body = s[m.group(1)[0]].strip()
result = ""
result.add("$# " % [funcDecl])
result.add(body.replace(re"(?m)^\/\/(.*\n?)", "$1"))
)
proc reAddStatic*(filename: string) =
## Uncomment out the body and remove the semicolon. Undoes
## removeStatic

View file

@ -32,7 +32,7 @@ var
type
c2nimConfigObj* = object
flags*, ppflags*: string
recurse*, inline*, preprocess*, ctags*, defines*: bool
recurse*, inline*, preprocess*, removeBodies*, ctags*, defines*: bool
dynlib*, compile*, pragma*: seq[string]
const gDoc* = """

View file

@ -130,6 +130,8 @@ proc runFile*(file: string, cfgin: OrderedTableRef = newOrderedTable[string, str
c2nimConfig.inline = true
elif action == "preprocess":
c2nimConfig.preprocess = true
elif action == "removeBodies":
c2nimConfig.removeBodies = true
elif action == "ctags":
c2nimConfig.ctags = true
elif action == "defines":
@ -406,4 +408,4 @@ proc runCli*() =
uniq += 1
for file in files:
runFile(file, cfg)
runFile(file, cfg)