libc changes: unify c and libc types; Add [^]T where appropriate

This commit is contained in:
gingerBill
2021-09-10 15:41:51 +01:00
parent e65e0b5db2
commit 99df0f1b12
14 changed files with 299 additions and 262 deletions
+92 -31
View File
@@ -1,35 +1,96 @@
package c package c
import b "core:builtin" import builtin "core:builtin"
char :: builtin.u8 // assuming -funsigned-char
short :: builtin.i16
int :: builtin.i32
long :: builtin.i32 when (ODIN_OS == "windows" || size_of(builtin.rawptr) == 4) else builtin.i64
longlong :: builtin.i64
uchar :: builtin.u8
ushort :: builtin.u16
uint :: builtin.u32
ulong :: builtin.u32 when (ODIN_OS == "windows" || size_of(builtin.rawptr) == 4) else builtin.u64
ulonglong :: builtin.u64
bool :: builtin.bool
size_t :: builtin.uint
ssize_t :: builtin.int
wchar_t :: builtin.u16 when (ODIN_OS == "windows") else builtin.u32
float :: builtin.f32
double :: builtin.f64
complex_float :: builtin.complex64
complex_double :: builtin.complex128
// 7.20.1 Integer types
int8_t :: builtin.i8
uint8_t :: builtin.u8
int16_t :: builtin.i16
uint16_t :: builtin.u16
int32_t :: builtin.i32
uint32_t :: builtin.u32
int64_t :: builtin.i64
uint64_t :: builtin.u64
// These are all the same in multiple libc's for multiple architectures.
int_least8_t :: builtin.i8
uint_least8_t :: builtin.u8
int_least16_t :: builtin.i16
uint_least16_t :: builtin.u16
int_least32_t :: builtin.i32
uint_least32_t :: builtin.u32
int_least64_t :: builtin.i64
uint_least64_t :: builtin.u64
// Same on Windows, Linux, and FreeBSD
when ODIN_ARCH == "386" || ODIN_ARCH == "amd64" {
int_fast8_t :: builtin.i8
uint_fast8_t :: builtin.u8
int_fast16_t :: builtin.i32
uint_fast16_t :: builtin.u32
int_fast32_t :: builtin.i32
uint_fast32_t :: builtin.u32
int_fast64_t :: builtin.i64
uint_fast64_t :: builtin.u64
} else {
int_fast8_t :: builtin.i8
uint_fast8_t :: builtin.u8
int_fast16_t :: builtin.i32
uint_fast16_t :: builtin.u32
int_fast32_t :: builtin.i32
uint_fast32_t :: builtin.u32
int_fast64_t :: builtin.i64
uint_fast64_t :: builtin.u64
}
intptr_t :: builtin.int
uintptr_t :: builtin.uintptr
ptrdiff_t :: distinct intptr_t
intmax_t :: builtin.i64
uintmax_t :: builtin.u64
// Copy C's rules for type promotion here by forcing the type on the literals.
INT8_MAX :: int(0x7f)
INT16_MAX :: int(0x7fff)
INT32_MAX :: int(0x7fffffff)
INT64_MAX :: longlong(0x7fffffffffffffff)
UINT8_MAX :: int(0xff)
UINT16_MAX :: int(0xffff)
UINT32_MAX :: uint(0xffffffff)
UINT64_MAX :: ulonglong(0xffffffffffffffff)
INT8_MIN :: ~INT8_MAX
INT16_MIN :: ~INT16_MAX
INT32_MIN :: ~INT32_MAX
INT64_MIN :: ~INT64_MAX
NULL :: rawptr(uintptr(0))
NDEBUG :: !ODIN_DEBUG
CHAR_BIT :: 8 CHAR_BIT :: 8
bool :: b.bool
char :: b.u8
byte :: b.byte
schar :: b.i8
uchar :: b.u8
short :: b.i16
ushort :: b.u16
int :: b.i32
uint :: b.u32
long :: b.i32 when (ODIN_OS == "windows" || size_of(b.rawptr) == 4) else b.i64
ulong :: b.u32 when (ODIN_OS == "windows" || size_of(b.rawptr) == 4) else b.u64
longlong :: b.i64
ulonglong :: b.u64
float :: b.f32
double :: b.f64
complex_float :: b.complex64
complex_double :: b.complex128
#assert(size_of(b.uintptr) == size_of(b.int))
size_t :: b.uint
ssize_t :: b.int
ptrdiff_t :: b.int
uintptr_t :: b.uintptr
intptr_t :: b.int
wchar_t :: b.u16 when (ODIN_OS == "windows") else b.u32
+7 -7
View File
@@ -82,34 +82,34 @@ foreign libc {
remove :: proc(filename: cstring) -> int --- remove :: proc(filename: cstring) -> int ---
rename :: proc(old, new: cstring) -> int --- rename :: proc(old, new: cstring) -> int ---
tmpfile :: proc() -> ^FILE --- tmpfile :: proc() -> ^FILE ---
tmpnam :: proc(s: ^char) -> ^char --- tmpnam :: proc(s: [^]char) -> [^]char ---
// 7.21.5 File access functions // 7.21.5 File access functions
fclose :: proc(stream: ^FILE) -> int --- fclose :: proc(stream: ^FILE) -> int ---
fflush :: proc(stream: ^FILE) -> int --- fflush :: proc(stream: ^FILE) -> int ---
fopen :: proc(filename, mode: cstring) -> ^FILE --- fopen :: proc(filename, mode: cstring) -> ^FILE ---
freopen :: proc(filename, mode: cstring, stream: ^FILE) -> ^FILE --- freopen :: proc(filename, mode: cstring, stream: ^FILE) -> ^FILE ---
setbuf :: proc(stream: ^FILE, buf: ^char) --- setbuf :: proc(stream: ^FILE, buf: [^]char) ---
setvbuf :: proc(stream: ^FILE, buf: ^char, mode: int, size: size_t) -> int --- setvbuf :: proc(stream: ^FILE, buf: [^]char, mode: int, size: size_t) -> int ---
// 7.21.6 Formatted input/output functions // 7.21.6 Formatted input/output functions
fprintf :: proc(stream: ^FILE, format: cstring, #c_vararg args: ..any) -> int --- fprintf :: proc(stream: ^FILE, format: cstring, #c_vararg args: ..any) -> int ---
fscanf :: proc(stream: ^FILE, format: cstring, #c_vararg args: ..any) -> int --- fscanf :: proc(stream: ^FILE, format: cstring, #c_vararg args: ..any) -> int ---
printf :: proc(format: cstring, #c_vararg args: ..any) -> int --- printf :: proc(format: cstring, #c_vararg args: ..any) -> int ---
scanf :: proc(format: cstring, #c_vararg args: ..any) -> int --- scanf :: proc(format: cstring, #c_vararg args: ..any) -> int ---
snprintf :: proc(s: ^char, format: cstring, #c_vararg args: ..any) -> int --- snprintf :: proc(s: [^]char, format: cstring, #c_vararg args: ..any) -> int ---
sscanf :: proc(s, format: cstring, #c_vararg args: ..any) -> int --- sscanf :: proc(s, format: cstring, #c_vararg args: ..any) -> int ---
vfprintf :: proc(stream: ^FILE, format: cstring, arg: ^va_list) -> int --- vfprintf :: proc(stream: ^FILE, format: cstring, arg: ^va_list) -> int ---
vfscanf :: proc(stream: ^FILE, format: cstring, arg: ^va_list) -> int --- vfscanf :: proc(stream: ^FILE, format: cstring, arg: ^va_list) -> int ---
vprintf :: proc(format: cstring, arg: ^va_list) -> int --- vprintf :: proc(format: cstring, arg: ^va_list) -> int ---
vscanf :: proc(format: cstring, arg: ^va_list) -> int --- vscanf :: proc(format: cstring, arg: ^va_list) -> int ---
vsnprintf :: proc(s: ^char, n: size_t, format: cstring, arg: ^va_list) -> int --- vsnprintf :: proc(s: [^]char, n: size_t, format: cstring, arg: ^va_list) -> int ---
vsprintf :: proc(s: ^char, format: cstring, arg: ^va_list) -> int --- vsprintf :: proc(s: [^]char, format: cstring, arg: ^va_list) -> int ---
vsscanf :: proc(s, format: cstring, arg: ^va_list) -> int --- vsscanf :: proc(s, format: cstring, arg: ^va_list) -> int ---
// 7.21.7 Character input/output functions // 7.21.7 Character input/output functions
fgetc :: proc(stream: ^FILE) -> int --- fgetc :: proc(stream: ^FILE) -> int ---
fgets :: proc(s: ^char, n: int, stream: ^FILE) -> ^char --- fgets :: proc(s: [^]char, n: int, stream: ^FILE) -> [^]char ---
fputc :: proc(s: cstring, stream: ^FILE) -> int --- fputc :: proc(s: cstring, stream: ^FILE) -> int ---
getc :: proc(stream: ^FILE) -> int --- getc :: proc(stream: ^FILE) -> int ---
getchar :: proc() -> int --- getchar :: proc() -> int ---
+9 -9
View File
@@ -58,12 +58,12 @@ foreign libc {
atoi :: proc(nptr: cstring) -> int --- atoi :: proc(nptr: cstring) -> int ---
atol :: proc(nptr: cstring) -> long --- atol :: proc(nptr: cstring) -> long ---
atoll :: proc(nptr: cstring) -> longlong --- atoll :: proc(nptr: cstring) -> longlong ---
strtod :: proc(nptr: cstring, endptr: ^^char) -> double --- strtod :: proc(nptr: cstring, endptr: ^[^]char) -> double ---
strtof :: proc(nptr: cstring, endptr: ^^char) -> float --- strtof :: proc(nptr: cstring, endptr: ^[^]char) -> float ---
strtol :: proc(nptr: cstring, endptr: ^^char, base: int) -> long --- strtol :: proc(nptr: cstring, endptr: ^[^]char, base: int) -> long ---
strtoll :: proc(nptr: cstring, endptr: ^^char, base: int) -> longlong --- strtoll :: proc(nptr: cstring, endptr: ^[^]char, base: int) -> longlong ---
strtoul :: proc(nptr: cstring, endptr: ^^char, base: int) -> ulong --- strtoul :: proc(nptr: cstring, endptr: ^[^]char, base: int) -> ulong ---
strtoull :: proc(nptr: cstring, endptr: ^^char, base: int) -> ulonglong --- strtoull :: proc(nptr: cstring, endptr: ^[^]char, base: int) -> ulonglong ---
// 7.22.2 Pseudo-random sequence generation functions // 7.22.2 Pseudo-random sequence generation functions
rand :: proc() -> int --- rand :: proc() -> int ---
@@ -82,7 +82,7 @@ foreign libc {
at_quick_exit :: proc(func: proc "c" ()) -> int --- at_quick_exit :: proc(func: proc "c" ()) -> int ---
exit :: proc(status: int) -> ! --- exit :: proc(status: int) -> ! ---
_Exit :: proc(status: int) -> ! --- _Exit :: proc(status: int) -> ! ---
getenv :: proc(name: cstring) -> ^char --- getenv :: proc(name: cstring) -> [^]char ---
quick_exit :: proc(status: int) -> ! --- quick_exit :: proc(status: int) -> ! ---
system :: proc(cmd: cstring) -> int --- system :: proc(cmd: cstring) -> int ---
@@ -101,9 +101,9 @@ foreign libc {
// 7.22.7 Multibyte/wide character conversion functions // 7.22.7 Multibyte/wide character conversion functions
mblen :: proc(s: cstring, n: size_t) -> int --- mblen :: proc(s: cstring, n: size_t) -> int ---
mbtowc :: proc(pwc: ^wchar_t, s: cstring, n: size_t) -> int --- mbtowc :: proc(pwc: ^wchar_t, s: cstring, n: size_t) -> int ---
wctomb :: proc(s: ^char, wc: wchar_t) -> int --- wctomb :: proc(s: [^]char, wc: wchar_t) -> int ---
// 7.22.8 Multibyte/wide string conversion functions // 7.22.8 Multibyte/wide string conversion functions
mbstowcs :: proc(pwcs: ^wchar_t, s: cstring, n: size_t) -> size_t --- mbstowcs :: proc(pwcs: ^wchar_t, s: cstring, n: size_t) -> size_t ---
wcstombs :: proc(s: ^char, pwcs: ^wchar_t, n: size_t) -> size_t --- wcstombs :: proc(s: [^]char, pwcs: ^wchar_t, n: size_t) -> size_t ---
} }
+11 -11
View File
@@ -13,31 +13,31 @@ foreign libc {
// 7.24.2 Copying functions // 7.24.2 Copying functions
memcpy :: proc(s1, s2: rawptr, n: size_t) -> rawptr --- memcpy :: proc(s1, s2: rawptr, n: size_t) -> rawptr ---
memmove :: proc(s1, s2: rawptr, n: size_t) -> rawptr --- memmove :: proc(s1, s2: rawptr, n: size_t) -> rawptr ---
strcpy :: proc(s1: ^char, s2: cstring) -> ^char --- strcpy :: proc(s1: [^]char, s2: cstring) -> [^]char ---
strncpy :: proc(s1: ^char, s2: cstring, n: size_t) -> ^char --- strncpy :: proc(s1: [^]char, s2: cstring, n: size_t) -> [^]char ---
// 7.24.3 Concatenation functions // 7.24.3 Concatenation functions
strcat :: proc(s1: ^char, s2: cstring) -> ^char --- strcat :: proc(s1: [^]char, s2: cstring) -> [^]char ---
strncat :: proc(s1: ^char, s2: cstring, n: size_t) -> ^char --- strncat :: proc(s1: [^]char, s2: cstring, n: size_t) -> [^]char ---
// 7.24.4 Comparison functions // 7.24.4 Comparison functions
memcmp :: proc(s1, s2: rawptr, n: size_t) -> int --- memcmp :: proc(s1, s2: rawptr, n: size_t) -> int ---
strcmp :: proc(s1, s2: cstring) -> int --- strcmp :: proc(s1, s2: cstring) -> int ---
strcoll :: proc(s1, s2: cstring) -> int --- strcoll :: proc(s1, s2: cstring) -> int ---
strncmp :: proc(s1, s2: cstring, n: size_t) -> int --- strncmp :: proc(s1, s2: cstring, n: size_t) -> int ---
strxfrm :: proc(s1: ^char, s2: cstring, n: size_t) -> size_t --- strxfrm :: proc(s1: [^]char, s2: cstring, n: size_t) -> size_t ---
// 7.24.5 Search functions // 7.24.5 Search functions
memchr :: proc(s: rawptr, c: int, n: size_t) -> rawptr --- memchr :: proc(s: rawptr, c: int, n: size_t) -> rawptr ---
strchr :: proc(s: cstring, c: int) -> ^char --- strchr :: proc(s: cstring, c: int) -> [^]char ---
strcspn :: proc(s1, s2: cstring) -> size_t --- strcspn :: proc(s1, s2: cstring) -> size_t ---
strpbrk :: proc(s1, s2: cstring) -> ^char --- strpbrk :: proc(s1, s2: cstring) -> [^]char ---
strrchr :: proc(s: ^char, c: int) -> ^char --- strrchr :: proc(s: [^]char, c: int) -> [^]char ---
strcpn :: proc(s1, s2: cstring) -> ^char --- strcpn :: proc(s1, s2: cstring) -> [^]char ---
strtok :: proc(s1: ^char, s2: cstring) -> ^char --- strtok :: proc(s1: [^]char, s2: cstring) -> [^]char ---
// 7.24.6 Miscellaneous functions // 7.24.6 Miscellaneous functions
memset :: proc(s: rawptr, c: int, n: size_t) -> rawptr --- memset :: proc(s: rawptr, c: int, n: size_t) -> rawptr ---
strerror :: proc(errnum: int) -> ^char --- strerror :: proc(errnum: int) -> [^]char ---
strlen :: proc(s: cstring) -> size_t --- strlen :: proc(s: cstring) -> size_t ---
} }
+6 -6
View File
@@ -20,11 +20,11 @@ when ODIN_OS == "windows" {
@(link_name="_timespec64_get") timespec_get :: proc(ts: ^timespec, base: int) -> int --- @(link_name="_timespec64_get") timespec_get :: proc(ts: ^timespec, base: int) -> int ---
// 7.27.3 Time conversion functions // 7.27.3 Time conversion functions
asctime :: proc(timeptr: ^tm) -> ^char --- asctime :: proc(timeptr: ^tm) -> [^]char ---
@(link_name="_ctime64") ctime :: proc(timer: ^time_t) -> ^char --- @(link_name="_ctime64") ctime :: proc(timer: ^time_t) -> [^]char ---
@(link_name="_gmtime64") gmtime :: proc(timer: ^time_t) -> ^tm --- @(link_name="_gmtime64") gmtime :: proc(timer: ^time_t) -> ^tm ---
@(link_name="_localtime64") localtime :: proc(timer: ^time_t) -> ^tm --- @(link_name="_localtime64") localtime :: proc(timer: ^time_t) -> ^tm ---
strftime :: proc(s: ^char, maxsize: size_t, format: cstring, timeptr: ^tm) -> size_t --- strftime :: proc(s: [^]char, maxsize: size_t, format: cstring, timeptr: ^tm) -> size_t ---
} }
CLOCKS_PER_SEC :: 1000 CLOCKS_PER_SEC :: 1000
@@ -54,11 +54,11 @@ when ODIN_OS == "linux" || ODIN_OS == "freebsd" {
timespec_get :: proc(ts: ^timespec, base: int) -> int --- timespec_get :: proc(ts: ^timespec, base: int) -> int ---
// 7.27.3 Time conversion functions // 7.27.3 Time conversion functions
asctime :: proc(timeptr: ^tm) -> ^char --- asctime :: proc(timeptr: ^tm) -> [^]char ---
ctime :: proc(timer: ^time_t) -> ^char --- ctime :: proc(timer: ^time_t) -> [^]char ---
gmtime :: proc(timer: ^time_t) -> ^tm --- gmtime :: proc(timer: ^time_t) -> ^tm ---
localtime :: proc(timer: ^time_t) -> ^tm --- localtime :: proc(timer: ^time_t) -> ^tm ---
strftime :: proc(s: ^char, maxsize: size_t, format: cstring, timeptr: ^tm) -> size_t --- strftime :: proc(s: [^]char, maxsize: size_t, format: cstring, timeptr: ^tm) -> size_t ---
} }
CLOCKS_PER_SEC :: 1000000 CLOCKS_PER_SEC :: 1000000
+60 -62
View File
@@ -1,82 +1,80 @@
package libc package libc
import builtin "core:builtin" import "core:c"
char :: builtin.u8 // assuming -funsigned-char char :: c.char // assuming -funsigned-char
short :: builtin.i16 short :: c.short
int :: builtin.i32 int :: c.int
long :: builtin.i32 when (ODIN_OS == "windows" || size_of(builtin.rawptr) == 4) else builtin.i64 long :: c.long
longlong :: builtin.i64 longlong :: c.longlong
uchar :: builtin.u8 uchar :: c.uchar
ushort :: builtin.u16 ushort :: c.ushort
uint :: builtin.u32 uint :: c.uint
ulong :: builtin.u32 when (ODIN_OS == "windows" || size_of(builtin.rawptr) == 4) else builtin.u64 ulong :: c.ulong
ulonglong :: builtin.u64 ulonglong :: c.ulonglong
bool :: distinct builtin.b8 bool :: c.bool
size_t :: builtin.uint size_t :: c.size_t
wchar_t :: builtin.u16 when (ODIN_OS == "windows") else builtin.u32 ssize_t :: c.ssize_t
wchar_t :: c.wchar_t
float :: builtin.f32 float :: c.float
double :: builtin.f64 double :: c.double
// 7.20.1 Integer types int8_t :: c.int8_t
int8_t :: builtin.i8 uint8_t :: c.uint8_t
uint8_t :: builtin.u8 int16_t :: c.int16_t
int16_t :: builtin.i16 uint16_t :: c.uint16_t
uint16_t :: builtin.u16 int32_t :: c.int32_t
int32_t :: builtin.i32 uint32_t :: c.uint32_t
uint32_t :: builtin.u32 int64_t :: c.int64_t
int64_t :: builtin.i64 uint64_t :: c.uint64_t
uint64_t :: builtin.u64
// These are all the same in multiple libc's for multiple architectures. int_least8_t :: c.int_least8_t
int_least8_t :: builtin.i8 uint_least8_t :: c.uint_least8_t
uint_least8_t :: builtin.u8 int_least16_t :: c.int_least16_t
int_least16_t :: builtin.i16 uint_least16_t :: c.uint_least16_t
uint_least16_t :: builtin.u16 int_least32_t :: c.int_least32_t
int_least32_t :: builtin.i32 uint_least32_t :: c.uint_least32_t
uint_least32_t :: builtin.u32 int_least64_t :: c.int_least64_t
int_least64_t :: builtin.i64 uint_least64_t :: c.uint_least64_t
uint_least64_t :: builtin.u64
// Same on Windows, Linux, and FreeBSD int_fast8_t :: c.int_fast8_t
when ODIN_ARCH == "386" || ODIN_ARCH == "amd64" { uint_fast8_t :: c.uint_fast8_t
int_fast8_t :: builtin.i8 int_fast16_t :: c.int_fast16_t
uint_fast8_t :: builtin.u8 uint_fast16_t :: c.uint_fast16_t
int_fast16_t :: builtin.i32 int_fast32_t :: c.int_fast32_t
uint_fast16_t :: builtin.u32 uint_fast32_t :: c.uint_fast32_t
int_fast32_t :: builtin.i32 int_fast64_t :: c.int_fast64_t
uint_fast32_t :: builtin.u32 uint_fast64_t :: c.uint_fast64_t
int_fast64_t :: builtin.i64
uint_fast64_t :: builtin.u64
}
intptr_t :: builtin.int intptr_t :: c.intptr_t
uintptr_t :: builtin.uintptr uintptr_t :: c.uintptr_t
ptrdiff_t :: distinct intptr_t ptrdiff_t :: c.ptrdiff_t
intmax_t :: builtin.i64 intmax_t :: c.intmax_t
uintmax_t :: builtin.u64 uintmax_t :: c.uintmax_t
// Copy C's rules for type promotion here by forcing the type on the literals. // Copy C's rules for type promotion here by forcing the type on the literals.
INT8_MAX :: int(0x7f) INT8_MAX :: c.INT8_MAX
INT16_MAX :: int(0x7fff) INT16_MAX :: c.INT16_MAX
INT32_MAX :: int(0x7fffffff) INT32_MAX :: c.INT32_MAX
INT64_MAX :: longlong(0x7fffffffffffffff) INT64_MAX :: c.INT64_MAX
UINT8_MAX :: int(0xff) UINT8_MAX :: c.UINT8_MAX
UINT16_MAX :: int(0xffff) UINT16_MAX :: c.UINT16_MAX
UINT32_MAX :: uint(0xffffffff) UINT32_MAX :: c.UINT32_MAX
UINT64_MAX :: ulonglong(0xffffffffffffffff) UINT64_MAX :: c.UINT64_MAX
INT8_MIN :: ~INT8_MAX INT8_MIN :: c.INT8_MIN
INT16_MIN :: ~INT16_MAX INT16_MIN :: c.INT16_MIN
INT32_MIN :: ~INT32_MAX INT32_MIN :: c.INT32_MIN
INT64_MIN :: ~INT64_MAX INT64_MIN :: c.INT64_MIN
NULL :: rawptr(uintptr(0)) NULL :: rawptr(uintptr(0))
NDEBUG :: !ODIN_DEBUG NDEBUG :: !ODIN_DEBUG
CHAR_BIT :: 8
+2 -2
View File
@@ -11,9 +11,9 @@ when ODIN_OS == "windows" {
@(default_calling_convention="c") @(default_calling_convention="c")
foreign libc { foreign libc {
// 7.28.1 Restartable multibyte/wide character conversion functions // 7.28.1 Restartable multibyte/wide character conversion functions
mbrtoc16 :: proc(pc16: ^char16_t, s: cstring, n: size_t, ps: ^mbstate_t) -> size_t --- mbrtoc16 :: proc(pc16: [^]char16_t, s: cstring, n: size_t, ps: ^mbstate_t) -> size_t ---
c16rtomb :: proc(s: ^char, c16: char16_t, ps: ^mbstate_t) -> size_t --- c16rtomb :: proc(s: ^char, c16: char16_t, ps: ^mbstate_t) -> size_t ---
mbrtoc32 :: proc(pc32: ^char32_t, s: cstring, n: size_t, ps: ^mbstate_t) -> size_t --- mbrtoc32 :: proc(pc32: [^]char32_t, s: cstring, n: size_t, ps: ^mbstate_t) -> size_t ---
c32rtomb :: proc(s: ^char, c32: char32_t, ps: ^mbstate_t) -> size_t --- c32rtomb :: proc(s: ^char, c32: char32_t, ps: ^mbstate_t) -> size_t ---
} }
+45 -45
View File
@@ -11,24 +11,24 @@ when ODIN_OS == "windows" {
@(default_calling_convention="c") @(default_calling_convention="c")
foreign libc { foreign libc {
// 7.29.2 Formatted wide character input/output functions // 7.29.2 Formatted wide character input/output functions
fwprintf :: proc(stream: ^FILE, format: ^wchar_t, #c_vararg arg: ..any) -> int --- fwprintf :: proc(stream: ^FILE, format: [^]wchar_t, #c_vararg arg: ..any) -> int ---
fwscanf :: proc(stream: ^FILE, format: ^wchar_t, #c_vararg arg: ..any) -> int --- fwscanf :: proc(stream: ^FILE, format: [^]wchar_t, #c_vararg arg: ..any) -> int ---
swprintf :: proc(stream: ^FILE, n: size_t, format: ^wchar_t, #c_vararg arg: ..any) -> int --- swprintf :: proc(stream: ^FILE, n: size_t, format: [^]wchar_t, #c_vararg arg: ..any) -> int ---
swscanf :: proc(s, format: ^wchar_t, #c_vararg arg: ..any) -> int --- swscanf :: proc(s, format: [^]wchar_t, #c_vararg arg: ..any) -> int ---
vfwprintf :: proc(stream: ^FILE, format: ^wchar_t, arg: va_list) -> int --- vfwprintf :: proc(stream: ^FILE, format: [^]wchar_t, arg: va_list) -> int ---
vfwscanf :: proc(stream: ^FILE, format: ^wchar_t, arg: va_list) -> int --- vfwscanf :: proc(stream: ^FILE, format: [^]wchar_t, arg: va_list) -> int ---
vswprintf :: proc(s: ^wchar_t, n: size_t, format: ^wchar_t, arg: va_list) -> int --- vswprintf :: proc(s: [^]wchar_t, n: size_t, format: [^]wchar_t, arg: va_list) -> int ---
vswscanf :: proc(s, format: ^wchar_t, arg: va_list) -> int --- vswscanf :: proc(s, format: [^]wchar_t, arg: va_list) -> int ---
vwprintf :: proc(format: ^wchar_t, arg: va_list) -> int --- vwprintf :: proc(format: [^]wchar_t, arg: va_list) -> int ---
vwscanf :: proc(format: ^wchar_t, arg: va_list) -> int --- vwscanf :: proc(format: [^]wchar_t, arg: va_list) -> int ---
wprintf :: proc(format: ^wchar_t, #c_vararg arg: ..any) -> int --- wprintf :: proc(format: [^]wchar_t, #c_vararg arg: ..any) -> int ---
wscanf :: proc(format: ^wchar_t, #c_vararg arg: ..any) -> int --- wscanf :: proc(format: [^]wchar_t, #c_vararg arg: ..any) -> int ---
// 7.29.3 Wide character input/output functions // 7.29.3 Wide character input/output functions
fwgetc :: proc(stream: ^FILE) -> wint_t --- fwgetc :: proc(stream: ^FILE) -> wint_t ---
fgetws :: proc(s: ^wchar_t, n: int, stream: ^FILE) -> wchar_t --- fgetws :: proc(s: [^]wchar_t, n: int, stream: ^FILE) -> wchar_t ---
fputwc :: proc(c: wchar_t, stream: ^FILE) -> wint_t --- fputwc :: proc(c: wchar_t, stream: ^FILE) -> wint_t ---
fputws :: proc(s: ^wchar_t, stream: ^FILE) -> int --- fputws :: proc(s: [^]wchar_t, stream: ^FILE) -> int ---
fwide :: proc(stream: ^FILE, mode: int) -> int --- fwide :: proc(stream: ^FILE, mode: int) -> int ---
getwc :: proc(stream: ^FILE) -> wint_t --- getwc :: proc(stream: ^FILE) -> wint_t ---
getwchar :: proc() -> wint_t --- getwchar :: proc() -> wint_t ---
@@ -37,46 +37,46 @@ foreign libc {
ungetwc :: proc(c: wchar_t, stream: ^FILE) -> wint_t --- ungetwc :: proc(c: wchar_t, stream: ^FILE) -> wint_t ---
// 7.29.4 General wide string utilities // 7.29.4 General wide string utilities
wcstod :: proc(nptr: ^wchar_t, endptr: ^^wchar_t) -> double --- wcstod :: proc(nptr: [^]wchar_t, endptr: ^[^]wchar_t) -> double ---
wcstof :: proc(nptr: ^wchar_t, endptr: ^^wchar_t) -> float --- wcstof :: proc(nptr: [^]wchar_t, endptr: ^[^]wchar_t) -> float ---
wcstol :: proc(nptr: ^wchar_t, endptr: ^^wchar_t, base: int) -> long --- wcstol :: proc(nptr: [^]wchar_t, endptr: ^[^]wchar_t, base: int) -> long ---
wcstoll :: proc(nptr: ^wchar_t, endptr: ^^wchar_t, base: int) -> longlong --- wcstoll :: proc(nptr: [^]wchar_t, endptr: ^[^]wchar_t, base: int) -> longlong ---
wcstoul :: proc(nptr: ^wchar_t, endptr: ^^wchar_t, base: int) -> ulong --- wcstoul :: proc(nptr: [^]wchar_t, endptr: ^[^]wchar_t, base: int) -> ulong ---
wcstoull :: proc(nptr: ^wchar_t, endptr: ^^wchar_t, base: int) -> ulonglong --- wcstoull :: proc(nptr: [^]wchar_t, endptr: ^[^]wchar_t, base: int) -> ulonglong ---
// 7.29.4.2 Wide string copying functions // 7.29.4.2 Wide string copying functions
wcscpy :: proc(s1, s2: ^wchar_t) -> ^wchar_t --- wcscpy :: proc(s1, s2: [^]wchar_t) -> [^]wchar_t ---
wcsncpy :: proc(s1, s2: ^wchar_t, n: size_t) -> ^wchar_t --- wcsncpy :: proc(s1, s2: [^]wchar_t, n: size_t) -> [^]wchar_t ---
wmemcpy :: proc(s1, s2: ^wchar_t, n: size_t) -> ^wchar_t --- wmemcpy :: proc(s1, s2: [^]wchar_t, n: size_t) -> [^]wchar_t ---
wmemmove :: proc(s1, s2: ^wchar_t, n: size_t) -> ^wchar_t --- wmemmove :: proc(s1, s2: [^]wchar_t, n: size_t) -> [^]wchar_t ---
// 7.29.4.3 Wide string concatenation functions // 7.29.4.3 Wide string concatenation functions
wcscat :: proc(s1, s2: ^wchar_t) -> ^wchar_t --- wcscat :: proc(s1, s2: [^]wchar_t) -> [^]wchar_t ---
wcsncat :: proc(s1, s2: ^wchar_t, n: size_t) -> ^wchar_t --- wcsncat :: proc(s1, s2: [^]wchar_t, n: size_t) -> [^]wchar_t ---
// 7.29.4.4 Wide string comparison functions // 7.29.4.4 Wide string comparison functions
wcscmp :: proc(s1, s2: ^wchar_t) -> int --- wcscmp :: proc(s1, s2: [^]wchar_t) -> int ---
wcscoll :: proc(s1, s2: ^wchar_t) -> int --- wcscoll :: proc(s1, s2: [^]wchar_t) -> int ---
wcsncmp :: proc(s1, s2: ^wchar_t, n: size_t) -> int --- wcsncmp :: proc(s1, s2: [^]wchar_t, n: size_t) -> int ---
wcsxfrm :: proc(s1, s2: ^wchar_t, n: size_t) -> size_t --- wcsxfrm :: proc(s1, s2: [^]wchar_t, n: size_t) -> size_t ---
wmemcmp :: proc(s1, s2: ^wchar_t, n: size_t) -> int --- wmemcmp :: proc(s1, s2: [^]wchar_t, n: size_t) -> int ---
// 7.29.4.5 Wide string search functions // 7.29.4.5 Wide string search functions
wcschr :: proc(s: ^wchar_t, c: wchar_t) -> ^wchar_t --- wcschr :: proc(s: [^]wchar_t, c: wchar_t) -> [^]wchar_t ---
wcscspn :: proc(s1, s2: ^wchar_t) -> size_t --- wcscspn :: proc(s1, s2: [^]wchar_t) -> size_t ---
wcspbrk :: proc(s1, s2: ^wchar_t) -> ^wchar_t --- wcspbrk :: proc(s1, s2: [^]wchar_t) -> [^]wchar_t ---
wcsrchr :: proc(s: ^wchar_t, c: wchar_t) -> ^wchar_t --- wcsrchr :: proc(s: [^]wchar_t, c: wchar_t) -> [^]wchar_t ---
wcsspn :: proc(s1, s2: ^wchar_t) -> size_t --- wcsspn :: proc(s1, s2: [^]wchar_t) -> size_t ---
wcsstr :: proc(s1, s2: ^wchar_t) -> ^wchar_t --- wcsstr :: proc(s1, s2: [^]wchar_t) -> [^]wchar_t ---
wcstok :: proc(s1, s2: ^wchar_t, ptr: ^^wchar_t) -> ^wchar_t --- wcstok :: proc(s1, s2: [^]wchar_t, ptr: ^[^]wchar_t) -> [^]wchar_t ---
wmemchr :: proc(s: ^wchar_t, c: wchar_t, n: size_t) -> ^wchar_t --- wmemchr :: proc(s: [^]wchar_t, c: wchar_t, n: size_t) -> [^]wchar_t ---
// 7.29.4.6 Miscellaneous functions // 7.29.4.6 Miscellaneous functions
wcslen :: proc(s: ^wchar_t) -> size_t --- wcslen :: proc(s: [^]wchar_t) -> size_t ---
wmemset :: proc(s: ^wchar_t, c: wchar_t, n: size_t) -> ^wchar_t --- wmemset :: proc(s: [^]wchar_t, c: wchar_t, n: size_t) -> [^]wchar_t ---
// 7.29.5 Wide character time conversion functions // 7.29.5 Wide character time conversion functions
wcsftime :: proc(s: ^wchar_t, maxsize: size_t, format: ^wchar_t, timeptr: ^tm) -> size_t --- wcsftime :: proc(s: [^]wchar_t, maxsize: size_t, format: [^]wchar_t, timeptr: ^tm) -> size_t ---
// 7.29.6.1 Single-byte/wide character conversion functions // 7.29.6.1 Single-byte/wide character conversion functions
btowc :: proc(c: int) -> wint_t --- btowc :: proc(c: int) -> wint_t ---
@@ -87,12 +87,12 @@ foreign libc {
// 7.29.6.3 Restartable multibyte/wide character conversion functions // 7.29.6.3 Restartable multibyte/wide character conversion functions
mbrlen :: proc(s: cstring, n: size_t, ps: ^mbstate_t) -> size_t --- mbrlen :: proc(s: cstring, n: size_t, ps: ^mbstate_t) -> size_t ---
mbrtowc :: proc(pwc: ^wchar_t, s: cstring, n: size_t, ps: ^mbstate_t) -> size_t --- mbrtowc :: proc(pwc: [^]wchar_t, s: cstring, n: size_t, ps: ^mbstate_t) -> size_t ---
wcrtomb :: proc(s: ^char, wc: wchar_t, ps: ^mbstate_t) -> size_t --- wcrtomb :: proc(s: ^char, wc: wchar_t, ps: ^mbstate_t) -> size_t ---
// 7.29.6.4 Restartable multibyte/wide string conversion functions // 7.29.6.4 Restartable multibyte/wide string conversion functions
mbsrtowcs :: proc(dst: ^wchar_t, src: ^cstring, len: size_t, ps: ^mbstate_t) -> size_t --- mbsrtowcs :: proc(dst: [^]wchar_t, src: ^cstring, len: size_t, ps: ^mbstate_t) -> size_t ---
wcsrtombs :: proc(dst: ^char, src: ^^wchar_t, len: size_t, ps: ^mbstate_t) -> size_t --- wcsrtombs :: proc(dst: ^char, src: ^[^]wchar_t, len: size_t, ps: ^mbstate_t) -> size_t ---
} }
// Large enough and aligned enough for any wide-spread in-use libc. // Large enough and aligned enough for any wide-spread in-use libc.
+9 -2
View File
@@ -3,8 +3,15 @@ package mem
import "core:runtime" import "core:runtime"
import "core:intrinsics" import "core:intrinsics"
set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr { set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr #no_bounds_check {
return runtime.memset(data, i32(value), len) if data != nil && len != 0 {
b := byte(value)
p := ([^]byte)(data)[:len]
for v in &p {
v = b
}
}
return data
} }
zero :: proc "contextless" (data: rawptr, len: int) -> rawptr { zero :: proc "contextless" (data: rawptr, len: int) -> rawptr {
return set(data, 0, len) return set(data, 0, len)
+1
View File
@@ -1,3 +1,4 @@
//+private
package runtime package runtime
@(link_name="memset") @(link_name="memset")
+10 -11
View File
@@ -1,18 +1,17 @@
//+build linux, darwin, freebsd //+build linux, darwin, freebsd
//+private
package runtime package runtime
import "core:intrinsics"
@(link_name="memset") @(link_name="memset")
memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr #no_bounds_check {
if ptr == nil || len == 0 { if ptr != nil && len != 0 {
return ptr b := byte(val)
p := ([^]byte)(ptr)[:len]
for v in &p {
v = b
}
} }
b := byte(val)
p_start := uintptr(ptr)
p_end := p_start + uintptr(max(len, 0))
for p := p_start; p < p_end; p += 1 {
(^byte)(p)^ = b
}
return ptr return ptr
} }
+9 -12
View File
@@ -1,18 +1,15 @@
//+build wasm32 //+build wasm32
//+private
package runtime package runtime
@(link_name="memset") @(link_name="memset")
memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr #no_bounds_check {
if ptr == nil || len == 0 { if ptr != nil && len != 0 {
return ptr; b := byte(val)
p := ([^]byte)(ptr)[:len]
for v in &p {
v = b
}
} }
b := byte(val); return ptr
p_start := uintptr(ptr);
p_end := p_start + uintptr(max(len, 0));
for p := p_start; p < p_end; p += 1 {
(^byte)(p)^ = b;
}
return ptr;
} }
+30 -52
View File
@@ -1,3 +1,4 @@
//+private
package runtime package runtime
@require foreign import "system:int64.lib" @require foreign import "system:int64.lib"
@@ -5,40 +6,39 @@ package runtime
foreign import kernel32 "system:Kernel32.lib" foreign import kernel32 "system:Kernel32.lib"
windows_trap_array_bounds :: proc "contextless" () -> ! { windows_trap_array_bounds :: proc "contextless" () -> ! {
DWORD :: u32; DWORD :: u32
ULONG_PTR :: uint; ULONG_PTR :: uint
EXCEPTION_ARRAY_BOUNDS_EXCEEDED :: 0xC000008C; EXCEPTION_ARRAY_BOUNDS_EXCEEDED :: 0xC000008C
foreign kernel32 { foreign kernel32 {
RaiseException :: proc "stdcall" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! --- RaiseException :: proc "stdcall" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
} }
RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED, 0, 0, nil); RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED, 0, 0, nil)
} }
windows_trap_type_assertion :: proc "contextless" () -> ! { windows_trap_type_assertion :: proc "contextless" () -> ! {
windows_trap_array_bounds(); windows_trap_array_bounds()
} }
@(private, require, link_name="_fltused") _fltused: i32 = 0x9875; @(private, require, link_name="_fltused") _fltused: i32 = 0x9875
@(private, require, link_name="_tls_index") _tls_index: u32; @(private, require, link_name="_tls_index") _tls_index: u32
@(private, require, link_name="_tls_array") _tls_array: u32; @(private, require, link_name="_tls_array") _tls_array: u32
@(link_name="memcpy") @(link_name="memcpy")
memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr { memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
if dst == nil || src == nil || len == 0 || dst == src { if dst == nil || src == nil || len == 0 || dst == src {
return dst; return dst
} }
d := uintptr(dst); d := ([^]byte)(dst)
s := uintptr(src); s := ([^]byte)(src)
n := uintptr(len);
for i in 0..<n { for i in 0..<len {
(^byte)(d+i)^ = (^byte)(s+i)^; d[i] = s[i]
} }
return dst; return dst;
@@ -47,57 +47,35 @@ memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
@(link_name="memmove") @(link_name="memmove")
memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr { memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
if dst == nil || src == nil || len == 0 || dst == src { if dst == nil || src == nil || len == 0 || dst == src {
return dst; return dst
} }
d := uintptr(dst); d := ([^]byte)(dst)
s := uintptr(src); s := ([^]byte)(src)
n := uintptr(len);
if s < d && d < s+n { if s < d && d < s[len:] {
// Overlap // Overlap
for i := n-1; n >= 0; i -= 1 { for i := len-1; len >= 0; i -= 1 {
(^byte)(d+i)^ = (^byte)(s+i)^; d[i] = s[i]
} }
} else { } else {
for i in 0..<n { for i in 0..<len {
(^byte)(d+i)^ = (^byte)(s+i)^; d[i] = s[i]
} }
} }
return dst; return dst
} }
@(link_name="memset") @(link_name="memset")
memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr {
if ptr == nil || len == 0 { if ptr != nil && len != 0 {
return ptr; b := byte(val)
p := ([^]byte)(ptr)[:len]
for v in &p {
v = b
}
} }
d := uintptr(ptr); return ptr
b := byte(val);
for i in 0..<uintptr(len) {
(^byte)(d+i)^ = b;
}
return ptr;
} }
// @(link_name="memcmp")
// memcmp :: proc "c" (dst, src: rawptr, len: int) -> i32 {
// if dst == nil || src == nil {
// return 0;
// }
// if dst == src {
// return 0;
// }
// d, s := uintptr(dst), uintptr(src);
// n := uintptr(len);
// for i := uintptr(0); i < n; i += 1 {
// x, y := (^byte)(d+i)^, (^byte)(s+i)^;
// if x != y {
// return x < y ? -1 : +1;
// }
// }
// return 0;
// }
+8 -12
View File
@@ -1,3 +1,4 @@
//+private
package runtime package runtime
foreign import kernel32 "system:Kernel32.lib" foreign import kernel32 "system:Kernel32.lib"
@@ -51,19 +52,14 @@ memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
} }
// @(link_name="memset") // @(link_name="memset")
memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr #no_bounds_check {
if ptr == nil || len == 0 { if ptr != nil && len != 0 {
return ptr b := byte(val)
p := ([^]byte)(ptr)[:len]
for v in &p {
v = b
}
} }
b := byte(val)
p_start := uintptr(ptr)
p_end := p_start + uintptr(max(len, 0))
for p := p_start; p < p_end; p += 1 {
(^byte)(p)^ = b
}
return ptr return ptr
} }