+ st.ET.t <- ts; st.ET.w <- ws; st.ET.m <- true
+
+let add_tops v =
+ if EU.exists_role_deleted st.ET.s st.ET.r || st.ET.t <> []
+ then EU.raise_error ET.ETops else
+ let ds, ts = EU.get_tops v st.ET.r in
+ if ds <> [] then begin
+ let r = {ET.x = false; ET.v = st.ET.s; ET.o = ds; ET.n = []} in
+ st.ET.r <- EU.roles_union [false, r] st.ET.r
+ end;
+ if ts <> [] then st.ET.t <- ts;
+ if ds <> [] || ts <> [] then st.ET.m <- true
+
+let rec add_matching () =
+ match EU.match_names 0 0 st.ET.t st.ET.w with
+ | None -> ()
+ | Some (ti,wi) ->
+ select_entry [1;ti];
+ select_entry [2;wi];
+ add_role ();
+ add_matching ()
+
+let remove_roles () =
+ let rs, os, ns = EU.roles_split st.ET.s st.ET.r in
+ if os = [] && ns = [] then () else begin
+ st.ET.t <- EU.objs_union os st.ET.t;
+ st.ET.w <- EU.names_union ns st.ET.w;
+ st.ET.r <- rs; st.ET.m <- true
+ end