aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2020-01-15 16:43:38 -0600
committerGanesh Viswanathan <dev@genotrance.com>2020-01-15 16:43:38 -0600
commitfa1c4c636ce58e798dbbe9701a264987247765a8 (patch)
tree60297c27f9b1604ddc5f61bf8f6eae5c1c5d4861
parentb1a56279ffc1870760520f19b6f4f9e17971fbc5 (diff)
parentb863b1d170f6d442c93eb0774f4a66a2a1f2ba4b (diff)
downloadnimterop-fa1c4c636ce58e798dbbe9701a264987247765a8.tar.gz
nimterop-fa1c4c636ce58e798dbbe9701a264987247765a8.zip
Merge v0.4.4 fixes
-rw-r--r--nimterop.nimble4
-rw-r--r--nimterop/ast.nim26
-rw-r--r--nimterop/ast2.nim8
-rw-r--r--nimterop/build.nim4
-rw-r--r--nimterop/getters.nim12
-rw-r--r--nimterop/globals.nim18
-rw-r--r--nimterop/grammar.nim4
-rw-r--r--nimterop/toast.nim46
8 files changed, 60 insertions, 62 deletions
diff --git a/nimterop.nimble b/nimterop.nimble
index 86be4dc..39a2346 100644
--- a/nimterop.nimble
+++ b/nimterop.nimble
@@ -1,6 +1,6 @@
# Package
-version = "0.4.3"
+version = "0.4.4"
author = "genotrance"
description = "C/C++ interop for Nim"
license = "MIT"
@@ -12,7 +12,7 @@ installDirs = @["nimterop"]
installFiles = @["config.nims"]
# Dependencies
-requires "nim >= 0.19.2", "regex >= 0.10.0", "cligen >= 0.9.17"
+requires "nim >= 0.19.6", "regex >= 0.13.0", "cligen >= 0.9.41"
import nimterop/docs
diff --git a/nimterop/ast.nim b/nimterop/ast.nim
index fcd9411..8ffb850 100644
--- a/nimterop/ast.nim
+++ b/nimterop/ast.nim
@@ -83,7 +83,7 @@ proc searchAstForNode(ast: ref Ast, node: TSNode, nimState: NimState): bool =
if nimState.gState.debug:
nimState.nodeBranch.add $node.tsNodeType()
- echo "#" & spaces(nimState.nodeBranch.len * 2) & nimState.nodeBranch[^1]
+ necho "#" & spaces(nimState.nodeBranch.len * 2) & nimState.nodeBranch[^1]
if ast.children.nBl:
if childNames.contains(ast.regex) or
@@ -111,14 +111,14 @@ proc searchAstForNode(ast: ref Ast, node: TSNode, nimState: NimState): bool =
result = node.saveNodeData(nimState)
else:
if nimState.gState.debug:
- echo "#" & spaces(nimState.nodeBranch.len * 2) & &" {ast.getRegexForAstChildren()} !=~ {childNames}"
+ necho "#" & spaces(nimState.nodeBranch.len * 2) & &" {ast.getRegexForAstChildren()} !=~ {childNames}"
elif node.getTSNodeNamedChildCountSansComments() == 0:
result = node.saveNodeData(nimState)
if nimState.gState.debug:
discard nimState.nodeBranch.pop()
if nimstate.nodeBranch.Bl:
- echo ""
+ necho ""
proc searchAst(root: TSNode, astTable: AstTable, nimState: NimState) =
var
@@ -133,7 +133,7 @@ proc searchAst(root: TSNode, astTable: AstTable, nimState: NimState) =
if name in astTable:
for ast in astTable[name]:
if nimState.gState.debug:
- echo "\n# " & nimState.getNodeVal(node).replace("\n", "\n# ") & "\n"
+ necho "\n# " & nimState.getNodeVal(node).replace("\n", "\n# ") & "\n"
if searchAstForNode(ast, node, nimState):
ast.tonim(ast, node, nimState)
if nimState.gState.debug:
@@ -166,8 +166,8 @@ proc searchAst(root: TSNode, astTable: AstTable, nimState: NimState) =
if node == root:
break
-proc printNimHeader*() =
- echo """# Generated at $1
+proc printNimHeader*(gState: State) =
+ gecho """# Generated at $1
# Command line:
# $2 $3
@@ -194,32 +194,32 @@ proc printNim*(gState: State, fullpath: string, root: TSNode, astTable: AstTable
root.searchAst(astTable, nimState)
if nimState.enumStr.nBl:
- echo &"{nimState.enumStr}\n"
+ necho &"{nimState.enumStr}\n"
nimState.constStr = nimState.getOverrideFinal(nskConst) & nimState.constStr
if nimState.constStr.nBl:
- echo &"const{nimState.constStr}\n"
+ necho &"const{nimState.constStr}\n"
- echo &"""
+ necho &"""
{{.pragma: {nimState.impShort}, importc{nimState.getHeader()}.}}
{{.pragma: {nimState.impShort}C, {nimState.impShort}, cdecl{nimState.getDynlib()}.}}
"""
nimState.typeStr = nimState.getOverrideFinal(nskType) & nimState.typeStr
if nimState.typeStr.nBl:
- echo &"type{nimState.typeStr}\n"
+ necho &"type{nimState.typeStr}\n"
nimState.procStr = nimState.getOverrideFinal(nskProc) & nimState.procStr
if nimState.procStr.nBl:
- echo &"{nimState.procStr}\n"
+ necho &"{nimState.procStr}\n"
if nimState.gState.debug:
if nimState.debugStr.nBl:
- echo nimState.debugStr
+ necho nimState.debugStr
if nimState.skipStr.nBl:
let
hash = nimState.skipStr.hash().abs()
sname = getTempDir() / &"nimterop_{$hash}.h"
- echo &"# Writing skipped definitions to {sname}\n"
+ necho &"# Writing skipped definitions to {sname}\n"
writeFile(sname, nimState.skipStr)
diff --git a/nimterop/ast2.nim b/nimterop/ast2.nim
index 810beea..e6f3a63 100644
--- a/nimterop/ast2.nim
+++ b/nimterop/ast2.nim
@@ -1,6 +1,6 @@
import macros, os, strutils, tables, times
-import compiler/[ast, astalgo, idents, options, renderer]
+import compiler/[ast, idents, options, renderer]
import "."/treesitter/api
@@ -806,8 +806,8 @@ proc searchTree(nimState: NimState, root: TSNode) =
if node == root:
break
-proc printNimHeader*() =
- echo """# Generated at $1
+proc printNimHeader*(gState: State) =
+ gecho """# Generated at $1
# Command line:
# $2 $3
@@ -845,4 +845,4 @@ proc printNim*(gState: State, fullpath: string, root: TSNode) =
tree.add nimState.typeSection
tree.add nimState.procSection
- echo tree.renderTree()
+ gecho tree.renderTree()
diff --git a/nimterop/build.nim b/nimterop/build.nim
index 3eec406..7939afa 100644
--- a/nimterop/build.nim
+++ b/nimterop/build.nim
@@ -460,7 +460,7 @@ proc configure*(path, check: string, flags = "") =
echo "# Running autogen.sh"
echo execAction(
- &"cd {(path / i).parentDir().sanitizePath} && bash autogen.sh").output
+ &"cd {(path / i).parentDir().sanitizePath} && bash ./autogen.sh").output
break
@@ -477,7 +477,7 @@ proc configure*(path, check: string, flags = "") =
echo "# Running configure " & flags
var
- cmd = &"cd {path.sanitizePath} && bash configure"
+ cmd = &"cd {path.sanitizePath} && bash ./configure"
if flags.len != 0:
cmd &= &" {flags}"
diff --git a/nimterop/getters.nim b/nimterop/getters.nim
index 2469d1c..94bfbb3 100644
--- a/nimterop/getters.nim
+++ b/nimterop/getters.nim
@@ -445,20 +445,16 @@ proc printTree*(nimState: NimState, pnode: PNode, offset = "") =
else:
stdout.write ")"
if offset.len == 0:
- echo ""
-
-template decho*(str: untyped): untyped =
- if nimState.gState.debug:
- echo str.getCommented()
+ necho ""
proc printDebug*(nimState: NimState, node: TSNode) =
if nimState.gState.debug:
- echo ("Input => " & nimState.getNodeVal(node)).getCommented()
- echo nimState.gState.printLisp(node).getCommented()
+ necho ("Input => " & nimState.getNodeVal(node)).getCommented()
+ necho nimState.gState.printLisp(node).getCommented()
proc printDebug*(nimState: NimState, pnode: PNode) =
if nimState.gState.debug:
- echo ("Output => " & $pnode).getCommented()
+ necho ("Output => " & $pnode).getCommented()
nimState.printTree(pnode)
# Compiler shortcuts
diff --git a/nimterop/globals.nim b/nimterop/globals.nim
index e123dd7..cc7d499 100644
--- a/nimterop/globals.nim
+++ b/nimterop/globals.nim
@@ -45,6 +45,8 @@ type
onSymbol*, onSymbolOverride*: OnSymbol
onSymbolOverrideFinal*: OnSymbolOverrideFinal
+ outputHandle*: File
+
NimState {.used.} = ref object
identifiers*: TableRef[string, string]
@@ -83,3 +85,19 @@ const modeDefault {.used.} = $cpp # TODO: USE this everywhere relevant
when not declared(CIMPORT):
export gAtoms, gExpressions, gEnumVals, State, NimState,
nBl, Bl, CompileMode, modeDefault
+
+ # Redirect output to file when required
+ template gecho*(args: string) {.dirty.} =
+ if gState.outputHandle.isNil:
+ echo args
+ else:
+ gState.outputHandle.writeLine(args)
+
+ template necho*(args: string) {.dirty.} =
+ let gState = nimState.gState
+ gecho args
+
+ template decho*(str: untyped): untyped =
+ if nimState.gState.debug:
+ let gState = nimState.gState
+ necho str.getCommented()
diff --git a/nimterop/grammar.nim b/nimterop/grammar.nim
index 9f50ba4..ba0e9fc 100644
--- a/nimterop/grammar.nim
+++ b/nimterop/grammar.nim
@@ -735,7 +735,7 @@ proc parseGrammar*(): AstTable =
else:
result[n].add(ast)
-proc printGrammar*(astTable: AstTable) =
+proc printGrammar*(gState: State, astTable: AstTable) =
for name in astTable.keys():
for ast in astTable[name]:
- echo ast.printAst()
+ gecho ast.printAst()
diff --git a/nimterop/toast.nim b/nimterop/toast.nim
index f775738..1909c4a 100644
--- a/nimterop/toast.nim
+++ b/nimterop/toast.nim
@@ -42,11 +42,11 @@ proc process(gState: State, path: string) =
tree.tsTreeDelete()
if gState.past:
- echo gState.printLisp(root)
+ gecho gState.printLisp(root)
elif gState.pnim:
gState.printNim(path, root)
elif gState.preprocess:
- echo gState.code
+ gecho gState.code
# CLI processing with default values
proc main(
@@ -99,43 +99,34 @@ proc main(
if pluginSourcePath.nBl:
gState.loadPlugin(pluginSourcePath)
- # Backup stdout
var
outputFile = output
- outputHandle: File
- stdoutBackup = stdout
check = check or stub
- # Fix output file extention
- if outputFile.len != 0:
+ # Fix output file extention for Nim mode
+ if outputFile.len != 0 and pnim:
if outputFile.splitFile().ext != ".nim":
outputFile = outputFile & ".nim"
# Check needs a file
if check and outputFile.len == 0:
outputFile = getTempDir() / "toast_" & ($getTime().toUnix()).addFileExt("nim")
- when defined(windows):
- # https://github.com/nim-lang/Nim/issues/12939
- echo &"Cannot print wrapper with check on Windows, review {outputFile}\n"
# Redirect output to file
if outputFile.len != 0:
- when defined(windows):
- doAssert stdout.reopen(outputFile, fmWrite), &"Failed to write to {outputFile}"
- else:
- doAssert outputHandle.open(outputFile, fmWrite), &"Failed to write to {outputFile}"
- stdout = outputHandle
+ doAssert gState.outputHandle.open(outputFile, fmWrite),
+ &"Failed to write to {outputFile}"
if source.nBl:
# Print source after preprocess or Nim output
if gState.pnim:
- printNimHeader()
+ gState.printNimHeader()
for src in source:
gState.process(src.expandSymlinkAbs())
- when not defined(windows):
- # Restore stdout
- stdout = stdoutBackup
+ # Close outputFile
+ if outputFile.len != 0:
+ gState.outputHandle.close()
# Check Nim output
if gState.pnim and check:
@@ -145,12 +136,6 @@ proc main(
if err != 0:
# Failed check so try stubbing
if stub:
- # Close output file to prepend stubs
- when not defined(windows):
- outputHandle.close()
- else:
- stdout.close()
-
# Find undeclared identifiers in error
var
data = ""
@@ -177,14 +162,13 @@ proc main(
# Rerun nim check on stubbed wrapper
(check, err) = execCmdEx(&"{gState.nim} check {outputFile}")
- doAssert err == 0, "# Nim check with stub failed:\n\n" & check
+ doAssert err == 0, data & "\n# Nim check with stub failed:\n\n" & check
else:
- doAssert err == 0, "# Nim check failed:\n\n" & check
+ doAssert err == 0, outputFile.readFile() & "\n# Nim check failed:\n\n" & check
- when not defined(windows):
- # Print wrapper if temporarily redirected to file
- if check and output.len == 0:
- stdout.write outputFile.readFile()
+ # Print wrapper if temporarily redirected to file
+ if check and output.len == 0:
+ stdout.write outputFile.readFile()
when isMainModule:
# Setup cligen command line help and short flags