return OOP_CONTINUE;
}
+/*---------- logging etc. ----------*/
+
+void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,const char *fmt,...) {
+ va_list al;
+ va_start(al,fmt);
+ vlogmsg(ec,tran,segn,fmt,al);
+ va_end(al);
+}
+
+static char *transegn2suffixstring(TrainNum tran, SegmentNum segn) {
+ /* Either arg may be NOTA(...), in which case it's not included.
+ * Result string will be empty, or start with ": "
+ * Result string is from malloc.
+ * Never fails.
+ */
+ const char *tra, *seg;
+ char *s;
+ int r;
+
+ seg= ~segn ? info_segments[segn].pname : 0;
+ tra= ~tran ? info_trains[tran].pname : 0;
+
+ r= asprintf(&s, "%s%s%s%s%s",
+ seg||tra ? ":" : "",
+ seg ? " @" : "",
+ seg ? seg : "",
+ tra ? " " : "",
+ tra ? tra : "");
+ if (r<0) diee("vasprintf failed in transegn2suffixstring "
+ "tran=%lu segn=%lu", (unsigned long)tran, (unsigned long)segn);
+ return s;
+}
+
+void safety_vpanic(TrainNum tran, SegmentNum segn,const char *fmt,va_list al) {
+ char *msg, *where;
+
+ if (vasprintf(&msg,fmt,al) < 0)
+ diee("vasprintf failed in safety_vpanic fmt=\"%s\"", fmt);
+
+ where= transegn2suffixstring(tran,segn);
+ die("fatal safety problem: %s%s", msg, where);
+}
+
+void safety_panic(TrainNum tran, SegmentNum segn, const char *fmt, ...) {
+ va_list al;
+ va_start(al,fmt);
+ safety_panic(tran, segn, fmt, al);
+}
+
+ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt,...) {
+ va_list al;
+ va_start(al,fmt);
+ vlogmsg(EC_Safety, tran, segn, fmt, al);
+ va_end(al);
+ return EC_Safety;
+}
+
/*---------- command channel handling (oop_read, obc) ----------*/
static void command_doline(ParseState *ps, CommandInput *cmdi) {
#ifndef SAFETY_H
#define SAFETY_H
+#include <stdarg.h>
+
#include "../layout/layout-data.h"
#include "layoutinfo.h"
+#include "errorcodes.h"
/*========== more basic types etc. ==========*/
typedef short TimeInterval; /*ms*/
-typedef int ErrorCode;
/*---------- units and scales ----------*/
* handling, arg parsing, etc.
*/
-void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn, const char *fmt,...)
- __attribute__((format(printf,4,5)));
+void vlogmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,
+ const char *fmt, va_list al) __attribute__((format(printf,4,0)));
+void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,
+ const char *fmt, ...) __attribute__((format(printf,4,5)));
+void safety_vpanic(TrainNum tran, SegmentNum segn, const char *fmt, va_list al)
+ __attribute__((format(printf,3,0),noreturn));
void safety_panic(TrainNum tran, SegmentNum segn, const char *fmt,...)
__attribute__((format(printf,3,4),noreturn));
-ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt,...)
+ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt, ...)
__attribute__((format(printf,3,4)));
+ /* simple wrapper around vlogmsg; implies and returns EC_Safety */
/*========== safety.c ==========*/
/*