From 8ff70b6a4c8feeba9e9c00bb4d1a0af4b94d4bb1 Mon Sep 17 00:00:00 2001
From: roblabla <unfiltered@roblab.la>
Date: Thu, 2 Aug 2018 13:46:37 +0200
Subject: [PATCH] Add some switch-related libc typedefs

---
 src/lib.rs    |  6 ++++++
 src/switch.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 src/switch.rs

diff --git a/src/lib.rs b/src/lib.rs
index b6b5cdb1..7f8e907a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -104,6 +104,9 @@ mod dox;
 cfg_if! {
     if #[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))] {
         // empty ...
+    } else if #[cfg(target_os = "switch")] {
+        // On the Switch, we only define some useful universal types for
+        // convenience. Those can be found in the switch.rs file.
     } else {
 
         // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable
@@ -296,6 +299,9 @@ cfg_if! {
     } else if #[cfg(target_os = "fuchsia")] {
         mod fuchsia;
         pub use fuchsia::*;
+    } else if #[cfg(target_os = "switch")] {
+        mod switch;
+        pub use switch::*;
     } else if #[cfg(unix)] {
         mod unix;
         pub use unix::*;
diff --git a/src/switch.rs b/src/switch.rs
new file mode 100644
index 00000000..c1137954
--- /dev/null
+++ b/src/switch.rs
@@ -0,0 +1,48 @@
+//! Switch C type definitions
+
+// Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable
+// more optimization opportunities around it recognizing things like
+// malloc/free.
+#[repr(u8)]
+pub enum c_void {
+    // Two dummy variants so the #[repr] attribute can be used.
+    #[doc(hidden)]
+    __variant1,
+    #[doc(hidden)]
+    __variant2,
+}
+
+pub type int8_t = i8;
+pub type int16_t = i16;
+pub type int32_t = i32;
+pub type int64_t = i64;
+pub type uint8_t = u8;
+pub type uint16_t = u16;
+pub type uint32_t = u32;
+pub type uint64_t = u64;
+
+pub type c_schar = i8;
+pub type c_uchar = u8;
+pub type c_short = i16;
+pub type c_ushort = u16;
+pub type c_int = i32;
+pub type c_uint = u32;
+pub type c_float = f32;
+pub type c_double = f64;
+pub type c_longlong = i64;
+pub type c_ulonglong = u64;
+pub type intmax_t = i64;
+pub type uintmax_t = u64;
+
+pub type size_t = usize;
+pub type ptrdiff_t = isize;
+pub type intptr_t = isize;
+pub type uintptr_t = usize;
+pub type ssize_t = isize;
+
+// Arch specific
+pub type off_t = i64;
+pub type c_char = u8;
+pub type c_long = i64;
+pub type c_ulong = u64;
+pub type wchar_t = u32;
-- 
GitLab