summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--glob.rs65
2 files changed, 67 insertions, 0 deletions
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);
+}