mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 07:38:48 +00:00
libc changes: unify c and libc types; Add [^]T where appropriate
This commit is contained in:
+92
-31
@@ -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
|
|
||||||
|
|||||||
@@ -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 ---
|
||||||
|
|||||||
@@ -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
@@ -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 ---
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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,3 +1,4 @@
|
|||||||
|
//+private
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
@(link_name="memset")
|
@(link_name="memset")
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
// }
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user