Skip to content

Commit

Permalink
Switch to windows-bindgen
Browse files Browse the repository at this point in the history
  • Loading branch information
pitdicker committed Aug 29, 2023
1 parent 9ab0259 commit 30b6294
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 4 deletions.
6 changes: 5 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ name = "chrono"
default = ["clock", "std", "oldtime", "wasmbind"]
alloc = []
libc = []
winapi = ["windows-targets"]
std = []
clock = ["std", "winapi", "iana-time-zone", "android-tzdata"]
oldtime = ["time"]
Expand All @@ -44,7 +45,10 @@ js-sys = { version = "0.3", optional = true } # contains FFI bindings for


[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3.0", features = ["std", "minwinbase", "minwindef", "timezoneapi", "sysinfoapi"], optional = true }
windows-targets = { version = "0.48", optional = true }

[target.'cfg(windows)'.dev-dependencies]
windows-bindgen = { version = "0.51" }

[target.'cfg(unix)'.dependencies]
iana-time-zone = { version = "0.1.45", optional = true, features = ["fallback"] }
Expand Down
4 changes: 4 additions & 0 deletions src/offset/local/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ mod inner;
#[path = "windows.rs"]
mod inner;

#[cfg(all(windows, feature = "clock"))]
#[allow(unreachable_pub)]
mod win_bindings;

#[cfg(all(
not(unix),
not(windows),
Expand Down
51 changes: 51 additions & 0 deletions src/offset/local/win_bindings.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// Bindings generated by `windows-bindgen` 0.51.1

#![allow(non_snake_case, non_upper_case_globals, non_camel_case_types, dead_code, clippy::all)]
::windows_targets::link!("kernel32.dll" "system" fn SystemTimeToFileTime(lpsystemtime : *const SYSTEMTIME, lpfiletime : *mut FILETIME) -> BOOL);
::windows_targets::link!("kernel32.dll" "system" fn SystemTimeToTzSpecificLocalTime(lptimezoneinformation : *const TIME_ZONE_INFORMATION, lpuniversaltime : *const SYSTEMTIME, lplocaltime : *mut SYSTEMTIME) -> BOOL);
::windows_targets::link!("kernel32.dll" "system" fn TzSpecificLocalTimeToSystemTime(lptimezoneinformation : *const TIME_ZONE_INFORMATION, lplocaltime : *const SYSTEMTIME, lpuniversaltime : *mut SYSTEMTIME) -> BOOL);
pub type BOOL = i32;
#[repr(C)]
pub struct FILETIME {
pub dwLowDateTime: u32,
pub dwHighDateTime: u32,
}
impl ::core::marker::Copy for FILETIME {}
impl ::core::clone::Clone for FILETIME {
fn clone(&self) -> Self {
*self
}
}
#[repr(C)]
pub struct SYSTEMTIME {
pub wYear: u16,
pub wMonth: u16,
pub wDayOfWeek: u16,
pub wDay: u16,
pub wHour: u16,
pub wMinute: u16,
pub wSecond: u16,
pub wMilliseconds: u16,
}
impl ::core::marker::Copy for SYSTEMTIME {}
impl ::core::clone::Clone for SYSTEMTIME {
fn clone(&self) -> Self {
*self
}
}
#[repr(C)]
pub struct TIME_ZONE_INFORMATION {
pub Bias: i32,
pub StandardName: [u16; 32],
pub StandardDate: SYSTEMTIME,
pub StandardBias: i32,
pub DaylightName: [u16; 32],
pub DaylightDate: SYSTEMTIME,
pub DaylightBias: i32,
}
impl ::core::marker::Copy for TIME_ZONE_INFORMATION {}
impl ::core::clone::Clone for TIME_ZONE_INFORMATION {
fn clone(&self) -> Self {
*self
}
}
6 changes: 6 additions & 0 deletions src/offset/local/win_bindings.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
--out src/offset/local/win_bindings.rs
--config flatten sys
--filter
Windows.Win32.System.Time.SystemTimeToFileTime
Windows.Win32.System.Time.SystemTimeToTzSpecificLocalTime
Windows.Win32.System.Time.TzSpecificLocalTimeToSystemTime
5 changes: 2 additions & 3 deletions src/offset/local/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@ use std::io::Error;
use std::ptr;
use std::result::Result;

use winapi::shared::minwindef::FILETIME;
use winapi::um::minwinbase::SYSTEMTIME;
use winapi::um::timezoneapi::{
use super::win_bindings::{
SystemTimeToFileTime, SystemTimeToTzSpecificLocalTime, TzSpecificLocalTimeToSystemTime,
FILETIME, SYSTEMTIME,
};

use super::FixedOffset;
Expand Down
22 changes: 22 additions & 0 deletions tests/win_bindings.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#![cfg(all(windows, feature = "clock", feature = "std"))]

use std::fs;
use windows_bindgen::bindgen;

#[test]
fn gen_bindings() {
let input = "src/offset/local/win_bindings.txt";
let output = "src/offset/local/win_bindings.rs";
let existing = fs::read_to_string(output).unwrap();

let log = bindgen(["--etc", input]).unwrap();
eprintln!("{}", log);

// Check the output is the same as before.
// Depending on the git configuration the file may have been checked out with `\r\n` newlines or
// with `\n`. Compare line-by-line to ignore this difference.
let new = fs::read_to_string(output).unwrap();
if !new.lines().eq(existing.lines()) {
panic!("generated file `{}` is changed.", output);
}
}

0 comments on commit 30b6294

Please sign in to comment.