فهرست منبع

Merge pull request #3238 from laytan/libc-free-raylib-and-rectpack

makes raylib and stb_rect_pack free of libc
gingerBill 1 سال پیش
والد
کامیت
04bfc926ee
6فایلهای تغییر یافته به همراه42 افزوده شده و 21 حذف شده
  1. 10 0
      core/c/c.odin
  2. 3 9
      core/c/libc/stdarg.odin
  3. 5 2
      vendor/raylib/raygui.odin
  4. 3 5
      vendor/raylib/raylib.odin
  5. 19 3
      vendor/raylib/raymath.odin
  6. 2 2
      vendor/stb/rect_pack/stb_rect_pack.odin

+ 10 - 0
core/c/c.odin

@@ -104,3 +104,13 @@ NULL           :: rawptr(uintptr(0))
 NDEBUG         :: !ODIN_DEBUG
 
 CHAR_BIT :: 8
+
+// Since there are no types in C with an alignment larger than that of
+// max_align_t, which cannot be larger than sizeof(long double) as any other
+// exposed type wouldn't be valid C, the maximum alignment possible in a
+// strictly conformant C implementation is 16 on the platforms we care about.
+// The choice of 4096 bytes for storage of this type is more than enough on all
+// relevant platforms.
+va_list :: struct #align(16) {
+	_: [4096]u8,
+}

+ 3 - 9
core/c/libc/stdarg.odin

@@ -4,6 +4,8 @@ package libc
 
 import "base:intrinsics"
 
+import "core:c"
+
 @(private="file")
 @(default_calling_convention="none")
 foreign _ {
@@ -12,15 +14,7 @@ foreign _ {
 	@(link_name="llvm.va_copy")  _va_copy  :: proc(dst, src: ^i8) ---
 }
 
-// Since there are no types in C with an alignment larger than that of
-// max_align_t, which cannot be larger than sizeof(long double) as any other
-// exposed type wouldn't be valid C, the maximum alignment possible in a
-// strictly conformant C implementation is 16 on the platforms we care about.
-// The choice of 4096 bytes for storage of this type is more than enough on all
-// relevant platforms.
-va_list :: struct #align(16) {
-	_: [4096]u8,
-}
+va_list :: c.va_list
 
 va_start :: #force_inline proc(ap: ^va_list, _: any) {
 	_va_start(cast(^i8)ap)

+ 5 - 2
vendor/raylib/raygui.odin

@@ -1,6 +1,6 @@
 package raylib
 
-import c "core:c/libc"
+import "core:c"
 
 RAYGUI_SHARED :: #config(RAYGUI_SHARED, false)
 
@@ -240,7 +240,10 @@ SCROLLBAR_RIGHT_SIDE :: 1
 
 @(default_calling_convention="c")
 foreign lib {
-	@(link_name="raylib_version") version: cstring
+	// WASM does not have foreign variable declarations.
+	when ODIN_ARCH != .wasm32 && ODIN_ARCH != .wasm64p32 {
+		@(link_name="raylib_version") version: cstring
+	}
 	// Global gui state control functions
 	
 	GuiEnable           :: proc() ---                                                                         // Enable gui controls (global state)

+ 3 - 5
vendor/raylib/raylib.odin

@@ -81,7 +81,7 @@ Package vendor:raylib implements bindings for version 5.0 of the raylib library
 */
 package raylib
 
-import c "core:c/libc"
+import "core:c"
 import "core:fmt"
 import "core:mem"
 import "core:strings"
@@ -925,13 +925,11 @@ NPatchLayout :: enum c.int {
 	THREE_PATCH_HORIZONTAL,  // Npatch layout: 3x1 tiles
 }
 
-
-
 // Callbacks to hook some internal functions
 // WARNING: This callbacks are intended for advance users
 TraceLogCallback     :: #type proc "c" (logLevel: TraceLogLevel, text: cstring, args: c.va_list)        // Logging: Redirect trace log messages
-LoadFileDataCallback :: #type proc "c"(fileName: cstring, dataSize: ^c.int) -> [^]u8                  	// FileIO: Load binary data
-SaveFileDataCallback :: #type proc "c" (fileName: cstring, data: rawptr, dataSize: c.int) -> bool  		// FileIO: Save binary data
+LoadFileDataCallback :: #type proc "c"(fileName: cstring, dataSize: ^c.int) -> [^]u8                    // FileIO: Load binary data
+SaveFileDataCallback :: #type proc "c" (fileName: cstring, data: rawptr, dataSize: c.int) -> bool       // FileIO: Save binary data
 LoadFileTextCallback :: #type proc "c" (fileName: cstring) -> [^]u8                                     // FileIO: Load text data
 SaveFileTextCallback :: #type proc "c" (fileName: cstring, text: cstring) -> bool                       // FileIO: Save text data
 

+ 19 - 3
vendor/raylib/raymath.odin

@@ -1,6 +1,5 @@
 package raylib
 
-import c "core:c/libc"
 import "core:math"
 import "core:math/linalg"
 
@@ -45,7 +44,7 @@ Wrap :: proc "c" (value: f32, min, max: f32) -> f32 {
 // Check whether two given floats are almost equal
 @(require_results)
 FloatEquals :: proc "c" (x, y: f32) -> bool {
-	return abs(x - y) <= EPSILON*c.fmaxf(1.0, c.fmaxf(abs(x), abs(y)))
+	return abs(x - y) <= EPSILON*fmaxf(1.0, fmaxf(abs(x), abs(y)))
 }
 
 
@@ -815,4 +814,21 @@ QuaternionEquals :: proc "c" (p, q: Quaternion) -> bool {
 	       FloatEquals(p.y, q.y) &&
 	       FloatEquals(p.z, q.z) &&
 	       FloatEquals(p.w, q.w)
-}
+}
+
+@(private, require_results)
+fmaxf :: proc "contextless" (x, y: f32) -> f32 {
+	if math.is_nan(x) {
+		return y
+	}
+
+	if math.is_nan(y) {
+		return x
+	}
+
+	if math.signbit(x) != math.signbit(y) {
+		return y if math.signbit(x) else x
+	}
+
+	return y if x < y else x
+}

+ 2 - 2
vendor/stb/rect_pack/stb_rect_pack.odin

@@ -1,6 +1,6 @@
 package stb_rect_pack
 
-import c "core:c/libc"
+import "core:c"
 
 #assert(size_of(b32) == size_of(c.int))
 
@@ -111,4 +111,4 @@ foreign lib {
 	// heuristics will produce better/worse results for different data sets.
 	// If you call init again, this will be reset to the default.
 	setup_heuristic :: proc(ctx: ^Context, heuristic: Heuristic) ---
-}
+}