1use core::ffi::{c_char, c_int, c_void};
8use core::fmt;
9use core::mem::{align_of, size_of};
10
11#[repr(C)]
13pub struct FILE {
14 write: Option<unsafe extern "C" fn(*mut c_void, *const c_char, usize) -> c_int>,
15 ptr: *mut c_void,
16}
17
18const _: () = {
19 assert!(size_of::<FILE>() == 16);
20 assert!(align_of::<FILE>() == 8);
21};
22
23impl fmt::Write for FILE {
24 fn write_str(&mut self, s: &str) -> fmt::Result {
25 let Some(write) = self.write else {
26 return Err(fmt::Error);
27 };
28 if s.is_empty() {
29 return Ok(());
30 }
31 let c_chars = s.as_ptr().cast::<c_char>();
32 let ret = unsafe { write(self.ptr, c_chars, s.len()) };
37 if ret < 0 { Err(fmt::Error) } else { Ok(()) }
38 }
39}