]> matita.cs.unibo.it Git - helm.git/commitdiff
added find
authorStefano Zacchiroli <zack@upsilon.cc>
Wed, 5 Oct 2005 16:09:18 +0000 (16:09 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Wed, 5 Oct 2005 16:09:18 +0000 (16:09 +0000)
helm/ocaml/extlib/hExtlib.ml
helm/ocaml/extlib/hExtlib.mli

index d3ae69402313132ce3457193296b60ca9b32e5d4..31cf86a75d4007d6a570fbee91418cd22330f8aa 100644 (file)
@@ -161,6 +161,34 @@ let output_file ~filename ~text =
   let oc = open_out filename in
   output_string oc text;
   close_out oc
+  
+let find ?(test = fun _ -> true) path = 
+  let rec aux acc todo = 
+    match todo with
+    | [] -> acc
+    | path :: tl ->
+        try
+          let handle = Unix.opendir path in
+          let dirs = ref [] in
+          let matching_files = ref [] in 
+          (try 
+            while true do 
+              match Unix.readdir handle with
+              | "." | ".." -> ()
+              | entry ->
+                  let qentry = path ^ "/" ^ entry in
+                  (try
+                    if is_dir qentry then
+                      dirs := qentry :: !dirs
+                    else if test qentry then
+                      matching_files := qentry :: !matching_files;
+                  with Unix.Unix_error _ -> ())
+            done
+          with End_of_file -> Unix.closedir handle);
+          aux (!matching_files @ acc) (!dirs @ tl)
+        with Unix.Unix_error _ -> aux acc tl
+  in
+  aux [] [path]
 
 (** {2 Exception handling} *)
 
index 2565f7861f12af7ac93f98f182eaa22b0fed9242..46ea0b9cebfb3f7ddbe3533935adf2b58911ddb0 100644 (file)
@@ -34,6 +34,9 @@ val is_dir: string -> bool  (** @return true if file is a directory *)
 val is_regular: string -> bool  (** @return true if file is a regular file *)
 val mkdir: string -> unit (** create dir and parents. @raise Failure *)
 
+  (** find all _files_ matching test under a filesystem root *)
+val find: ?test:(string -> bool) -> string -> string list 
+
 (** {2 File I/O} *)
 
 val input_file: string -> string  (** read all the contents of file to string *)