diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim index 5111bc3cf5..da101cc2c6 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: "".} proc c_fclose(f: C_TextFileStar) {.importc: "fclose", header: "".} -proc c_sprintf(buf, frmt: cstring) {.header: "", +proc c_sprintf(buf, frmt: cstring): int {.header: "", importc: "sprintf", varargs, noSideEffect.} # we use it only in a way that cannot lead to security issues +proc c_localeconv():ptr cstring {.header: "", + importc: "localeconv", noSideEffect.} + proc c_fread(buf: pointer, size, n: int, f: C_BinaryFileStar): int {. importc: "fread", header: "".} proc c_fseek(f: C_BinaryFileStar, offset: clong, whence: int): int {. diff --git a/lib/system/repr.nim b/lib/system/repr.nim index 487bac0527..f8f9496680 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 4244bae4cb..183ea0c8d1 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)