diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 1fd08e7636..3e24ce57b5 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -539,11 +539,11 @@ when not weirdTarget and (defined(freebsd) or defined(dragonfly) or defined(netb when not weirdTarget and (defined(linux) or defined(solaris) or defined(bsd) or defined(aix)): proc getApplAux(procPath: string): string = - result = newString(maxSymlinkLen) - var len = readlink(procPath, result.cstring, maxSymlinkLen) + result = newString(maxSymlinkLen+1) # TODO: fixme how to ? + var len = readlink(procPath, cast[cstring](addr result[0]), maxSymlinkLen) if len > maxSymlinkLen: result = newString(len+1) - len = readlink(procPath, result.cstring, len) + len = readlink(procPath, cast[cstring](addr result[0]), len) setLen(result, len) when not weirdTarget and defined(openbsd): diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim index 8ae7fb3c1d..7691b2d16c 100644 --- a/lib/pure/streams.nim +++ b/lib/pure/streams.nim @@ -378,7 +378,7 @@ proc write*(s: Stream, x: string) = var x = x writeData(s, addr(x), x.len) else: - writeData(s, cstring(x), x.len) + writeData(s, addr x[0], x.len) proc write*(s: Stream, args: varargs[string, `$`]) = ## Writes one or more strings to the the stream. No length fields or @@ -937,11 +937,12 @@ proc peekFloat64*(s: Stream): float64 = peek(s, result) proc readStrPrivate(s: Stream, length: int, str: var string) = + if length == 0: return if length > len(str): setLen(str, length) when defined(js): let L = readData(s, addr(str), length) else: - let L = readData(s, cstring(str), length) + let L = readData(s, addr(str[0]), length) if L != len(str): setLen(str, L) proc readStr*(s: Stream, length: int, str: var string) {.since: (1, 3).} = @@ -963,11 +964,13 @@ proc readStr*(s: Stream, length: int): string = readStrPrivate(s, length, result) proc peekStrPrivate(s: Stream, length: int, str: var string) = + # TODO: fixme breaking changes: cannot modify strings by cstring + if length == 0: return if length > len(str): setLen(str, length) when defined(js): let L = peekData(s, addr(str), length) else: - let L = peekData(s, cstring(str), length) + let L = peekData(s, addr str[0], length) if L != len(str): setLen(str, L) proc peekStr*(s: Stream, length: int, str: var string) {.since: (1, 3).} = diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index d1ffc4acbd..87a111f4a9 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -1981,7 +1981,7 @@ func find*(s: string, sub: char, start: Natural = 0, last = -1): int {.rtl, if length > 0: let found = c_memchr(s[start].unsafeAddr, sub, cast[csize_t](length)) if not found.isNil: - return cast[int](found) -% cast[int](s.cstring) + return cast[int](found) -% cast[int](s[0].addr) else: findImpl() diff --git a/lib/system/strs_v3.nim b/lib/system/strs_v3.nim index 527e6c96a7..222729539a 100644 --- a/lib/system/strs_v3.nim +++ b/lib/system/strs_v3.nim @@ -144,7 +144,7 @@ proc nimToCStringConv(s: NimStringV3): cstring {.compilerproc, nonReloadable, in else: ## TODO: fixme: inject conversions somewhere else and be cleaned up ## but let it leak for now - let len = s.nimStrLenV3+1 + let len = s.nimStrLenV3 result = cast[cstring](allocShared0(len+1)) copyMem(result, unsafeAddr s.p[0], len)