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
//! Allows for interaction with things you can read and write from.
//!
//! Usually files, but you can also point this at static memory and stuff in
//! some situations.
//!
//! Only a minimal amount of this module is currently bound. If you want more
//! added, PRs accepted.

use crate::{c_char, c_void};

/// SDL's read/write abstraction.
///
/// This is necessary for interaction with some of the other SDL systems, but
/// I'm dubious as to its general value compared to using `std::fs` most of the
/// time. So, currently, there's only bindings to allocate one from a file path
/// and to free it later.
#[repr(transparent)]
pub struct SDL_RWops(c_void);

extern "C" {
  /// Creates a [`SDL_RWops`] from a filename and mode string.
  ///
  /// * `file` supports unicode filenames if it's a utf8-encoded name given,
  ///   even if the local OS doesn't use utf8 encoding for filenames (it's
  ///   recoded for you).
  /// * The `mode` string works like with unix `fopen`, basically.
  /// * Both strings are null-terminated, of course.
  pub fn SDL_RWFromFile(
    file: *const c_char, mode: *const c_char,
  ) -> *mut SDL_RWops;

  /// Free an [`SDL_RWops`] after use.
  ///
  /// Some functions already have a flag that they will free an `SDL_RWops`
  /// given after they use it, so this isn't always necessary.
  pub fn SDL_FreeRW(area: *mut SDL_RWops);
}