Merge remote-tracking branch 'live/master' into macharena

This commit is contained in:
Colin Davidson
2025-07-28 14:24:46 -07:00
121 changed files with 4615 additions and 1781 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -3,7 +3,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ import "core:c"
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -7,7 +7,7 @@ import "base:intrinsics"
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -9,7 +9,7 @@ when ODIN_OS == .Windows {
"system:legacy_stdio_definitions.lib",
}
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -7,7 +7,7 @@ import "base:runtime"
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ package libc
when ODIN_OS == .Windows {
foreign import libc "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+2 -3
View File
@@ -21,8 +21,7 @@ hash_string :: proc(algorithm: Algorithm, data: string, allocator := context.all
// in a newly allocated slice.
hash_bytes :: proc(algorithm: Algorithm, data: []byte, allocator := context.allocator) -> []byte {
dst := make([]byte, DIGEST_SIZES[algorithm], allocator)
hash_bytes_to_buffer(algorithm, data, dst)
return dst
return hash_bytes_to_buffer(algorithm, data, dst)
}
// hash_string_to_buffer will hash the given input and assign the
@@ -46,7 +45,7 @@ hash_bytes_to_buffer :: proc(algorithm: Algorithm, data, hash: []byte) -> []byte
update(&ctx, data)
final(&ctx, hash)
return hash
return hash[:DIGEST_SIZES[algorithm]]
}
// hash_stream will incrementally fully consume a stream, and return the
+1 -1
View File
@@ -127,7 +127,7 @@ jenkins :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 {
}
@(optimization_mode="favor_size")
murmur32 :: proc "contextless" (data: []byte, seed := u32(0)) -> u32 {
murmur32 :: proc "contextless" (data: []byte, seed := u32(0x9747b28c)) -> u32 {
c1_32: u32 : 0xcc9e2d51
c2_32: u32 : 0x1b873593
+4 -1
View File
@@ -2223,6 +2223,9 @@ Initialize a buddy allocator.
This procedure initializes the buddy allocator `b` with a backing buffer `data`
and block alignment specified by `alignment`.
`alignment` may be any power of two, but the backing buffer must be aligned to
at least `size_of(Buddy_Block)`.
*/
buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint, loc := #caller_location) {
assert(data != nil)
@@ -2233,7 +2236,7 @@ buddy_allocator_init :: proc(b: ^Buddy_Allocator, data: []byte, alignment: uint,
alignment = size_of(Buddy_Block)
}
ptr := raw_data(data)
assert(uintptr(ptr) % uintptr(alignment) == 0, "data is not aligned to minimum alignment", loc)
assert(uintptr(ptr) % uintptr(alignment) == 0, "The data is not aligned to the minimum alignment, which must be at least `size_of(Buddy_Block)`.", loc)
b.head = (^Buddy_Block)(ptr)
b.head.size = len(data)
b.head.is_free = true
+2 -2
View File
@@ -89,8 +89,8 @@ memory_block_alloc :: proc(committed, reserved: uint, alignment: uint = 0, flags
reserved = align_formula(reserved, page_size)
committed = clamp(committed, 0, reserved)
total_size := uint(reserved + max(alignment, size_of(Platform_Memory_Block)))
base_offset := uintptr(max(alignment, size_of(Platform_Memory_Block)))
total_size := reserved + alignment + size_of(Platform_Memory_Block)
base_offset := mem.align_forward_uintptr(size_of(Platform_Memory_Block), max(uintptr(alignment), align_of(Platform_Memory_Block)))
protect_offset := uintptr(0)
do_protection := false
+1 -1
View File
@@ -23,7 +23,7 @@ package net
import "core:strings"
import "core:sys/posix"
foreign import lib "system:System.framework"
foreign import lib "system:System"
@(private)
_enumerate_interfaces :: proc(allocator := context.allocator) -> (interfaces: []Network_Interface, err: Interfaces_Error) {
+23 -20
View File
@@ -348,27 +348,30 @@ consume_comment_group :: proc(p: ^Parser, n: int) -> (comments: ^ast.Comment_Gro
}
consume_comment_groups :: proc(p: ^Parser, prev: tokenizer.Token) {
if p.curr_tok.kind == .Comment {
comment: ^ast.Comment_Group
end_line := 0
if p.curr_tok.pos.line == prev.pos.line {
comment, end_line = consume_comment_group(p, 0)
if p.curr_tok.pos.line != end_line || p.curr_tok.kind == .EOF {
p.line_comment = comment
}
}
end_line = -1
for p.curr_tok.kind == .Comment {
comment, end_line = consume_comment_group(p, 1)
}
if end_line+1 >= p.curr_tok.pos.line || end_line < 0 {
p.lead_comment = comment
}
assert(p.curr_tok.kind != .Comment)
if p.curr_tok.kind != .Comment {
return
}
comment: ^ast.Comment_Group
end_line := 0
if p.curr_tok.pos.line == prev.pos.line {
comment, end_line = consume_comment_group(p, 0)
if p.curr_tok.pos.line != end_line ||
p.curr_tok.pos.line == prev.pos.line+1 ||
p.curr_tok.kind == .EOF {
p.line_comment = comment
}
}
end_line = -1
for p.curr_tok.kind == .Comment {
comment, end_line = consume_comment_group(p, 1)
}
if end_line+1 >= p.curr_tok.pos.line || end_line < 0 {
p.lead_comment = comment
}
assert(p.curr_tok.kind != .Comment)
}
advance_token :: proc(p: ^Parser) -> tokenizer.Token {
+1 -1
View File
@@ -10,7 +10,7 @@ import "core:sys/posix"
import "core:sys/unix"
import "core:time"
foreign import lib "system:System.framework"
foreign import lib "system:System"
foreign lib {
sysctl :: proc(
+2 -2
View File
@@ -1,8 +1,8 @@
package os
foreign import dl "system:dl"
foreign import libc "system:System.framework"
foreign import pthread "system:System.framework"
foreign import libc "system:System"
foreign import pthread "system:System"
import "base:runtime"
import "core:strings"
+2 -2
View File
@@ -967,8 +967,8 @@ _processor_core_count :: proc() -> int {
@(private, require_results)
_alloc_command_line_arguments :: proc() -> []string {
res := make([]string, len(runtime.args__))
for arg, i in runtime.args__ {
res[i] = string(arg)
for _, i in res {
res[i] = string(runtime.args__[i])
}
return res
}
+2 -2
View File
@@ -1100,8 +1100,8 @@ _processor_core_count :: proc() -> int {
@(private, require_results)
_alloc_command_line_arguments :: proc() -> []string {
res := make([]string, len(runtime.args__))
for arg, i in runtime.args__ {
res[i] = string(arg)
for _, i in res {
res[i] = string(runtime.args__[i])
}
return res
}
+2 -2
View File
@@ -1017,8 +1017,8 @@ _processor_core_count :: proc() -> int {
@(private, require_results)
_alloc_command_line_arguments :: proc() -> []string {
res := make([]string, len(runtime.args__))
for arg, i in runtime.args__ {
res[i] = string(arg)
for _, i in res {
res[i] = string(runtime.args__[i])
}
return res
}
+2 -2
View File
@@ -917,8 +917,8 @@ _processor_core_count :: proc() -> int {
@(private, require_results)
_alloc_command_line_arguments :: proc() -> []string {
res := make([]string, len(runtime.args__))
for arg, i in runtime.args__ {
res[i] = string(arg)
for _, i in res {
res[i] = string(runtime.args__[i])
}
return res
}
+1
View File
@@ -1,4 +1,5 @@
#+build !wasi
#+build !js
package filepath
import "core:os"
+1
View File
@@ -1,4 +1,5 @@
#+build !wasi
#+build !js
package filepath
import "core:os"
+51
View File
@@ -2440,6 +2440,57 @@ Graphically, the operation looks as follows. The `t` and `f` represent the
*/
select :: intrinsics.simd_select
/*
Runtime Equivalent to Shuffle.
Performs element-wise table lookups using runtime indices.
Each element in the indices vector selects an element from the table vector.
The indices are automatically masked to prevent out-of-bounds access.
This operation is hardware-accelerated on most platforms when using 8-bit
integer vectors. For other element types or unsupported vector sizes, it
falls back to software emulation.
Inputs:
- `table`: The lookup table vector (should be power-of-2 size for correct masking).
- `indices`: The indices vector (automatically masked to valid range).
Returns:
- A vector where `result[i] = table[indices[i] & (table_size-1)]`.
Operation:
for i in 0 ..< len(indices) {
masked_index := indices[i] & (len(table) - 1)
result[i] = table[masked_index]
}
return result
Implementation:
| Platform | Lane Size | Implementation |
|-------------|-------------------------------------------|---------------------|
| x86-64 | pshufb (16B), vpshufb (32B), AVX512 (64B) | Single vector |
| ARM64 | tbl1 (16B), tbl2 (32B), tbl4 (64B) | Automatic splitting |
| ARM32 | vtbl1 (8B), vtbl2 (16B), vtbl4 (32B) | Automatic splitting |
| WebAssembly | i8x16.swizzle (16B), Emulation (>16B) | Mixed |
| Other | Emulation | Software |
Example:
import "core:simd"
import "core:fmt"
runtime_swizzle_example :: proc() {
table := simd.u8x16{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
indices := simd.u8x16{15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
result := simd.runtime_swizzle(table, indices)
fmt.println(result) // Expected: {15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
}
*/
runtime_swizzle :: intrinsics.simd_runtime_swizzle
/*
Compute the square root of each lane in a SIMD vector.
*/
+1 -1
View File
@@ -6,7 +6,7 @@ import "core:c"
import "core:sys/darwin"
import "core:time"
foreign import System "system:System.framework"
foreign import System "system:System"
foreign System {
// __ulock_wait is not available on 10.15
+1 -1
View File
@@ -5,7 +5,7 @@ package sync
import "core:c"
import "base:intrinsics"
foreign import pthread "system:System.framework"
foreign import pthread "system:System"
_current_thread_id :: proc "contextless" () -> int {
tid: u64
+1 -1
View File
@@ -62,7 +62,7 @@ global_block_descriptor := Block_Descriptor{
size = size_of(Internal_Block_Literal),
}
foreign import libSystem "system:System.framework"
foreign import libSystem "system:System"
foreign libSystem {
_NSConcreteGlobalBlock: intrinsics.objc_class
_NSConcreteStackBlock: intrinsics.objc_class
+1 -1
View File
@@ -4,7 +4,7 @@ package darwin
import "core:c"
@(export)
foreign import system "system:System.framework"
foreign import system "system:System"
Bool :: b8
+1 -1
View File
@@ -1,6 +1,6 @@
package darwin
foreign import mach "system:System.framework"
foreign import mach "system:System"
import "core:c"
import "base:intrinsics"
+1 -1
View File
@@ -4,7 +4,7 @@ import "base:intrinsics"
import "core:sys/posix"
foreign import lib "system:System.framework"
foreign import lib "system:System"
// Incomplete bindings to the proc API on MacOS, add to when needed.
+5 -15
View File
@@ -3,23 +3,13 @@ package darwin
// #define OS_WAIT_ON_ADDR_AVAILABILITY \
// __API_AVAILABLE(macos(14.4), ios(17.4), tvos(17.4), watchos(10.4))
when ODIN_OS == .Darwin {
when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 17_04_00 {
WAIT_ON_ADDRESS_AVAILABLE :: true
} else when ODIN_MINIMUM_OS_VERSION >= 14_04_00 {
WAIT_ON_ADDRESS_AVAILABLE :: true
when ODIN_PLATFORM_SUBTARGET_IOS {
WAIT_ON_ADDRESS_AVAILABLE :: ODIN_MINIMUM_OS_VERSION >= 17_04_00
ULOCK_WAIT_2_AVAILABLE :: ODIN_MINIMUM_OS_VERSION >= 14_00_00
} else {
WAIT_ON_ADDRESS_AVAILABLE :: false
WAIT_ON_ADDRESS_AVAILABLE :: ODIN_MINIMUM_OS_VERSION >= 14_04_00
ULOCK_WAIT_2_AVAILABLE :: ODIN_MINIMUM_OS_VERSION >= 11_00_00
}
when ODIN_PLATFORM_SUBTARGET == .iOS && ODIN_MINIMUM_OS_VERSION >= 14_00_00 {
ULOCK_WAIT_2_AVAILABLE :: true
} else when ODIN_MINIMUM_OS_VERSION >= 11_00_00 {
ULOCK_WAIT_2_AVAILABLE :: true
} else {
ULOCK_WAIT_2_AVAILABLE :: false
}
} else {
WAIT_ON_ADDRESS_AVAILABLE :: false
ULOCK_WAIT_2_AVAILABLE :: false
+1 -1
View File
@@ -28,7 +28,7 @@ init_platform :: proc() {
macos_version = {int(version.majorVersion), int(version.minorVersion), int(version.patchVersion)}
when ODIN_PLATFORM_SUBTARGET == .iOS {
when ODIN_PLATFORM_SUBTARGET_IOS {
os_version.platform = .iOS
ws(&b, "iOS")
} else {
+1 -1
View File
@@ -2,7 +2,7 @@
package kqueue
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else when ODIN_OS == .Haiku {
foreign import lib "system:network"
} else {
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD {
foreign import lib "system:dl"
} else {
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -2,7 +2,7 @@
package posix
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -6,7 +6,7 @@ import "base:intrinsics"
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .Linux {
foreign import lib "system:pthread"
} else {
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -6,7 +6,7 @@ import "base:intrinsics"
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -9,7 +9,7 @@ import "core:c/libc"
when ODIN_OS == .Windows {
foreign import lib "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -10,7 +10,7 @@ when ODIN_OS == .Windows {
"system:legacy_stdio_definitions.lib",
}
} else when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -6,7 +6,7 @@ import "base:intrinsics"
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -9,7 +9,7 @@ import "core:c/libc"
when ODIN_OS == .Windows {
foreign import lib "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
when ODIN_OS == .Windows {
foreign import lib "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -6,7 +6,7 @@ import "base:intrinsics"
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -2,7 +2,7 @@
package posix
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import libc "system:System.framework"
foreign import libc "system:System"
} else {
foreign import libc "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -5,7 +5,7 @@ import "core:c"
import "core:c/libc"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -6,7 +6,7 @@ import "core:c"
when ODIN_OS == .Windows {
foreign import lib "system:libucrt.lib"
} else when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -2,7 +2,7 @@
package posix
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+1 -1
View File
@@ -4,7 +4,7 @@ package posix
import "core:c"
when ODIN_OS == .Darwin {
foreign import lib "system:System.framework"
foreign import lib "system:System"
} else {
foreign import lib "system:c"
}
+3 -2
View File
@@ -25,11 +25,12 @@ COINIT :: enum DWORD {
SPEED_OVER_MEMORY = 0x8,
}
IUnknown_UUID_STRING :: "00000000-0000-0000-C000-000000000046"
IUnknown_UUID := &IID{0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
IUnknownVtbl :: IUnknown_VTable
IUnknown :: struct {
using _iunknown_vtable: ^IUnknown_VTable,
}
IUnknownVtbl :: IUnknown_VTable
IUnknown_VTable :: struct {
QueryInterface: proc "system" (This: ^IUnknown, riid: REFIID, ppvObject: ^rawptr) -> HRESULT,
AddRef: proc "system" (This: ^IUnknown) -> ULONG,
+33 -4
View File
@@ -170,15 +170,15 @@ wstring_to_utf8_alloc :: proc(s: wstring, N: int, allocator := context.temp_allo
return string(text[:n]), nil
}
wstring_to_utf8_buf :: proc(buf: []u8, s: wstring) -> (res: string) {
n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, -1, nil, 0, nil, nil)
wstring_to_utf8_buf :: proc(buf: []u8, s: wstring, N := -1) -> (res: string) {
n := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), nil, 0, nil, nil)
if n == 0 {
return
} else if int(n) > len(buf) {
return
}
n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, -1, raw_data(buf), n, nil, nil)
n2 := WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, s, i32(N), raw_data(buf), n, nil, nil)
if n2 == 0 {
return
} else if int(n2) > len(buf) {
@@ -196,6 +196,21 @@ wstring_to_utf8_buf :: proc(buf: []u8, s: wstring) -> (res: string) {
wstring_to_utf8 :: proc{wstring_to_utf8_alloc, wstring_to_utf8_buf}
/*
Converts a UTF-16 string into a regular UTF-8 `string` and allocates the result.
If the input is null-terminated, only the part of the input string leading up
to it will be converted.
*Allocates Using Provided Allocator*
Inputs:
- s: The string to be converted
- allocator: (default: context.allocator)
Returns:
- res: A cloned and converted string
- err: An optional allocator error if one occured, `nil` otherwise
*/
utf16_to_utf8_alloc :: proc(s: []u16, allocator := context.temp_allocator) -> (res: string, err: runtime.Allocator_Error) {
if len(s) == 0 {
return "", nil
@@ -203,11 +218,25 @@ utf16_to_utf8_alloc :: proc(s: []u16, allocator := context.temp_allocator) -> (r
return wstring_to_utf8(raw_data(s), len(s), allocator)
}
/*
Converts a UTF-16 string into a regular UTF-8 `string`, using `buf` as its backing.
If the input is null-terminated, only the part of the input string leading up
to it will be converted.
*Uses `buf` for backing*
Inputs:
- s: The string to be converted
- buf: Backing buffer for result string
Returns:
- res: A converted string, backed byu `buf`
*/
utf16_to_utf8_buf :: proc(buf: []u8, s: []u16) -> (res: string) {
if len(s) == 0 {
return
}
return wstring_to_utf8(buf, raw_data(s))
return wstring_to_utf8(buf, raw_data(s), len(s))
}
utf16_to_utf8 :: proc{utf16_to_utf8_alloc, utf16_to_utf8_buf}