--- /dev/null
+(*
+ ||M|| This file is part of HELM, an Hypertextual, Electronic
+ ||A|| Library of Mathematics, developed at the Computer Science
+ ||T|| Department, University of Bologna, Italy.
+ ||I||
+ ||T|| HELM is free software; you can redistribute it and/or
+ ||A|| modify it under the terms of the GNU General Public License
+ \ / version 2 or (at your option) any later version.
+ \ / This software is distributed as is, NO WARRANTY.
+ V_______________________________________________________________ *)
+
+module EG = RolesGlobal
+module EI = RolesInput
+module EO = RolesOutput
+module EU = RolesUtils
+module ET = RolesTypes
+
+let st = EU.new_status
+
+let new_stage v =
+ if st.ET.w = [] then st.ET.s <- v
+ else EU.raise_error ET.ENews
+
+let toggle_entry = function
+ | [0] -> st.ET.r <- EU.list_toggle_all st.ET.r
+ | [0;m] -> st.ET.r <- EU.list_toggle m st.ET.r
+ | [0;m;1] ->
+ let r = EU.list_nth m st.ET.r in
+ r.ET.o <- EU.list_toggle_all r.ET.o
+ | [0;m;1;n] ->
+ let r = EU.list_nth m st.ET.r in
+ r.ET.o <- EU.list_toggle n r.ET.o
+ | [0;m;2] ->
+ let r = EU.list_nth m st.ET.r in
+ r.ET.n <- EU.list_toggle_all r.ET.n
+ | [0;m;2;n] ->
+ let r = EU.list_nth m st.ET.r in
+ r.ET.n <- EU.list_toggle n r.ET.n
+ | [1] -> st.ET.t <- EU.list_toggle_all st.ET.t
+ | [1;m] -> st.ET.t <- EU.list_toggle m st.ET.t
+ | [2] -> st.ET.w <- EU.list_toggle_all st.ET.w
+ | [2;m] -> st.ET.w <- EU.list_toggle m st.ET.w
+ | _ -> EU.raise_error ET.ENoEntry
+
+let read_waiting fname =
+ if st.ET.s = [] then EU.raise_error ET.ENoStage else
+ let ich = Scanf.Scanning.open_in fname in
+ let w = EI.read_names ich [] in
+ Scanf.Scanning.close_in ich;
+ let error n = ET.ENameClash n in
+ st.ET.w <- EU.list_union error EU.compare_names st.ET.w (List.rev w)
+
+let read_status () =
+ if st.ET.s <> [] then EU.raise_error (ET.EStage st.ET.s) else
+ let fname = Filename.concat !EG.wd "roles.osn" in
+ let ich = open_in fname in
+ let tmp = EI.read_status ich in
+ close_in ich;
+ st.ET.r <- tmp.ET.r;
+ st.ET.s <- tmp.ET.s;
+ st.ET.t <- tmp.ET.t;
+ st.ET.w <- tmp.ET.w
+
+let write_status () =
+ let fname = Filename.concat !EG.wd "roles.osn" in
+ let och = open_out fname in
+ EO.out_status och st;
+ close_out och