From 79a76e36d4a7e580d0d3520fe068102f2fe8b40a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 9 Apr 2013 01:09:02 -0500 Subject: initial implementation --- .gitignore | 2 ++ glob.rs | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 .gitignore create mode 100644 glob.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2228b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +libglob-* +glob diff --git a/glob.rs b/glob.rs new file mode 100644 index 0000000..3e249ab --- /dev/null +++ b/glob.rs @@ -0,0 +1,65 @@ +#[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); +} -- cgit v1.2.3