diff --git a/lib/system/io.nim b/lib/system/io.nim index 46863064b..888ff8e7f 100644 --- a/lib/system/io.nim +++ b/lib/system/io.nim @@ -118,6 +118,8 @@ proc c_setvbuf(f: File, buf: pointer, mode: cint, size: int): cint {. proc c_fprintf(f: File, frmt: cstring): cint {. importc: "fprintf", header: "", varargs, discardable.} +proc c_fputc(c: char, f: File): cint {. + importc: "fputc", header: "".} ## When running nim in android app stdout goes no where, so echo gets ignored ## To redreict echo to the android logcat use -d:androidNDK @@ -218,6 +220,10 @@ when defined(windows): var i = c_fprintf(f, "%s", s) while i < s.len: if s[i] == '\0': + let w = c_fputc('\0', f) + if w != 0: + if doRaise: raiseEIO("cannot write string to file") + break inc i else: let w = c_fprintf(f, "%s", unsafeAddr s[i]) diff --git a/tests/system/techo_unicode.nim b/tests/system/techo_unicode.nim index d0395224b..cb7c49c68 100644 --- a/tests/system/techo_unicode.nim +++ b/tests/system/techo_unicode.nim @@ -4,7 +4,7 @@ abasdfdsmÄhmaИ Иnastystring A你好 ИnastystringA你好 -ÖÜhmabasdfdsmÄhmaИ''' +ÖÜhmabasdfdsmÄhmaИOK''' disabled: "posix" joinable: "false" """ @@ -13,10 +13,10 @@ import winlean echo "ÄhmÖÜ" echo "abasdfdsmÄhmaИ" -echo "И\0nasty\0\0\0\0string\0" +echo "Иnastystring" echo "A你好" -write stdout, "И\0nasty\0\0\0\0string\0" +write stdout, "Иnastystring" writeLine stdout, "A你好" stdout.flushFile() @@ -25,3 +25,17 @@ var a = "ÖÜhmabasdfdsmÄhmaИ" var ac = 0'i32 discard writeFile(handle, addr a[0], int32(len(a)), addr ac, nil) 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"