rust/physfs-rs/src/physfs/mod.rs
author Wuzzy <Wuzzy2@mail.ru>
Thu, 03 Jan 2019 19:46:48 +0100
changeset 14514 5ac181cb2396
parent 14435 a1613788130d
permissions -rw-r--r--
Fix bee targeting fail across wrap world edge Previously, the bee always aimed for the light area, no matter where you actually put the target. It also got confused whenever it flew across the wrap world edge. How the bee works now: 1) The placed bee target is *not* recalculated when it was placed in the "gray" part of the wrap world edge. This allows for more fine-tuning. 1a) Place target in light area: bee aims for target light area 1b) Place target in gray area: bee aims for target, but flies to gray area first 2) Bee target is recalculated whenever bee passes the wrap world edge.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14435
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     1
use std::ffi::{ CString, CStr, OsStr };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     2
use std::io::Result;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     3
use std::sync::{ Mutex };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     4
use libc::{ c_int, c_char };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     5
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     6
/// Keep track of the number of global contexts.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     7
static mut NUM_CONTEXTS: usize = 0;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     8
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
     9
/// Utility
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    10
mod util;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    11
/// File operations
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    12
pub mod file;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    13
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    14
#[link(name = "physfs")]
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    15
extern {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    16
    // nonzero on success, zero on error.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    17
    fn PHYSFS_init(arg0: *const c_char) -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    18
    // nonzero if initialized, zero if not.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    19
    fn PHYSFS_isInit() -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    20
    // nonzero if success, zero if error.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    21
    fn PHYSFS_deinit() -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    22
    // string if success, NULL if error.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    23
    fn PHYSFS_getLastError() -> *const c_char;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    24
    // nonzero if success, zero if error
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    25
    fn PHYSFS_mount(new_dir: *const c_char, mount_point: *const c_char, append_to_path: c_int) -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    26
    // nonzero if success, zero if error.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    27
    fn PHYSFS_setWriteDir(write_dir: *const c_char) -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    28
    // nonzero on success, zero on error.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    29
    fn PHYSFS_mkdir(dir_name: *const c_char) -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    30
    // Checks if a given path exists; returns nonzero if true
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    31
    fn PHYSFS_exists(path: *const c_char) -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    32
    // Checks if a given path is a directory; returns nonzero if true
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    33
    fn PHYSFS_isDirectory(path: *const c_char) -> c_int;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    34
}
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    35
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    36
/// The access point for PhysFS function calls.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    37
pub struct PhysFSContext;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    38
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    39
unsafe impl Send for PhysFSContext {}
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    40
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    41
impl PhysFSContext {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    42
    /// Creates a new PhysFS context.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    43
    pub fn new() -> Result<Self> {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    44
        let con = PhysFSContext;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    45
        match PhysFSContext::init() {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    46
            Err(e) => Err(e),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    47
            _ => {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    48
                // Everything's gone right so far
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    49
                // now, increment the instance counter
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    50
                println!("Inc");
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    51
                unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    52
                    NUM_CONTEXTS += 1;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    53
                }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    54
                // and return the newly created context
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    55
                Ok(con)
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    56
            }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    57
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    58
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    59
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    60
    /// initializes the PhysFS library.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    61
    fn init() -> Result<()> {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    62
        // Initializing multiple times throws an error. So let's not!
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    63
        if PhysFSContext::is_init() { return Ok(()); }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    64
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    65
        let mut args = ::std::env::args();
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    66
        let default_arg0 = "".to_string();
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    67
        let arg0 = args.next().unwrap_or(default_arg0);
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    68
        let c_arg0 = try!(CString::new(arg0));
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    69
        let ret = unsafe { PHYSFS_init(c_arg0.as_ptr()) };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    70
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    71
        match ret {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    72
            0 => Err(util::physfs_error_as_io_error()),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    73
            _ => Ok(())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    74
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    75
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    76
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    77
    /// Checks if PhysFS is initialized
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    78
    pub fn is_init() -> bool {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    79
        unsafe { PHYSFS_isInit() != 0 }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    80
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    81
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    82
    /// De-initializes PhysFS. It is recommended to close
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    83
    /// all file handles manually before calling this.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    84
    fn de_init() {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    85
        // de_init'ing more than once can cause a double-free -- do not want.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    86
        if !PhysFSContext::is_init() { return }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    87
        unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    88
            PHYSFS_deinit();
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    89
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    90
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    91
    /// Adds an archive or directory to the search path.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    92
    /// mount_point is the location in the tree to mount it to.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    93
    pub fn mount<P>(&self, new_dir: P, mount_point: String, append_to_path: bool) -> Result<()>
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    94
        where P: AsRef<OsStr>
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    95
    {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    96
        let c_new_dir = CString::new(new_dir.as_ref().to_string_lossy().as_bytes()).unwrap();
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    97
        let c_mount_point = try!(CString::new(mount_point));
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    98
        match unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
    99
            PHYSFS_mount(
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   100
                c_new_dir.as_c_str().as_ptr(),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   101
                c_mount_point.as_ptr(),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   102
                append_to_path as c_int
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   103
            )
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   104
        } {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   105
            0 => Err(util::physfs_error_as_io_error()),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   106
            _ => Ok(())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   107
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   108
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   109
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   110
    /// Gets the last error message in a human-readable format
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   111
    /// This message may be localized, so do not expect it to
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   112
    /// match a specific string of characters.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   113
    pub fn get_last_error() -> String {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   114
        let ptr: *const c_char = unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   115
            PHYSFS_getLastError()
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   116
        };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   117
        if ptr.is_null() {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   118
            return "".to_string()
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   119
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   120
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   121
        let buf = unsafe { CStr::from_ptr(ptr).to_bytes().to_vec() };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   122
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   123
        String::from_utf8(buf).unwrap()
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   124
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   125
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   126
    /// Sets a new write directory.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   127
    /// This method will fail if the current write dir
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   128
    /// still has open files in it.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   129
    pub fn set_write_dir<P>(&self, write_dir: P) -> Result<()>
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   130
        where P: AsRef<OsStr>
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   131
    {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   132
        let write_dir = CStr::from_bytes_with_nul(write_dir.as_ref().to_str().unwrap().as_bytes()).unwrap();
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   133
        let ret = unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   134
            PHYSFS_setWriteDir(write_dir.as_ptr())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   135
        };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   136
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   137
        match ret {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   138
            0 => Err(util::physfs_error_as_io_error()),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   139
            _ => Ok(())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   140
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   141
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   142
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   143
    /// Creates a new dir relative to the write_dir.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   144
    pub fn mkdir(&self, dir_name: &str) -> Result<()> {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   145
        let c_dir_name = try!(CString::new(dir_name));
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   146
        let ret = unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   147
            PHYSFS_mkdir(c_dir_name.as_ptr())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   148
        };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   149
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   150
        match ret {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   151
            0 => Err(util::physfs_error_as_io_error()),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   152
            _ => Ok(())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   153
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   154
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   155
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   156
    /// Checks if given path exists
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   157
    pub fn exists(&self, path: &str) -> Result<()> {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   158
        let c_path = try!(CString::new(path));
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   159
        let ret = unsafe { PHYSFS_exists(c_path.as_ptr()) };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   160
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   161
        match ret {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   162
            0 => Err(util::physfs_error_as_io_error()),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   163
            _ => Ok(())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   164
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   165
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   166
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   167
    /// Checks if given path is a directory
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   168
    pub fn is_directory(&self, path: &str) -> Result<()> {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   169
        let c_path = try!(CString::new(path));
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   170
        let ret = unsafe { PHYSFS_isDirectory(c_path.as_ptr()) };
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   171
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   172
        match ret {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   173
            0 => Err(util::physfs_error_as_io_error()),
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   174
            _ => Ok(())
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   175
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   176
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   177
}
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   178
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   179
impl Drop for PhysFSContext {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   180
    fn drop(&mut self) {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   181
        // decrement NUM_CONTEXTS
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   182
        unsafe {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   183
            NUM_CONTEXTS -= 1;
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   184
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   185
        // and de_init if there aren't any contexts left.
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   186
        if unsafe { NUM_CONTEXTS == 0 } {
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   187
            PhysFSContext::de_init();
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   188
        }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   189
    }
a1613788130d Adopt physfs-rs lib and adapt it to recent std library, remove global mutex
unc0rr
parents:
diff changeset
   190
}