1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#![cfg_attr(not(any(target_os = "macos", target_os = "ios")), no_std)]
#![warn(missing_docs)]
#![allow(unused_imports)]
pub use fermium;
pub(crate) use fermium::{c_char, c_void};
extern crate alloc;
use alloc::{borrow::Cow, format, string::String, sync::Arc, vec, vec::Vec};
use core::{
convert::TryFrom,
marker::PhantomData,
mem::ManuallyDrop,
ptr::null_mut,
sync::atomic::{AtomicBool, Ordering},
};
macro_rules! cow_str {
($l:literal) => {
alloc::borrow::Cow::Borrowed($l)
};
($i:ident) => {
alloc::borrow::Cow::Borrowed($i)
};
($($tokens:tt)*) => {
alloc::borrow::Cow::Owned(format!($($tokens)*))
};
}
mod initialization;
pub use initialization::InitFlags;
pub(crate) use initialization::*;
mod sdl;
pub use sdl::*;
mod window;
pub use window::*;
mod event;
pub use event::*;
mod audio;
pub use audio::*;
mod controller;
pub use controller::*;
pub type CowStr = Cow<'static, str>;
trait StrExt {
fn alloc_c_str(&self) -> Vec<c_char>;
}
impl StrExt for str {
fn alloc_c_str(&self) -> Vec<c_char> {
self
.bytes()
.map(|c| c as c_char)
.take_while(|&c| c != 0)
.chain(Some(0))
.collect()
}
}
pub unsafe fn get_error_unchecked() -> String {
let mut v = Vec::with_capacity(1024);
let mut err_p = fermium::SDL_GetError();
while *err_p != 0 {
v.push(*err_p as u8);
err_p = err_p.offset(1);
}
String::from_utf8_lossy(&v).into_owned()
}