summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/system/ansi_c.nim5
-rw-r--r--lib/system/repr.nim4
-rw-r--r--lib/system/sysstr.nim14
3 files changed, 16 insertions, 7 deletions
diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim
index 5111bc3cf..da101cc2c 100644
--- a/lib/system/ansi_c.nim
+++ b/lib/system/ansi_c.nim
@@ -106,10 +106,13 @@ proc c_fopen(filename, mode: cstring): C_TextFileStar {.
   importc: "fopen", header: "<stdio.h>".}
 proc c_fclose(f: C_TextFileStar) {.importc: "fclose", header: "<stdio.h>".}
 
-proc c_sprintf(buf, frmt: cstring) {.header: "<stdio.h>", 
+proc c_sprintf(buf, frmt: cstring): int {.header: "<stdio.h>", 
   importc: "sprintf", varargs, noSideEffect.}
   # we use it only in a way that cannot lead to security issues
 
+proc c_localeconv():ptr cstring {.header: "<locale.h>",
+  importc: "localeconv", noSideEffect.}
+
 proc c_fread(buf: pointer, size, n: int, f: C_BinaryFileStar): int {.
   importc: "fread", header: "<stdio.h>".}
 proc c_fseek(f: C_BinaryFileStar, offset: clong, whence: int): int {.
diff --git a/lib/system/repr.nim b/lib/system/repr.nim
index 487bac052..f8f949668 100644
--- a/lib/system/repr.nim
+++ b/lib/system/repr.nim
@@ -17,12 +17,12 @@ proc reprFloat(x: float): string {.compilerproc.} = return $x
 
 proc reprPointer(x: pointer): string {.compilerproc.} =
   var buf: array [0..59, char]
-  c_sprintf(buf, "%p", x)
+  discard c_sprintf(buf, "%p", x)
   return $buf
 
 proc `$`(x: uint64): string =
   var buf: array [0..59, char]
-  c_sprintf(buf, "%llu", x)
+  discard c_sprintf(buf, "%llu", x)
   return $buf
 
 proc reprStrAux(result: var string, s: string) =
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim
index 4244bae4c..183ea0c8d 100644
--- a/lib/system/sysstr.nim
+++ b/lib/system/sysstr.nim
@@ -250,10 +250,16 @@ proc nimIntToStr(x: int): string {.compilerRtl.} =
   for j in 0..i div 2 - 1:
     swap(result[j], result[i-j-1])
 
-proc nimFloatToStr(x: float): string {.compilerproc.} =
-  var buf: array [0..59, char]
-  c_sprintf(buf, "%#.16e", x)
-  return $buf
+proc nimFloatToStr(f: float): string {.compilerproc.} =
+  var buf: array [0..64, char]
+  var n:int = c_sprintf(buf, "%.16g", f)
+  for i in 0..n-1:
+    if buf[i] notin {'0'..'9','-'}:
+      return $buf
+  buf[n] = c_localeconv()[0]
+  buf[n+1] = '0'
+  buf[n+2] = '\0'
+  result = $buf
 
 proc nimInt64ToStr(x: int64): string {.compilerRtl.} =
   result = newString(sizeof(x)*4)