(* Copyright (c) 1999 INRIA *)
open Def
open Gwdb
let all = ref false
let statistics = ref false
let detail = ref 0
let ignore = ref []
let output = ref ""
let ignore_files = ref true
let ask_for_delete = ref 0
let cnt_for_delete = ref 0
let exact = ref false
let gwd_port = ref 2317
let server = ref "127.0.0.1"
let rec merge_families ifaml1f ifaml2f =
match (ifaml1f, ifaml2f) with
| ifam1 :: ifaml1, ifam2 :: ifaml2 ->
let m1 = List.memq ifam1 ifaml2 in
let m2 = List.memq ifam2 ifaml1 in
if m1 && m2 then merge_families ifaml1 ifaml2
else if m1 then ifam2 :: merge_families ifaml1f ifaml2
else if m2 then ifam1 :: merge_families ifaml1 ifaml2f
else if ifam1 == ifam2 then ifam1 :: merge_families ifaml1 ifaml2
else ifam1 :: ifam2 :: merge_families ifaml1 ifaml2
| ifaml1, [] -> ifaml1
| [], ifaml2 -> ifaml2
let rec filter f = function
| x :: l -> if f x then x :: filter f l else filter f l
| [] -> []
let connected_families base ifam cpl =
let rec loop ifaml ipl_scanned = function
| ip :: ipl ->
if List.memq ip ipl_scanned then loop ifaml ipl_scanned ipl
else
let u = poi base ip in
let ifaml1 = Array.to_list (get_family u) in
let ifaml = merge_families ifaml ifaml1 in
let ipl =
List.fold_right
(fun ifam ipl ->
let cpl = foi base ifam in
get_father cpl :: get_mother cpl :: ipl)
ifaml1 ipl
in
loop ifaml (ip :: ipl_scanned) ipl
| [] -> ifaml
in
loop [ ifam ] [] [ get_father cpl ]
let neighbourgs base ifam =
let fam = foi base ifam in
let ifaml = connected_families base ifam fam in
let ifaml =
match get_parents (poi base (get_father fam)) with
| Some ifam -> ifam :: ifaml
| None -> ifaml
in
let ifaml =
match get_parents (poi base (get_mother fam)) with
| Some ifam -> ifam :: ifaml
| None -> ifaml
in
List.fold_left
(fun ifaml ip ->
let u = poi base ip in
List.fold_left
(fun ifaml ifam -> ifam :: ifaml)
ifaml
(Array.to_list (get_family u)))
ifaml
(Array.to_list (get_children fam))
let utf8_designation base p =
let first_name = p_first_name base p in
let surname = p_surname base p in
let s = first_name ^ "." ^ string_of_int (get_occ p) ^ " " ^ surname in
if first_name = "?" || surname = "?" then
s ^ " (i=" ^ string_of_iper (get_iper p) ^ ")"
else s
let wiki_designation base basename p =
let first_name = p_first_name base p in
let surname = p_surname base p in
let s =
"[[" ^ first_name ^ "/" ^ surname ^ "/"
^ string_of_int (get_occ p)
^ "/" ^ first_name ^ "."
^ string_of_int (get_occ p)
^ " " ^ surname ^ "]]"
in
if first_name = "?" || surname = "?" then
let indx = string_of_iper (get_iper p) in
s ^ " (i=" ^ indx ^ ")
"
else s ^ "
"
let print_family base basename ifam =
let fam = foi base ifam in
let p = poi base (get_father fam) in
if !output <> "" then (
if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then
Printf.eprintf "i=%s" (string_of_iper (get_iper p))
else Printf.eprintf " - %s" (utf8_designation base p);
Printf.eprintf "\n";
Printf.eprintf " - %s\n"
(utf8_designation base (poi base (get_mother fam)));
flush stderr);
if sou base (get_first_name p) = "?" || sou base (get_surname p) = "?" then
let indx = string_of_iper (get_iper p) in
Printf.printf " - i=%s
" !server
!gwd_port basename indx indx
else Printf.printf " - %s" (wiki_designation base basename p);
Printf.printf "\n";
Printf.printf " - %s\n"
(wiki_designation base basename (poi base (get_mother fam)))
let kill_family base ip =
let u = { family = Array.of_list [] } in
patch_union base ip u
let kill_parents base ip =
let a = { parents = None; consang = Adef.fix (-1) } in
patch_ascend base ip a
let effective_del base (ifam, fam) =
kill_family base (get_father fam);
kill_family base (get_mother fam);
Array.iter (kill_parents base) (get_children fam);
Gwdb.delete_family base ifam
let move base basename =
load_ascends_array base;
load_unions_array base;
load_couples_array base;
load_descends_array base;
Printf.printf "