summaryrefslogtreecommitdiffstats
path: root/vendor/windows-sys/src/core
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:18:25 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:18:25 +0000
commit5363f350887b1e5b5dd21a86f88c8af9d7fea6da (patch)
tree35ca005eb6e0e9a1ba3bb5dbc033209ad445dc17 /vendor/windows-sys/src/core
parentAdding debian version 1.66.0+dfsg1-1. (diff)
downloadrustc-5363f350887b1e5b5dd21a86f88c8af9d7fea6da.tar.xz
rustc-5363f350887b1e5b5dd21a86f88c8af9d7fea6da.zip
Merging upstream version 1.67.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/windows-sys/src/core')
-rw-r--r--vendor/windows-sys/src/core/literals.rs115
-rw-r--r--vendor/windows-sys/src/core/mod.rs12
2 files changed, 124 insertions, 3 deletions
diff --git a/vendor/windows-sys/src/core/literals.rs b/vendor/windows-sys/src/core/literals.rs
new file mode 100644
index 000000000..a8b3a2f6f
--- /dev/null
+++ b/vendor/windows-sys/src/core/literals.rs
@@ -0,0 +1,115 @@
+/// A literal UTF-8 string with a trailing null terminator.
+#[macro_export]
+macro_rules! s {
+ ($s:literal) => {
+ ::core::concat!($s, '\0').as_ptr()
+ };
+}
+
+/// A literal UTF-16 wide string with a trailing null terminator.
+#[macro_export]
+macro_rules! w {
+ ($s:literal) => {{
+ const INPUT: &[u8] = $s.as_bytes();
+ const OUTPUT_LEN: usize = $crate::core::utf16_len(INPUT) + 1;
+ const OUTPUT: &[u16; OUTPUT_LEN] = {
+ let mut buffer = [0; OUTPUT_LEN];
+ let mut input_pos = 0;
+ let mut output_pos = 0;
+ while let Some((mut code_point, new_pos)) = $crate::core::decode_utf8_char(INPUT, input_pos) {
+ input_pos = new_pos;
+ if code_point <= 0xffff {
+ buffer[output_pos] = code_point as u16;
+ output_pos += 1;
+ } else {
+ code_point -= 0x10000;
+ buffer[output_pos] = 0xd800 + (code_point >> 10) as u16;
+ output_pos += 1;
+ buffer[output_pos] = 0xdc00 + (code_point & 0x3ff) as u16;
+ output_pos += 1;
+ }
+ }
+ &{ buffer }
+ };
+ OUTPUT.as_ptr()
+ }};
+}
+
+// Ensures that the macros are exported from the `windows::core` module.
+pub use s;
+pub use w;
+
+#[doc(hidden)]
+pub const fn decode_utf8_char(bytes: &[u8], mut pos: usize) -> Option<(u32, usize)> {
+ if bytes.len() == pos {
+ return None;
+ }
+ let ch = bytes[pos] as u32;
+ pos += 1;
+ if ch <= 0x7f {
+ return Some((ch, pos));
+ }
+ if (ch & 0xe0) == 0xc0 {
+ if bytes.len() - pos < 1 {
+ return None;
+ }
+ let ch2 = bytes[pos] as u32;
+ pos += 1;
+ if (ch2 & 0xc0) != 0x80 {
+ return None;
+ }
+ let result: u32 = ((ch & 0x1f) << 6) | (ch2 & 0x3f);
+ if result <= 0x7f {
+ return None;
+ }
+ return Some((result, pos));
+ }
+ if (ch & 0xf0) == 0xe0 {
+ if bytes.len() - pos < 2 {
+ return None;
+ }
+ let ch2 = bytes[pos] as u32;
+ pos += 1;
+ let ch3 = bytes[pos] as u32;
+ pos += 1;
+ if (ch2 & 0xc0) != 0x80 || (ch3 & 0xc0) != 0x80 {
+ return None;
+ }
+ let result = ((ch & 0x0f) << 12) | ((ch2 & 0x3f) << 6) | (ch3 & 0x3f);
+ if result <= 0x7ff || (0xd800 <= result && result <= 0xdfff) {
+ return None;
+ }
+ return Some((result, pos));
+ }
+ if (ch & 0xf8) == 0xf0 {
+ if bytes.len() - pos < 3 {
+ return None;
+ }
+ let ch2 = bytes[pos] as u32;
+ pos += 1;
+ let ch3 = bytes[pos] as u32;
+ pos += 1;
+ let ch4 = bytes[pos] as u32;
+ pos += 1;
+ if (ch2 & 0xc0) != 0x80 || (ch3 & 0xc0) != 0x80 || (ch4 & 0xc0) != 0x80 {
+ return None;
+ }
+ let result = ((ch & 0x07) << 18) | ((ch2 & 0x3f) << 12) | ((ch3 & 0x3f) << 6) | (ch4 & 0x3f);
+ if result <= 0xffff || 0x10ffff < result {
+ return None;
+ }
+ return Some((result, pos));
+ }
+ None
+}
+
+#[doc(hidden)]
+pub const fn utf16_len(bytes: &[u8]) -> usize {
+ let mut pos = 0;
+ let mut len = 0;
+ while let Some((code_point, new_pos)) = decode_utf8_char(bytes, pos) {
+ pos = new_pos;
+ len += if code_point <= 0xffff { 1 } else { 2 };
+ }
+ len
+}
diff --git a/vendor/windows-sys/src/core/mod.rs b/vendor/windows-sys/src/core/mod.rs
index 3c393147e..ec66a2bb6 100644
--- a/vendor/windows-sys/src/core/mod.rs
+++ b/vendor/windows-sys/src/core/mod.rs
@@ -1,3 +1,8 @@
+mod literals;
+
+#[doc(hidden)]
+pub use literals::*;
+
#[repr(C)]
pub struct GUID {
pub data1: u32,
@@ -13,10 +18,11 @@ impl ::core::clone::Clone for GUID {
}
pub type HRESULT = i32;
-pub type HSTRING = *mut core::ffi::c_void;
-pub type IUnknown = *mut core::ffi::c_void;
-pub type IInspectable = *mut core::ffi::c_void;
+pub type HSTRING = *mut ::core::ffi::c_void;
+pub type IUnknown = *mut ::core::ffi::c_void;
+pub type IInspectable = *mut ::core::ffi::c_void;
pub type PSTR = *mut u8;
pub type PWSTR = *mut u16;
pub type PCSTR = *const u8;
pub type PCWSTR = *const u16;
+pub type BSTR = *const u16;