--- /dev/null
+module ET = MrcTypes
+
+let read_substs substs ich =
+ let map subst =
+ let words = String.split_on_char ' ' subst in
+ List.filter ((<>) "") words
+ in
+ while true do
+ let line = input_line ich in
+ let subst = String.split_on_char ',' line in
+ substs := List.map map subst :: !substs
+ done
+
+let read_file file =
+ let ich = open_in file in
+ let line = input_line ich in
+ let scan r f d p o = r, f, d, p, o in
+ let rmod, rfun, dmod, para, optn =
+ Scanf.sscanf line "%s %s %S %b %b" scan
+ in
+ let substs = ref [] in
+ begin
+ try read_substs substs ich with
+ | End_of_file -> close_in ich
+ end;
+ {
+ ET.cmod = Filename.remove_extension file;
+ rmod; rfun; dmod; para; optn;
+ substs = !substs;
+ }
+
+let list_rev_filter_map filter map l =
+ let rec aux r = function
+ | [] -> r
+ | hd :: tl -> if filter hd then aux (map hd :: r) tl else aux r tl
+ in
+ aux [] l
+
+let read_dir file =
+ let filter name =
+ Filename.extension name = ".mrc"
+ in
+ let map name =
+ Filename.remove_extension name
+ in
+ let dir = Array.to_list (Sys.readdir file) in
+ let mods = List.fast_sort Pervasives.compare (list_rev_filter_map filter map dir) in
+ {
+ ET.cdir = file; mods;
+ }
+
+let rec read_mods mods ich =
+ let line = input_line ich in
+ let scan _ m =
+ mods := m :: !mods
+ in
+ Scanf.sscanf line "module %s = RecommGc%s" scan;
+ read_mods mods ich
+
+let read_index dir =
+ let file = Filename.concat dir "recommGc.ml" in
+ let mods = ref [] in
+ if Sys.file_exists file then begin
+ let ich = open_in file in
+ try read_mods mods ich with
+ | End_of_file -> close_in ich
+ end;
+ let mods = List.fast_sort Pervasives.compare !mods in
+ {
+ ET.cdir = dir; mods;
+ }