diff -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./config/Makefile.in ./config/Makefile.in --- ./config/Makefile.in 2007-03-11 21:56:40.000000000 +0100 +++ ./config/Makefile.in 2007-03-24 19:57:04.000000000 +0100 @@ -148,6 +148,7 @@ $(CDK)/filepath.ml $(CDK)/string2.ml \ $(CDK)/filename2.ml $(CDK)/list2.ml $(CDK)/hashtbl2.ml \ $(CDK)/unix2.ml $(CDK)/file.ml \ + $(CDK)/ffind.ml \ $(CDK)/heap_c.c $(CDK)/array2.ml ifneq ("$(PTHREAD_CFLAGS)" , "") diff -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./src/daemon/driver/driverCommands.ml ./src/daemon/driver/driverCommands.ml --- ./src/daemon/driver/driverCommands.ml 2007-03-08 22:01:02.000000000 +0100 +++ ./src/daemon/driver/driverCommands.ml 2007-03-24 21:40:15.000000000 +0100 @@ -2369,6 +2369,22 @@ _s "" ), "debug command (example: disk .)"; + "debug_find_file", Arg_two (fun start_dir filename o -> + let buf = o.conn_buf in +lprintf_nl "debug1"; + (try + let f = + Ffind.find_list + Ffind.Failure + [start_dir] + [Ffind.Maxdepth 1; Ffind.Regexp (Str.regexp ("*" ^ filename ^ "*"));] + in + List.iter (fun f -> lprintf_nl "debug2 %s" f) f + with + | _ -> Printf.bprintf buf "file %s not found\n" filename); + _s "" + ), "debug command"; + "debug_fileinfo", Arg_one (fun arg o -> let buf = o.conn_buf in (try diff -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./src/utils/cdk/ffind.ml ./src/utils/cdk/ffind.ml --- ./src/utils/cdk/ffind.ml 1970-01-01 01:00:00.000000000 +0100 +++ ./src/utils/cdk/ffind.ml 2007-03-24 21:26:47.000000000 +0100 @@ -0,0 +1,189 @@ +(*********************************************************************************) +(* Cameleon *) +(* *) +(* Copyright (C) 2005,2006 Institut National de Recherche en Informatique *) +(* et en Automatique. All rights reserved. *) +(* *) +(* This program is free software; you can redistribute it and/or modify *) +(* it under the terms of the GNU Library General Public License as *) +(* published by the Free Software Foundation; either version 2 of the *) +(* License, or any later version. *) +(* *) +(* This program is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Library General Public License for more details. *) +(* *) +(* You should have received a copy of the GNU Library General Public *) +(* License along with this program; if not, write to the Free Software *) +(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *) +(* 02111-1307 USA *) +(* *) +(* Contact: Maxence.Guesdon@inria.fr *) +(* *) +(*********************************************************************************) + +(*c==m=[File.Find]=0.1=t==*) + + open Unix + +open Printf2 + + type filter = + Maxdepth of int + | Type of Unix.file_kind + | Follow + | Regexp of Str.regexp + | Atime of interval + | Predicate of (string -> bool) + and interval = + Le of int | Eq of int | Ge of int + + type mode = + | Ignore + | Stderr + | Failure + | Custom of (Unix.error * string * string -> unit) + + (* To memorize visited inodes *) + type inode = int * int + let inode st = st.st_dev, st.st_ino + + (* parameters driving the find *) + type status = + { maxdepth : int; + follow : bool; + filters : (string -> stats -> bool) list; + stat_function : string -> stats; + action : string -> unit; + handler : (error * string * string -> unit) + } + + exception Hide of exn + (* Used to hide user-level errors, so that they are no trap by the library *) + let hide_exn f x = try f x with exn -> raise (Hide exn) + let reveal_exn f x = try f x with Hide exn -> raise exn + + let stderr_handler (e, b, c) = + prerr_endline ("find: " ^ c ^": " ^ (error_message e)) + let ignore_handler _ = () + let failure_handler (e,b,c) = raise (Hide (Unix_error (e, b, c))) + let handler = function + Stderr -> stderr_handler + | Ignore -> ignore_handler + | Failure -> failure_handler + | Custom h -> hide_exn h + + (* handlers of errors during the call. *) + let treat_unix_error h f x = + try f x with Unix_error (e, b, c) -> h (e, b, c) + + let default_status = + { follow = false; + maxdepth = max_int; + filters = []; + stat_function = lstat; + action = prerr_endline; + handler = handler Stderr; + } + + let add_filter status f = { status with filters = f :: status.filters } + + let seconds_in_a_day = 86400. + exception Find of string + let rec parse_option status = function + | Maxdepth n -> + { status with maxdepth = n } + | Type k -> + add_filter status + (fun name stat -> stat.st_kind = k) + | Follow -> + { status with follow = true } + | Regexp exp -> + add_filter status + (fun name stat -> + Str.string_match exp name 0 && + Str.match_beginning () = 0 && + Str.match_end () = String.length name + ) + + | Atime n -> + let min, max = + match n with + | Eq d when d > 0 -> + float d *. seconds_in_a_day, float (d-1) *. seconds_in_a_day + | Le d when d > 0 -> + min_float, float (d-1) *. seconds_in_a_day + | Le d when d > 0 -> + min_float, float (d-1) *. seconds_in_a_day + | Ge d when d > 0 -> + float (d) *. seconds_in_a_day, max_float + | _ -> raise (Find "Ill_formed argument") + in + let now = time() in + add_filter status + (fun name stat -> + let time = now -. stat.st_atime in min <= time && time <= max) + | Predicate f -> + add_filter status (fun name stat -> f name) + + let parse_options options = + List.fold_left parse_option default_status options + + (* fonctions auxilaires *) + + let filter_all filename filestat filters = + List.for_all (fun f -> f filename filestat) filters + + let iter_dir f d = +lprintf_nl "ffind.debug iter_dir %s" d; + let dir_handle = opendir d in + try while true do f (readdir dir_handle) done with + End_of_file -> closedir dir_handle + | x -> closedir dir_handle; raise x + + (* fonction principale seconde version *) + let rec find_rec status visited depth filename = +lprintf_nl "ffind.debug find_rec %s %d" filename depth; + let find() = + let filestat = + if status.follow then stat filename else lstat filename in + let id = filestat.st_dev, filestat.st_ino in + if filter_all filename filestat status.filters then status.action filename; + if filestat.st_kind = S_DIR && depth < status.maxdepth && + (not status.follow || not (List.mem id visited)) + then + let process_child child = + if (child <> Filename.current_dir_name && + child <> Filename.parent_dir_name) then + let child_name = Filename.concat filename child in + let visited = if status.follow then id :: visited else visited in + find_rec status visited (depth+1) child_name + in + (* process_child is recursively protected from errors *) + iter_dir process_child filename + in + treat_unix_error status.handler find () + + let find_entry status filename = +lprintf_nl "ffind.debug find_entry"; + find_rec status [] 0 filename + + let find mode filenames options action = +lprintf_nl "ffind.debug find"; + let status = + { (parse_options options) with + handler = handler mode; + action = hide_exn action } + in + reveal_exn (List.iter (find_entry status)) filenames + + let find_list mode filenames options = +lprintf_nl "ffind.debug find_list"; + let l = ref [] in + find mode filenames options (fun s -> l := s :: !l); + List.rev !l + + + +(*/c==m=[File.Find]=0.1=t==*) diff -a -x Root -x Repository -x Tag -x Entries -x Entries.Log -x .svn -x '*.rej' -x '*.orig' -x '*.cmi' -x '*.cma' -x '*.cmo' -x '*.cmx' -x '*.cmxa' -x '*.a' -x '*.o' -x .depend -x Makefile -x mlnet -x ocamlpp.byte -N -r -u ./src/utils/cdk/ffind.mli ./src/utils/cdk/ffind.mli --- ./src/utils/cdk/ffind.mli 1970-01-01 01:00:00.000000000 +0100 +++ ./src/utils/cdk/ffind.mli 2007-03-24 18:36:12.000000000 +0100 @@ -0,0 +1,53 @@ +(*********************************************************************************) +(* Cameleon *) +(* *) +(* Copyright (C) 2005,2006 Institut National de Recherche en Informatique *) +(* et en Automatique. All rights reserved. *) +(* *) +(* This program is free software; you can redistribute it and/or modify *) +(* it under the terms of the GNU Library General Public License as *) +(* published by the Free Software Foundation; either version 2 of the *) +(* License, or any later version. *) +(* *) +(* This program is distributed in the hope that it will be useful, *) +(* but WITHOUT ANY WARRANTY; without even the implied warranty of *) +(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) +(* GNU Library General Public License for more details. *) +(* *) +(* You should have received a copy of the GNU Library General Public *) +(* License along with this program; if not, write to the Free Software *) +(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *) +(* 02111-1307 USA *) +(* *) +(* Contact: Maxence.Guesdon@inria.fr *) +(* *) +(*********************************************************************************) + +(*i==m=[File.Find]=0.1=t==*) +(** Finding files. +@author Didier Rémy +@version 0.1 +@cgname File.Find*) + + type filter = + Maxdepth of int + | Type of Unix.file_kind + | Follow + | Regexp of Str.regexp + | Atime of interval + | Predicate of (string -> bool) + and interval = + Le of int | Eq of int | Ge of int + type mode = + | Ignore + | Stderr + | Failure + | Custom of (Unix.error * string * string -> unit) + + val find : mode -> string list -> filter list -> + (string -> unit) -> unit + + val find_list : mode -> string list -> filter list -> string list + +(*/i==m=[File.Find]=0.1=t==*) +