90 lines
2.3 KiB
Nim
90 lines
2.3 KiB
Nim
# SPDX-License-Identifier: LUL-1.0
|
|
# Copyright (c) 2026 Markus Maiwald
|
|
# Stewardship: Self Sovereign Society Foundation
|
|
#
|
|
# This file is part of the Nexus SDK.
|
|
# See legal/LICENSE_UNBOUND.md for license terms.
|
|
|
|
# src/npl/nipbox/std.nim
|
|
# Adapter for Legacy Code -> New LibC
|
|
|
|
type cptr* = pointer
|
|
|
|
# LibC Imports
|
|
proc write*(fd: cint, buf: cptr, count: csize_t): int {.importc, cdecl.}
|
|
proc read*(fd: cint, buf: cptr, count: csize_t): int {.importc, cdecl.}
|
|
proc open*(pathname: cstring, flags: cint): cint {.importc, cdecl.}
|
|
proc close*(fd: cint): cint {.importc, cdecl.}
|
|
proc exit*(status: cint) {.importc, cdecl.}
|
|
proc nexus_list*(buf: pointer, len: int): int {.importc, cdecl.}
|
|
proc syscall(nr: int, a0: int = 0, a1: int = 0, a2: int = 0): int {.importc, cdecl.}
|
|
|
|
# Legacy Aliases
|
|
proc list_files*(buf: pointer, len: uint64): int64 =
|
|
return int64(nexus_list(buf, int(len)))
|
|
|
|
proc nexus_syscall*(cmd: cint, arg: uint64): cint =
|
|
return cint(syscall(int(cmd), int(arg), 0, 0))
|
|
|
|
proc nexus_yield*() =
|
|
discard syscall(0, 0) # Exit/Yield
|
|
|
|
type FileArgs* = object
|
|
name*: uint64
|
|
data*: uint64
|
|
len*: uint64
|
|
|
|
proc nexus_file_write*(name: string, data: string) =
|
|
# Disabled
|
|
return
|
|
|
|
proc nexus_file_read*(name: string, buffer: pointer, max_len: uint64): int =
|
|
# Disabled
|
|
return -1
|
|
|
|
# Print Helpers
|
|
proc print*(s: string) =
|
|
if s.len > 0:
|
|
discard write(cint(1), unsafeAddr s[0], csize_t(s.len))
|
|
var nl = "\n"
|
|
discard write(cint(1), unsafeAddr nl[0], 1)
|
|
|
|
proc print_raw*(s: string) =
|
|
if s.len > 0:
|
|
discard write(cint(1), unsafeAddr s[0], csize_t(s.len))
|
|
|
|
proc print_int*(n: int) =
|
|
var s = ""
|
|
var v = n
|
|
if v == 0: s = "0"
|
|
else:
|
|
while v > 0:
|
|
s.add(char((v mod 10) + 48))
|
|
v = v div 10
|
|
# Reverse
|
|
var r = ""
|
|
var i = s.len - 1
|
|
while i >= 0:
|
|
r.add(s[i])
|
|
i -= 1
|
|
print_raw(r)
|
|
|
|
proc my_readline*(out_str: var string): bool =
|
|
out_str = ""
|
|
while true:
|
|
var c: char
|
|
let n = read(cint(0), addr c, 1)
|
|
if n <= 0: return false
|
|
|
|
if c == '\n' or c == '\r':
|
|
print_raw("\n")
|
|
return true
|
|
elif c == '\b' or c == char(127):
|
|
if out_str.len > 0:
|
|
var bs = "\b \b"
|
|
discard write(cint(1), addr bs[0], 3)
|
|
out_str.setLen(out_str.len - 1)
|
|
else:
|
|
out_str.add(c)
|
|
discard write(cint(1), addr c, 1)
|