fixes #12315 [backport]; refs #12314 (#12385)

This commit is contained in:
Andreas Rumpf 2019-10-08 20:49:45 +02:00 • committed by GitHub
commit f30da2f266
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 3 deletions

View file

@ -118,6 +118,8 @@ proc c_setvbuf(f: File, buf: pointer, mode: cint, size: int): cint {.
proc c_fprintf(f: File, frmt: cstring): cint {. proc c_fprintf(f: File, frmt: cstring): cint {.
importc: "fprintf", header: "<stdio.h>", varargs, discardable.} importc: "fprintf", header: "<stdio.h>", varargs, discardable.}
proc c_fputc(c: char, f: File): cint {.
importc: "fputc", header: "<stdio.h>".}
## When running nim in android app stdout goes no where, so echo gets ignored ## When running nim in android app stdout goes no where, so echo gets ignored
## To redreict echo to the android logcat use -d:androidNDK ## To redreict echo to the android logcat use -d:androidNDK
@ -218,6 +220,10 @@ when defined(windows):
var i = c_fprintf(f, "%s", s) var i = c_fprintf(f, "%s", s)
while i < s.len: while i < s.len:
if s[i] == '\0': if s[i] == '\0':
let w = c_fputc('\0', f)
if w != 0:
if doRaise: raiseEIO("cannot write string to file")
break
inc i inc i
else: else:
let w = c_fprintf(f, "%s", unsafeAddr s[i]) let w = c_fprintf(f, "%s", unsafeAddr s[i])

View file

@ -4,7 +4,7 @@ abasdfdsmÄhmaИ
Иnastystring Иnastystring
A你好 A你好
ИnastystringA你好 ИnastystringA你好
ÖÜhmabasdfdsmÄhmaИ''' ÖÜhmabasdfdsmÄhmaИOK'''
disabled: "posix" disabled: "posix"
joinable: "false" joinable: "false"
""" """
@ -13,10 +13,10 @@ import winlean
echo "ÄhmÖÜ" echo "ÄhmÖÜ"
echo "abasdfdsmÄhmaИ" echo "abasdfdsmÄhmaИ"
echo "И\0nasty\0\0\0\0string\0" echo "Иnastystring"
echo "A你好" echo "A你好"
write stdout, "И\0nasty\0\0\0\0string\0" write stdout, "Иnastystring"
writeLine stdout, "A你好" writeLine stdout, "A你好"
stdout.flushFile() stdout.flushFile()
@ -25,3 +25,17 @@ var a = "ÖÜhmabasdfdsmÄhmaИ"
var ac = 0'i32 var ac = 0'i32
discard writeFile(handle, addr a[0], int32(len(a)), addr ac, nil) discard writeFile(handle, addr a[0], int32(len(a)), addr ac, nil)
stdout.flushFile() stdout.flushFile()
import os
let str = "some nulls: \0\0\0 (three of them)"
let fpath = getTempDir() / "file_with_nulls.bin"
writeFile(fpath, str)
doAssert(getFileSize(fpath) == 31)
doAssert(readFile(fpath) == str)
removeFile(fpath)
echo "OK"