aboutsummaryrefslogtreecommitdiff
path: root/core/c
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-07-27 04:20:03 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-08-14 01:44:35 +0200
commitefe68c2e24e0a38e591f146822ed93904e4193d7 (patch)
treec2ac0ed3d08746495aa6adcd7a1c1ab052a7ee76 /core/c
parentac68a9d52c3a9edc587e1ccab747613baf6f89de (diff)
posix: add package
Diffstat (limited to 'core/c')
-rw-r--r--core/c/libc/complex.odin4
-rw-r--r--core/c/libc/errno.odin2
-rw-r--r--core/c/libc/setjmp.odin19
-rw-r--r--core/c/libc/stdio.odin43
-rw-r--r--core/c/libc/stdlib.odin21
-rw-r--r--core/c/libc/string.odin2
-rw-r--r--core/c/libc/time.odin32
7 files changed, 97 insertions, 26 deletions
diff --git a/core/c/libc/complex.odin b/core/c/libc/complex.odin
index 81d2b75be..98fd7b1bb 100644
--- a/core/c/libc/complex.odin
+++ b/core/c/libc/complex.odin
@@ -47,8 +47,8 @@ foreign libc {
clogf :: proc(z: complex_float) -> complex_float ---
// 7.3.8 Power and absolute-value functions
- cabs :: proc(z: complex_double) -> complex_double ---
- cabsf :: proc(z: complex_float) -> complex_float ---
+ cabs :: proc(z: complex_double) -> double ---
+ cabsf :: proc(z: complex_float) -> float ---
cpow :: proc(x, y: complex_double) -> complex_double ---
cpowf :: proc(x, y: complex_float) -> complex_float ---
csqrt :: proc(z: complex_double) -> complex_double ---
diff --git a/core/c/libc/errno.odin b/core/c/libc/errno.odin
index d28a24f56..843b2f1b6 100644
--- a/core/c/libc/errno.odin
+++ b/core/c/libc/errno.odin
@@ -102,6 +102,6 @@ when ODIN_OS == .Haiku {
// read the value, or to produce an lvalue such that you can assign a different
// error value to errno. To work around this, just expose it as a function like
// it actually is.
-errno :: #force_inline proc() -> ^int {
+errno :: #force_inline proc "contextless" () -> ^int {
return _get_errno()
}
diff --git a/core/c/libc/setjmp.odin b/core/c/libc/setjmp.odin
index 68f5ac010..101b614b3 100644
--- a/core/c/libc/setjmp.odin
+++ b/core/c/libc/setjmp.odin
@@ -32,24 +32,21 @@ when ODIN_OS == .Windows {
// the RDX register will contain zero and correctly set the flag to disable
// stack unwinding.
@(link_name="_setjmp")
- setjmp :: proc(env: ^jmp_buf, hack: rawptr = nil) -> int ---
+ setjmp :: proc(env: ^jmp_buf, hack: rawptr = nil) -> int ---
}
} else {
@(default_calling_convention="c")
foreign libc {
// 7.13.1 Save calling environment
- //
- // NOTE(dweiler): C11 requires setjmp be a macro, which means it won't
- // necessarily export a symbol named setjmp but rather _setjmp in the case
- // of musl, glibc, BSD libc, and msvcrt.
- @(link_name="_setjmp")
- setjmp :: proc(env: ^jmp_buf) -> int ---
+ @(link_name=LSETJMP)
+ setjmp :: proc(env: ^jmp_buf) -> int ---
}
}
@(default_calling_convention="c")
foreign libc {
// 7.13.2 Restore calling environment
+ @(link_name=LLONGJMP)
longjmp :: proc(env: ^jmp_buf, val: int) -> ! ---
}
@@ -64,3 +61,11 @@ foreign libc {
// The choice of 4096 bytes for storage of this type is more than enough on all
// relevant platforms.
jmp_buf :: struct #align(16) { _: [4096]char, }
+
+when ODIN_OS == .NetBSD {
+ @(private) LSETJMP :: "__setjmp14"
+ @(private) LLONGJMP :: "__longjmp14"
+} else {
+ @(private) LSETJMP :: "setjmp"
+ @(private) LLONGJMP :: "longjmp"
+}
diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin
index 3e1d0f5a2..4be00ff0b 100644
--- a/core/c/libc/stdio.odin
+++ b/core/c/libc/stdio.odin
@@ -17,6 +17,12 @@ when ODIN_OS == .Windows {
FILE :: struct {}
+Whence :: enum int {
+ SET = SEEK_SET,
+ CUR = SEEK_CUR,
+ END = SEEK_END,
+}
+
// MSVCRT compatible.
when ODIN_OS == .Windows {
_IOFBF :: 0x0000
@@ -101,6 +107,8 @@ when ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD {
SEEK_CUR :: 1
SEEK_END :: 2
+ TMP_MAX :: 308915776
+
foreign libc {
__sF: [3]FILE
}
@@ -128,6 +136,8 @@ when ODIN_OS == .FreeBSD {
SEEK_CUR :: 1
SEEK_END :: 2
+ TMP_MAX :: 308915776
+
foreign libc {
@(link_name="__stderrp") stderr: ^FILE
@(link_name="__stdinp") stdin: ^FILE
@@ -195,10 +205,21 @@ when ODIN_OS == .Haiku {
}
}
+when ODIN_OS == .NetBSD {
+ @(private) LRENAME :: "__posix_rename"
+ @(private) LFGETPOS :: "__fgetpos50"
+ @(private) LFSETPOS :: "__fsetpos50"
+} else {
+ @(private) LRENAME :: "rename"
+ @(private) LFGETPOS :: "fgetpos"
+ @(private) LFSETPOS :: "fsetpos"
+}
+
@(default_calling_convention="c")
foreign libc {
// 7.21.4 Operations on files
remove :: proc(filename: cstring) -> int ---
+ @(link_name=LRENAME)
rename :: proc(old, new: cstring) -> int ---
tmpfile :: proc() -> ^FILE ---
tmpnam :: proc(s: [^]char) -> [^]char ---
@@ -240,8 +261,10 @@ foreign libc {
fwrite :: proc(ptr: rawptr, size: size_t, nmemb: size_t, stream: ^FILE) -> size_t ---
// 7.21.9 File positioning functions
+ @(link_name=LFGETPOS)
fgetpos :: proc(stream: ^FILE, pos: ^fpos_t) -> int ---
- fseek :: proc(stream: ^FILE, offset: long, whence: int) -> int ---
+ fseek :: proc(stream: ^FILE, offset: long, whence: Whence) -> int ---
+ @(link_name=LFSETPOS)
fsetpos :: proc(stream: ^FILE, pos: ^fpos_t) -> int ---
ftell :: proc(stream: ^FILE) -> long ---
rewind :: proc(stream: ^FILE) ---
@@ -288,11 +311,11 @@ to_stream :: proc(file: ^FILE) -> io.Stream {
return 0, unknown_or_eof(file)
}
- if fseek(file, long(offset), SEEK_SET) != 0 {
+ if fseek(file, long(offset), .SET) != 0 {
return 0, unknown_or_eof(file)
}
- defer fseek(file, long(curr), SEEK_SET)
+ defer fseek(file, long(curr), .SET)
n = i64(fread(raw_data(p), size_of(byte), len(p), file))
if n == 0 { err = unknown_or_eof(file) }
@@ -307,17 +330,21 @@ to_stream :: proc(file: ^FILE) -> io.Stream {
return 0, unknown_or_eof(file)
}
- if fseek(file, long(offset), SEEK_SET) != 0 {
+ if fseek(file, long(offset), .SET) != 0 {
return 0, unknown_or_eof(file)
}
- defer fseek(file, long(curr), SEEK_SET)
+ defer fseek(file, long(curr), .SET)
n = i64(fwrite(raw_data(p), size_of(byte), len(p), file))
if n == 0 { err = unknown_or_eof(file) }
case .Seek:
- if fseek(file, long(offset), int(whence)) != 0 {
+ #assert(int(Whence.SET) == int(io.Seek_From.Start))
+ #assert(int(Whence.CUR) == int(io.Seek_From.Current))
+ #assert(int(Whence.END) == int(io.Seek_From.End))
+
+ if fseek(file, long(offset), Whence(whence)) != 0 {
return 0, unknown_or_eof(file)
}
@@ -326,9 +353,9 @@ to_stream :: proc(file: ^FILE) -> io.Stream {
if curr == -1 {
return 0, unknown_or_eof(file)
}
- defer fseek(file, curr, SEEK_SET)
+ defer fseek(file, curr, .SET)
- if fseek(file, 0, SEEK_END) != 0 {
+ if fseek(file, 0, .END) != 0 {
return 0, unknown_or_eof(file)
}
diff --git a/core/c/libc/stdlib.odin b/core/c/libc/stdlib.odin
index d797b8746..08c6fa6f0 100644
--- a/core/c/libc/stdlib.odin
+++ b/core/c/libc/stdlib.odin
@@ -40,10 +40,9 @@ when ODIN_OS == .Linux {
}
-when ODIN_OS == .Darwin {
+when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD {
RAND_MAX :: 0x7fffffff
- // GLIBC and MUSL only
@(private="file")
@(default_calling_convention="c")
foreign libc {
@@ -55,6 +54,20 @@ when ODIN_OS == .Darwin {
}
}
+when ODIN_OS == .NetBSD {
+ RAND_MAX :: 0x7fffffff
+
+ @(private="file")
+ @(default_calling_convention="c")
+ foreign libc {
+ __mb_cur_max: size_t
+ }
+
+ MB_CUR_MAX :: #force_inline proc() -> size_t {
+ return __mb_cur_max
+ }
+}
+
// C does not declare what these values should be, as an implementation is free
// to use any two distinct values it wants to indicate success or failure.
// However, nobody actually does and everyone appears to have agreed upon these
@@ -99,7 +112,7 @@ foreign libc {
at_quick_exit :: proc(func: proc "c" ()) -> int ---
exit :: proc(status: int) -> ! ---
_Exit :: proc(status: int) -> ! ---
- getenv :: proc(name: cstring) -> [^]char ---
+ getenv :: proc(name: cstring) -> cstring ---
quick_exit :: proc(status: int) -> ! ---
system :: proc(cmd: cstring) -> int ---
@@ -150,4 +163,4 @@ aligned_free :: #force_inline proc "c" (ptr: rawptr) {
} else {
free(ptr)
}
-} \ No newline at end of file
+}
diff --git a/core/c/libc/string.odin b/core/c/libc/string.odin
index e6a959f7b..cde9c7e6b 100644
--- a/core/c/libc/string.odin
+++ b/core/c/libc/string.odin
@@ -40,7 +40,7 @@ foreign libc {
strtok :: proc(s1: [^]char, s2: cstring) -> [^]char ---
// 7.24.6 Miscellaneous functions
- strerror :: proc(errnum: int) -> [^]char ---
+ strerror :: proc(errnum: int) -> cstring ---
strlen :: proc(s: cstring) -> size_t ---
}
memset :: proc "c" (s: rawptr, c: int, n: size_t) -> rawptr {
diff --git a/core/c/libc/time.odin b/core/c/libc/time.odin
index 924cf4aec..21859c602 100644
--- a/core/c/libc/time.odin
+++ b/core/c/libc/time.odin
@@ -50,30 +50,56 @@ when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS =
foreign libc {
// 7.27.2 Time manipulation functions
clock :: proc() -> clock_t ---
+ @(link_name=LDIFFTIME)
difftime :: proc(time1, time2: time_t) -> double ---
+ @(link_name=LMKTIME)
mktime :: proc(timeptr: ^tm) -> time_t ---
+ @(link_name=LTIME)
time :: proc(timer: ^time_t) -> time_t ---
timespec_get :: proc(ts: ^timespec, base: int) -> int ---
// 7.27.3 Time conversion functions
asctime :: proc(timeptr: ^tm) -> [^]char ---
+ @(link_name=LCTIME)
ctime :: proc(timer: ^time_t) -> [^]char ---
+ @(link_name=LGMTIME)
gmtime :: proc(timer: ^time_t) -> ^tm ---
+ @(link_name=LLOCALTIME)
localtime :: proc(timer: ^time_t) -> ^tm ---
strftime :: proc(s: [^]char, maxsize: size_t, format: cstring, timeptr: ^tm) -> size_t ---
}
+ when ODIN_OS == .NetBSD {
+ @(private) LDIFFTIME :: "__difftime50"
+ @(private) LMKTIME :: "__mktime50"
+ @(private) LTIME :: "__time50"
+ @(private) LCTIME :: "__ctime50"
+ @(private) LGMTIME :: "__gmtime50"
+ @(private) LLOCALTIME :: "__localtime50"
+ } else {
+ @(private) LDIFFTIME :: "difftime"
+ @(private) LMKTIME :: "mktime"
+ @(private) LTIME :: "ltime"
+ @(private) LCTIME :: "ctime"
+ @(private) LGMTIME :: "gmtime"
+ @(private) LLOCALTIME :: "localtime"
+ }
+
when ODIN_OS == .OpenBSD {
CLOCKS_PER_SEC :: 100
} else {
CLOCKS_PER_SEC :: 1000000
}
- TIME_UTC :: 1
+ TIME_UTC :: 1
- time_t :: distinct i64
+ time_t :: distinct i64
- clock_t :: long
+ when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD {
+ clock_t :: distinct int32_t
+ } else {
+ clock_t :: distinct long
+ }
timespec :: struct {
tv_sec: time_t,