#[link(name = "glob", vers = "0.0.1", uuid = "9cb8312d-058c-482f-a0b0-27c48773c74b", url = "https://github.com/doy/rust-glob")]; #[crate_type = "lib"]; use core::libc::{c_char,c_int,c_void,size_t}; use core::path::Path; use core::unstable::finally::Finally; pub fn glob (pattern: &str) -> ~[Path] { let g = glob_t { gl_pathc: 0, gl_pathv: ptr::null(), gl_offs: 0, gl_closedir: ptr::null(), gl_readdir: ptr::null(), gl_opendir: ptr::null(), gl_lstat: ptr::null(), gl_stat: ptr::null(), }; do str::as_c_str(pattern) |c_pattern| { unsafe { c::glob(c_pattern, 0, ptr::null(), &g) } }; do(|| { let paths = unsafe { vec::raw::from_buf_raw(g.gl_pathv, g.gl_pathc as uint) }; do paths.map |&c_str| { Path(unsafe { str::raw::from_c_str(c_str) }) } }).finally { unsafe { c::globfree(&g) }; } } struct glob_t { gl_pathc: size_t, gl_pathv: **c_char, gl_offs: size_t, // these are nonstandard gl_closedir: *c_void, gl_readdir: *c_void, gl_opendir: *c_void, gl_lstat: *c_void, gl_stat: *c_void, } extern mod c { fn glob(pattern: *c_char, flags: c_int, errfunc: *c_void, pglob: *glob_t) -> c_int; fn globfree(pglob: *glob_t); } #[test] fn glob_test () { let paths = glob("*.rs"); assert!(paths.len() == 1); assert!(paths[0].exists()); assert!(paths[0].to_str() == ~"glob.rs"); } #[test] fn no_glob_test () { let paths = glob("*.nonexistent"); assert!(paths.len() == 0); }