From 64b0485207f428ce3941061b1c165ec8004b2c96 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Sun, 5 Jun 2016 12:03:20 +0800 Subject: fix types of ansi_c/sysio to more closely match C ABI also fixes some instances of using C library functions when there are nim alternatives available --- lib/pure/memfiles.nim | 6 ++---- lib/pure/os.nim | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/memfiles.nim b/lib/pure/memfiles.nim index b9c574944..ff3e74d59 100644 --- a/lib/pure/memfiles.nim +++ b/lib/pure/memfiles.nim @@ -257,12 +257,10 @@ type MemSlice* = object ## represent slice of a MemFile for iteration over deli data*: pointer size*: int -proc c_memcpy(a, b: pointer, n: int) {.importc: "memcpy", header: "".} - proc `$`*(ms: MemSlice): string {.inline.} = ## Return a Nim string built from a MemSlice. var buf = newString(ms.size) - c_memcpy(addr(buf[0]), ms.data, ms.size) + copyMem(addr(buf[0]), ms.data, ms.size) buf[ms.size] = '\0' result = buf @@ -329,7 +327,7 @@ iterator lines*(mfile: MemFile, buf: var TaintedString, delim='\l', eat='\r'): T for ms in memSlices(mfile, delim, eat): buf.setLen(ms.size) - c_memcpy(addr(buf[0]), ms.data, ms.size) + copyMem(addr(buf[0]), ms.data, ms.size) buf[ms.size] = '\0' yield buf diff --git a/lib/pure/os.nim b/lib/pure/os.nim index dee227c69..2b8dca497 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -61,7 +61,7 @@ proc osErrorMsg*(): string {.rtl, extern: "nos$1", deprecated.} = result = $msgbuf if msgbuf != nil: localFree(msgbuf) if errno != 0'i32: - result = $os.strerror(errno) + result = $os.c_strerror(errno) {.push warning[deprecated]: off.} proc raiseOSError*(msg: string = "") {.noinline, rtl, extern: "nos$1", @@ -114,7 +114,7 @@ proc osErrorMsg*(errorCode: OSErrorCode): string = if msgbuf != nil: localFree(msgbuf) else: if errorCode != OSErrorCode(0'i32): - result = $os.strerror(errorCode.int32) + result = $os.c_strerror(errorCode.int32) proc raiseOSError*(errorCode: OSErrorCode; additionalInfo = "") {.noinline.} = ## Raises an ``OSError`` exception. The ``errorCode`` will determine the -- cgit 1.4.1-2-gfad0 From fe2b39f0074e732b24d6993dd6a0b0947bd511e2 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Sun, 5 Jun 2016 20:16:26 +0800 Subject: remove system/ansi_c include from os --- lib/pure/os.nim | 16 +++++++++++++++- lib/system/ansi_c.nim | 26 -------------------------- lib/system/debugger.nim | 4 ++-- lib/system/excpt.nim | 2 +- lib/system/sysstr.nim | 2 +- 5 files changed, 19 insertions(+), 31 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 2b8dca497..86dd903e7 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -26,7 +26,6 @@ elif defined(posix): else: {.error: "OS module not ported to your operating system!".} -include "system/ansi_c" include ospaths when defined(posix): @@ -37,6 +36,21 @@ when defined(posix): var pathMax {.importc: "PATH_MAX", header: "".}: cint +proc c_remove(filename: cstring): cint {. + importc: "remove", header: "".} +proc c_rename(oldname, newname: cstring): cint {. + importc: "rename", header: "".} +proc c_system(cmd: cstring): cint {. + importc: "system", header: "".} +proc c_strerror(errnum: cint): cstring {. + importc: "strerror", header: "".} +proc c_strlen(a: cstring): cint {. + importc: "strlen", header: "", noSideEffect.} +proc c_getenv(env: cstring): cstring {. + importc: "getenv", header: "".} +proc c_putenv(env: cstring): cint {. + importc: "putenv", header: "".} + proc osErrorMsg*(): string {.rtl, extern: "nos$1", deprecated.} = ## Retrieves the operating system's error flag, ``errno``. ## On Windows ``GetLastError`` is checked before ``errno``. diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim index 089563f22..ff4d32713 100644 --- a/lib/system/ansi_c.nim +++ b/lib/system/ansi_c.nim @@ -25,8 +25,6 @@ proc c_memset(p: pointer, value: cint, size: csize): pointer {. importc: "memset", header: "", discardable.} proc c_strcmp(a, b: cstring): cint {. importc: "strcmp", header: "", noSideEffect.} -proc c_strlen(a: cstring): cint {. - importc: "strlen", header: "", noSideEffect.} type C_JmpBuf {.importc: "jmp_buf", header: "".} = object @@ -112,28 +110,4 @@ proc c_free(p: pointer) {. proc c_realloc(p: pointer, newsize: csize): pointer {. importc: "realloc", header: "".} -when hostOS != "standalone": - when not declared(errno): - when defined(NimrodVM): - var vmErrnoWrapper {.importc.}: ptr cint - template errno: expr = - bind vmErrnoWrapper - vmErrnoWrapper[] - else: - var errno {.importc, header: "".}: cint ## error variable -proc c_strerror(errnum: cint): cstring {. - importc: "strerror", header: "".} - -proc c_remove(filename: cstring): cint {. - importc: "remove", header: "".} -proc c_rename(oldname, newname: cstring): cint {. - importc: "rename", header: "".} - -proc c_system(cmd: cstring): cint {. - importc: "system", header: "".} -proc c_getenv(env: cstring): cstring {. - importc: "getenv", header: "".} -proc c_putenv(env: cstring): cint {. - importc: "putenv", header: "".} - {.pop} diff --git a/lib/system/debugger.nim b/lib/system/debugger.nim index b18c61755..55f14e982 100644 --- a/lib/system/debugger.nim +++ b/lib/system/debugger.nim @@ -108,8 +108,8 @@ proc fileMatches(c, bp: cstring): bool = # and the character for the suffix does not exist or # is one of: \ / : # depending on the OS case does not matter! - var blen: int = c_strlen(bp) - var clen: int = c_strlen(c) + var blen: int = bp.len + var clen: int = c.len if blen > clen: return false # check for \ / : if clen-blen-1 >= 0 and c[clen-blen-1] notin {'\\', '/', ':'}: diff --git a/lib/system/excpt.nim b/lib/system/excpt.nim index 948f87410..526e27c83 100644 --- a/lib/system/excpt.nim +++ b/lib/system/excpt.nim @@ -255,7 +255,7 @@ proc raiseExceptionAux(e: ref Exception) = add(buf, "Error: unhandled exception: ") if not isNil(e.msg): add(buf, e.msg) add(buf, " [") - xadd(buf, e.name, c_strlen(e.name)) + xadd(buf, e.name, e.name.len) add(buf, "]\n") showErrorMessage(buf) quitOrDebug() diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim index e67a3e56a..569470aa2 100644 --- a/lib/system/sysstr.nim +++ b/lib/system/sysstr.nim @@ -85,7 +85,7 @@ proc toNimStr(str: cstring, len: int): NimString {.compilerProc.} = copyMem(addr(result.data), str, len + 1) proc cstrToNimstr(str: cstring): NimString {.compilerRtl.} = - result = toNimStr(str, c_strlen(str)) + result = toNimStr(str, str.len) proc copyString(src: NimString): NimString {.compilerRtl.} = if src != nil: -- cgit 1.4.1-2-gfad0 From 0d45c1738807f585ffa4004800fba1328f8bddd8 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Wed, 8 Jun 2016 22:00:13 +0800 Subject: disable StringStream for JS (needs copyMem) --- lib/pure/streams.nim | 118 +++++++++++++++++++++++++-------------------------- lib/system/endb.nim | 2 +- 2 files changed, 60 insertions(+), 60 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim index c606b4680..eea06f4ce 100644 --- a/lib/pure/streams.nim +++ b/lib/pure/streams.nim @@ -306,67 +306,67 @@ proc peekLine*(s: Stream): TaintedString = defer: setPosition(s, pos) result = readLine(s) -type - StringStream* = ref StringStreamObj ## a stream that encapsulates a string - StringStreamObj* = object of StreamObj - data*: string - pos: int - -{.deprecated: [PStringStream: StringStream, TStringStream: StringStreamObj].} - -proc ssAtEnd(s: Stream): bool = - var s = StringStream(s) - return s.pos >= s.data.len - -proc ssSetPosition(s: Stream, pos: int) = - var s = StringStream(s) - s.pos = clamp(pos, 0, s.data.len) - -proc ssGetPosition(s: Stream): int = - var s = StringStream(s) - return s.pos - -proc ssReadData(s: Stream, buffer: pointer, bufLen: int): int = - var s = StringStream(s) - result = min(bufLen, s.data.len - s.pos) - if result > 0: - copyMem(buffer, addr(s.data[s.pos]), result) - inc(s.pos, result) - -proc ssPeekData(s: Stream, buffer: pointer, bufLen: int): int = - var s = StringStream(s) - result = min(bufLen, s.data.len - s.pos) - if result > 0: - copyMem(buffer, addr(s.data[s.pos]), result) - -proc ssWriteData(s: Stream, buffer: pointer, bufLen: int) = - var s = StringStream(s) - if bufLen <= 0: - return - if s.pos + bufLen > s.data.len: - setLen(s.data, s.pos + bufLen) - copyMem(addr(s.data[s.pos]), buffer, bufLen) - inc(s.pos, bufLen) - -proc ssClose(s: Stream) = - var s = StringStream(s) - s.data = nil - -proc newStringStream*(s: string = ""): StringStream = - ## creates a new stream from the string `s`. - new(result) - result.data = s - result.pos = 0 - result.closeImpl = ssClose - result.atEndImpl = ssAtEnd - result.setPositionImpl = ssSetPosition - result.getPositionImpl = ssGetPosition - result.readDataImpl = ssReadData - result.peekDataImpl = ssPeekData - result.writeDataImpl = ssWriteData - when not defined(js): + type + StringStream* = ref StringStreamObj ## a stream that encapsulates a string + StringStreamObj* = object of StreamObj + data*: string + pos: int + + {.deprecated: [PStringStream: StringStream, TStringStream: StringStreamObj].} + + proc ssAtEnd(s: Stream): bool = + var s = StringStream(s) + return s.pos >= s.data.len + + proc ssSetPosition(s: Stream, pos: int) = + var s = StringStream(s) + s.pos = clamp(pos, 0, s.data.len) + + proc ssGetPosition(s: Stream): int = + var s = StringStream(s) + return s.pos + + proc ssReadData(s: Stream, buffer: pointer, bufLen: int): int = + var s = StringStream(s) + result = min(bufLen, s.data.len - s.pos) + if result > 0: + copyMem(buffer, addr(s.data[s.pos]), result) + inc(s.pos, result) + + proc ssPeekData(s: Stream, buffer: pointer, bufLen: int): int = + var s = StringStream(s) + result = min(bufLen, s.data.len - s.pos) + if result > 0: + copyMem(buffer, addr(s.data[s.pos]), result) + + proc ssWriteData(s: Stream, buffer: pointer, bufLen: int) = + var s = StringStream(s) + if bufLen <= 0: + return + if s.pos + bufLen > s.data.len: + setLen(s.data, s.pos + bufLen) + copyMem(addr(s.data[s.pos]), buffer, bufLen) + inc(s.pos, bufLen) + + proc ssClose(s: Stream) = + var s = StringStream(s) + s.data = nil + + proc newStringStream*(s: string = ""): StringStream = + ## creates a new stream from the string `s`. + new(result) + result.data = s + result.pos = 0 + result.closeImpl = ssClose + result.atEndImpl = ssAtEnd + result.setPositionImpl = ssSetPosition + result.getPositionImpl = ssGetPosition + result.readDataImpl = ssReadData + result.peekDataImpl = ssPeekData + result.writeDataImpl = ssWriteData + type FileStream* = ref FileStreamObj ## a stream that encapsulates a `File` FileStreamObj* = object of Stream diff --git a/lib/system/endb.nim b/lib/system/endb.nim index af3cb590c..92aae8c71 100644 --- a/lib/system/endb.nim +++ b/lib/system/endb.nim @@ -336,7 +336,7 @@ proc readLine(f: File, line: var StaticStr): bool = if c == 10'i32: break # LF if c == 13'i32: # CR c = c_fgetc(f) # is the next char LF? - if c != 10'i32: ungetc(c, f) # no, put the character back + if c != 10'i32: discard c_ungetc(c, f) # no, put the character back break add line, chr(int(c)) result = true -- cgit 1.4.1-2-gfad0 From 43996c24a0e82dd935f0509bf7c9415ccb573b93 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Wed, 8 Jun 2016 23:28:16 +0800 Subject: fix errno in os.nim --- lib/pure/os.nim | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 86dd903e7..8a39096d9 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -51,6 +51,8 @@ proc c_getenv(env: cstring): cstring {. proc c_putenv(env: cstring): cint {. importc: "putenv", header: "".} +var errno {.importc, header: "".}: cint + proc osErrorMsg*(): string {.rtl, extern: "nos$1", deprecated.} = ## Retrieves the operating system's error flag, ``errno``. ## On Windows ``GetLastError`` is checked before ``errno``. @@ -74,8 +76,9 @@ proc osErrorMsg*(): string {.rtl, extern: "nos$1", deprecated.} = nil, err, 0, addr(msgbuf), 0, nil) != 0'i32: result = $msgbuf if msgbuf != nil: localFree(msgbuf) - if errno != 0'i32: - result = $os.c_strerror(errno) + else: + if errno != 0'i32: + result = $os.c_strerror(errno) {.push warning[deprecated]: off.} proc raiseOSError*(msg: string = "") {.noinline, rtl, extern: "nos$1", -- cgit 1.4.1-2-gfad0 From 087db3ce64990f93c3e85b2783acd375ac139147 Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Sun, 12 Jun 2016 14:31:59 +0800 Subject: remove fauly fix for windows error being overwritten --- lib/pure/os.nim | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lib/pure') diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 8a39096d9..2b1cf7409 100644 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -76,9 +76,8 @@ proc osErrorMsg*(): string {.rtl, extern: "nos$1", deprecated.} = nil, err, 0, addr(msgbuf), 0, nil) != 0'i32: result = $msgbuf if msgbuf != nil: localFree(msgbuf) - else: - if errno != 0'i32: - result = $os.c_strerror(errno) + if errno != 0'i32: + result = $os.c_strerror(errno) {.push warning[deprecated]: off.} proc raiseOSError*(msg: string = "") {.noinline, rtl, extern: "nos$1", -- cgit 1.4.1-2-gfad0