Skip to content

Commit

Permalink
Automatically sort windows_sys bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisDenton committed Dec 8, 2023
1 parent 68b8e94 commit ac30013
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 24 deletions.
2 changes: 0 additions & 2 deletions library/std/src/sys/windows/c/bindings.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
--out windows_sys.rs
--config flatten std
--filter
// tidy-alphabetical-start
!Windows.Win32.Foundation.INVALID_HANDLE_VALUE
Windows.Wdk.Storage.FileSystem.FILE_COMPLETE_IF_OPLOCKED
Windows.Wdk.Storage.FileSystem.FILE_CONTAINS_EXTENDED_CREATE_INFORMATION
Expand Down Expand Up @@ -2592,4 +2591,3 @@ Windows.Win32.System.Threading.WakeAllConditionVariable
Windows.Win32.System.Threading.WakeConditionVariable
Windows.Win32.System.WindowsProgramming.PROGRESS_CONTINUE
Windows.Win32.UI.Shell.GetUserProfileDirectoryW
// tidy-alphabetical-end
7 changes: 1 addition & 6 deletions library/std/src/sys/windows/c/windows_sys.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
// This file is autogenerated.
//
// To add bindings, edit windows_sys.lst then use `./x run generate-windows-sys` to
// regenerate the bindings.
//
// ignore-tidy-filelength
// Bindings generated by `windows-bindgen` 0.52.0

#![allow(non_snake_case, non_upper_case_globals, non_camel_case_types, dead_code, clippy::all)]
Expand Down Expand Up @@ -4351,3 +4345,4 @@ impl ::core::clone::Clone for XSAVE_FORMAT {
*self
}
}
// ignore-tidy-filelength
47 changes: 31 additions & 16 deletions src/tools/generate-windows-sys/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,34 +1,49 @@
use std::env;
use std::error::Error;
use std::fs;
use std::io::{self, Read, Seek, Write};
use std::io::{Read, Seek, SeekFrom, Write};
use std::path::PathBuf;

/// This is printed to the file before the rest of the contents.
const PRELUDE: &str = r#"// This file is autogenerated.
//
// To add bindings, edit windows_sys.lst then use `./x run generate-windows-sys` to
// regenerate the bindings.
//
// ignore-tidy-filelength
"#;

fn main() -> Result<(), Box<dyn Error>> {
let mut path: PathBuf =
env::args_os().nth(1).expect("a path to the rust repository is required").into();
path.push("library/std/src/sys/windows/c");
env::set_current_dir(&path)?;

let info = windows_bindgen::bindgen(["--etc", "windows_sys.lst"])?;
sort_bindings("bindings.txt")?;

let info = windows_bindgen::bindgen(["--etc", "bindings.txt"])?;
println!("{info}");

// add some gunk to the output file.
let mut f = fs::File::options().read(true).write(true).open("windows_sys.rs")?;
let mut f = std::fs::File::options().append(true).open("windows_sys.rs")?;
writeln!(&mut f, "// ignore-tidy-filelength")?;

Ok(())
}

fn sort_bindings(file_name: &str) -> Result<(), Box<dyn Error>> {
let mut f = fs::File::options().read(true).write(true).open(file_name)?;
let mut bindings = String::new();
f.read_to_string(&mut bindings)?;
f.seek(io::SeekFrom::Start(0))?;
f.write_all(PRELUDE.as_bytes())?;
f.write_all(bindings.as_bytes())?;
f.set_len(0)?;
f.seek(SeekFrom::Start(0))?;

let mut lines = bindings.split_inclusive('\n');
for line in &mut lines {
f.write(line.as_bytes())?;
if line.contains("--filter") {
break;
}
}
let mut bindings = Vec::new();
for line in &mut lines {
if !line.trim().is_empty() {
bindings.push(line);
}
}
bindings.sort_by(|a, b| a.to_lowercase().cmp(&b.to_lowercase()));
for line in bindings {
f.write(line.as_bytes())?;
}
Ok(())
}

0 comments on commit ac30013

Please sign in to comment.