123456789101112131415161718192021222324252627282930313233343536373839404142434445464748(**************************************************************************)(* This file is part of the Codex semantics library. *)(* *)(* Copyright (C) 2013-2025 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file LICENSE). *)(* *)(**************************************************************************)moduleLog=Tracelog.Make(structletcategory="Emit_alarm"end)typehook={hook:'a.'aOperator.Alarm.t->Tracelog.locationlist->unit;}(*we use explicit types to avoid conflict with Stdlib.List when opening Emit_alarm*)letregister_alarm_hooks=ref[]letregister_alarm_hook=funf->register_alarm_hooks:=f::!register_alarm_hooksletrecrev_iteralarmloc=function|[]->()|hook::q->rev_iteralarmlocq;hook.hookalarmlocletemit_alarmalarm=Log.error(funp->p"Alarm: %s"(Operator.Alarm.showalarm));letloc_stack=Tracelog.current_location_stack()inrev_iteralarmloc_stack!register_alarm_hooksletreset_alarms()=register_alarm_hooks:=[]