let ct_items1 sc c st t =
[Warn sc; Context c; Warn st; Term (c, t)]
-let ct_items2 sc1 c1 st1 t1 sc2 c2 st2 t2 =
- ct_items1 sc1 c1 st1 t1 @ ct_items1 sc2 c2 st2 t2
-
-let ct_items3 sc c st1 t1 st2 t2 st3 t3 =
- ct_items1 sc c st1 t1 @ [Warn st2; Term (c, t2); Warn st3; Term (c, t3)]
+let ct_items2 sc1 c1 st1 t1 ?sc2 ?c2 st2 t2 =
+ let tl = match sc2, c2 with
+ | Some sc2, Some c2 -> ct_items1 sc2 c2 st2 t2
+ | None, None -> t_items1 st2 c1 t2
+ | _ -> assert false
+ in
+ ct_items1 sc1 c1 st1 t1 @ tl
+
+let ct_items3 sc1 c1 st1 t1 ?sc2 ?c2 st2 t2 ?sc3 ?c3 st3 t3 =
+ let tl = match sc3, c3 with
+ | Some sc3, Some c3 -> ct_items1 sc3 c3 st3 t3
+ | None, None -> t_items1 st3 c1 t3
+ | _ -> assert false
+ in
+ ct_items2 sc1 c1 st1 t1 ?sc2 ?c2 st2 t2 @ tl
let warn msg = F.fprintf std "@,%s" msg