Skip to content

Commit

Permalink
VM FFI: write(stderr, msg) and fprintf(cstderr, msg) now work at CT (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
timotheecour authored and Araq committed Jan 12, 2020
1 parent 1c001fe commit ee1563e
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
10 changes: 8 additions & 2 deletions lib/system/ansi_c.nim
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,15 @@ type
incompleteStruct.} = object
CFilePtr* = ptr CFile ## The type representing a file handle.

# duplicated between io and ansi_c
const stderrName = when defined(osx): "__stderrp" else: "stderr"
const stdoutName = when defined(osx): "__stdoutp" else: "stdout"
const stdinName = when defined(osx): "__stdinp" else: "stdin"

var
cstderr* {.importc: "stderr", header: "<stdio.h>".}: CFilePtr
cstdout* {.importc: "stdout", header: "<stdio.h>".}: CFilePtr
cstderr* {.importc: stderrName, header: "<stdio.h>".}: CFilePtr
cstdout* {.importc: stdoutName, header: "<stdio.h>".}: CFilePtr
cstdin* {.importc: stdinName, header: "<stdio.h>".}: CFilePtr

proc c_fprintf*(f: CFilePtr, frmt: cstring): cint {.
importc: "fprintf", header: "<stdio.h>", varargs, discardable.}
Expand Down
11 changes: 8 additions & 3 deletions lib/system/io.nim
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,17 @@ type

# text file handling:
when not defined(nimscript) and not defined(js):
# duplicated between io and ansi_c
const stderrName = when defined(osx): "__stderrp" else: "stderr"
const stdoutName = when defined(osx): "__stdoutp" else: "stdout"
const stdinName = when defined(osx): "__stdinp" else: "stdin"

var
stdin* {.importc: "stdin", header: "<stdio.h>".}: File
stdin* {.importc: stdinName, header: "<stdio.h>".}: File
## The standard input stream.
stdout* {.importc: "stdout", header: "<stdio.h>".}: File
stdout* {.importc: stdoutName, header: "<stdio.h>".}: File
## The standard output stream.
stderr* {.importc: "stderr", header: "<stdio.h>".}: File
stderr* {.importc: stderrName, header: "<stdio.h>".}: File
## The standard error stream.

when defined(useStdoutAsStdmsg):
Expand Down
13 changes: 13 additions & 0 deletions tests/vm/tevalffi.nim
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ foo:102:103
foo:102:103:104
foo:0.03:asdf:103:105
ret={s1:foobar s2:foobar age:25 pi:3.14}
hello world stderr
hi stderr
'''
output: '''
foo
Expand All @@ -17,6 +19,8 @@ foo:102:103
foo:102:103:104
foo:0.03:asdf:103:105
ret={s1:foobar s2:foobar age:25 pi:3.14}
hello world stderr
hi stderr
'''
disabled: "true"
"""
Expand Down Expand Up @@ -76,6 +80,15 @@ proc fun() =
if false:
c_printf("foo2:a=%d\n", a2)


static:
fun()
fun()

when true:
import system/ansi_c
proc fun2()=
c_fprintf(cstderr, "hello world stderr\n")
write(stderr, "hi stderr\n")
static: fun2()
fun2()

0 comments on commit ee1563e

Please sign in to comment.