Fix stdout reopen issue
This commit is contained in:
parent
972297c509
commit
359bc6e38a
5 changed files with 48 additions and 51 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -462,7 +462,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
|
||||
|
||||
|
|
@ -479,7 +479,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}"
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ type
|
|||
onSymbol*, onSymbolOverride*: OnSymbol
|
||||
onSymbolOverrideFinal*: OnSymbolOverrideFinal
|
||||
|
||||
outputHandle*: File
|
||||
|
||||
NimState {.used.} = ref object
|
||||
identifiers*: TableRef[string, string]
|
||||
|
||||
|
|
@ -94,3 +96,14 @@ const modeDefault {.used.} = $cpp # TODO: USE this everywhere relevant
|
|||
when not declared(CIMPORT):
|
||||
export gAtoms, gExpressions, gEnumVals, Kind, Ast, AstTable, 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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -22,12 +22,12 @@ proc printLisp(gState: State, root: TSNode) =
|
|||
|
||||
if node.tsNodeNamedChildCount() != 0:
|
||||
if gState.pretty:
|
||||
echo ""
|
||||
gecho ""
|
||||
nextnode = node.tsNodeNamedChild(0)
|
||||
depth += 1
|
||||
else:
|
||||
if gState.pretty:
|
||||
echo ")"
|
||||
gecho ")"
|
||||
else:
|
||||
stdout.write ")"
|
||||
nextnode = node.tsNodeNextNamedSibling()
|
||||
|
|
@ -39,7 +39,7 @@ proc printLisp(gState: State, root: TSNode) =
|
|||
if depth == -1:
|
||||
break
|
||||
if gState.pretty:
|
||||
echo spaces(depth) & ")"
|
||||
gecho spaces(depth) & ")"
|
||||
else:
|
||||
stdout.write ")"
|
||||
if node == root:
|
||||
|
|
@ -95,7 +95,7 @@ proc process(gState: State, path: string, astTable: AstTable) =
|
|||
elif gState.pnim:
|
||||
gState.printNim(path, root, astTable)
|
||||
elif gState.preprocess:
|
||||
echo gState.code
|
||||
gecho gState.code
|
||||
|
||||
# CLI processing with default values
|
||||
proc main(
|
||||
|
|
@ -149,32 +149,23 @@ 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}"
|
||||
|
||||
# Process grammar into AST
|
||||
let
|
||||
|
|
@ -182,17 +173,17 @@ proc main(
|
|||
|
||||
if pgrammar:
|
||||
# Print AST of grammar
|
||||
astTable.printGrammar()
|
||||
gState.printGrammar(astTable)
|
||||
elif source.nBl:
|
||||
# Print source after preprocess or Nim output
|
||||
if gState.pnim:
|
||||
printNimHeader()
|
||||
gState.printNimHeader()
|
||||
for src in source:
|
||||
gState.process(src.expandSymlinkAbs(), astTable)
|
||||
|
||||
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:
|
||||
|
|
@ -202,12 +193,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 = ""
|
||||
|
|
@ -234,14 +219,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 & "# Nim check with stub failed:\n\n" & check
|
||||
else:
|
||||
doAssert err == 0, "# Nim check failed:\n\n" & check
|
||||
doAssert err == 0, outputFile.readFile() & "# 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue