cstring->pointer in MemSlice to make consistent with MemFile and
also to make more clear the care required to use MemSlice instances. (E.g., memXXX functions rather than strXXX functions).
This commit is contained in:
parent
f2c5676767
commit
0b4c816cba
1 changed files with 8 additions and 8 deletions
|
|
@ -246,16 +246,16 @@ proc close*(f: var MemFile) =
|
||||||
if error: raiseOSError(lastErr)
|
if error: raiseOSError(lastErr)
|
||||||
|
|
||||||
type MemSlice* {.unchecked.} = object
|
type MemSlice* {.unchecked.} = object
|
||||||
data*: cstring
|
data*: pointer
|
||||||
size*: int
|
size*: int
|
||||||
|
|
||||||
iterator memSlices*(mfile: MemFile, delim='\l', eat='\r'): MemSlice {.inline.} =
|
iterator memSlices*(mfile: MemFile, delim='\l', eat='\r'): MemSlice {.inline.} =
|
||||||
proc c_memchr(cstr: cstring, c: char, n: csize): cstring {.
|
proc c_memchr(cstr: pointer, c: char, n: csize): pointer {.
|
||||||
importc: "memchr", header: "<string.h>" .}
|
importc: "memchr", header: "<string.h>" .}
|
||||||
proc `-!`(p, q: cstring): int {.inline.} = return cast[int](p) -% cast[int](q)
|
proc `-!`(p, q: pointer): int {.inline.} = return cast[int](p) -% cast[int](q)
|
||||||
var ms: MemSlice
|
var ms: MemSlice
|
||||||
var ending: cstring
|
var ending: pointer
|
||||||
ms.data = cast[cstring](mfile.mem)
|
ms.data = mfile.mem
|
||||||
var remaining = mfile.size
|
var remaining = mfile.size
|
||||||
while remaining > 0:
|
while remaining > 0:
|
||||||
ending = c_memchr(ms.data, delim, remaining)
|
ending = c_memchr(ms.data, delim, remaining)
|
||||||
|
|
@ -264,11 +264,11 @@ iterator memSlices*(mfile: MemFile, delim='\l', eat='\r'): MemSlice {.inline.} =
|
||||||
yield ms
|
yield ms
|
||||||
break
|
break
|
||||||
ms.size = ending -! ms.data # delim is NOT included
|
ms.size = ending -! ms.data # delim is NOT included
|
||||||
if eat != '\0' and ms.size > 0 and ms.data[ms.size - 1] == eat:
|
if eat != '\0' and ms.size > 0 and cast[cstring](ms.data)[ms.size - 1] == eat:
|
||||||
dec(ms.size) # trim pre-delim char
|
dec(ms.size) # trim pre-delim char
|
||||||
yield ms
|
yield ms
|
||||||
ms.data = cast[cstring](cast[int](ending) +% 1) # skip delim
|
ms.data = cast[pointer](cast[int](ending) +% 1) # skip delim
|
||||||
remaining = mfile.size - (ms.data -! cast[cstring](mfile.mem))
|
remaining = mfile.size - (ms.data -! mfile.mem)
|
||||||
|
|
||||||
proc toString*(ms: MemSlice): string {.inline.} =
|
proc toString*(ms: MemSlice): string {.inline.} =
|
||||||
proc toNimStr(str: cstring, len: int): string {. importc: "toNimStr" .}
|
proc toNimStr(str: cstring, len: int): string {. importc: "toNimStr" .}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue