let file_type_of_file filename =
  let rec iter = function
      [] -> ft_unknown
    | (ft,command) :: q ->
        let args = Cam_commands.string_to_argv command in
        let len = Array.length args in
        if len < 1 then
          iter q
        else
          let rule_name = args.(0) in
          let params = Array.sub args 1 (len - 1) in
          try
            let r = Hashtbl.find rules rule_name in
            if r.rule_f params filename then ft else iter q
          with
            Not_found ->
              prerr_endline (Printf.sprintf "Unknown file type rule %s" rule_name);
              iter q
  in
  iter ft_rules#get