#!/usr/bin/perl
-print "typedef enum {\n" or die $!;
-foreach $f (qw(
- OK
- Safety
- )) {
- $_= $f; s/\-//g;
- printf " EC_%s,\n", $_;
-}
-print "} ErrorCode;\n" or die $!;
+
+@f= qw(
+ OK
+ Safety
+ );
+
+
+
+$decl= "const char *const errorcodelist[]";
+
+print <<END
+typedef enum {
+END
+ ." ".(join ",\n ", map {
+ $f=$_; $f =~ s/\-//g; "EC_$f";
+ } @f).<<END
+
+} ErrorCode;
+
+extern $decl;
+#define DEFINE_ERRORCODELIST_DATA \\
+$decl= { \\
+END
+ ." ".(join ", \\\n ", map {
+ '"'.(lc).'"';
+ } @f).<<END
+ \\
+};
+END
+ or die $!;
/*---------- 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 ": "
char *s;
int r;
- seg= ~segn ? info_segments[segn].pname : 0;
- tra= ~tran ? info_trains[tran].pname : 0;
+ seg= SOMEP(segn) ? info_segments[segn].pname : 0;
+ tra= SOMEP(tran) ? info_trains[tran].pname : 0;
r= asprintf(&s, "%s%s%s%s%s",
seg||tra ? ":" : "",
return s;
}
+void vlogmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,
+ const char *fmt, va_list al) {
+ oprintf(UPO, "message %s ", ec ? errorcodelist[ec] : "info");
+ ovprintf(UPO,fmt,al);
+ if (SOMEP(segn) || SOMEP(tran)) oprintf(UPO, ":");
+ if (SOMEP(segn)) oprintf(UPO, " @%s", info_segments[segn].pname);
+ if (SOMEP(tran)) oprintf(UPO, " %s", info_trains[tran].pname);
+ oprintf(UPO, "\n");
+}
+
+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);
+}
+
void safety_vpanic(TrainNum tran, SegmentNum segn,const char *fmt,va_list al) {
char *msg, *where;
+ PicInsn piob;
+
+ enco_pic_off(&piob);
+ serial_transmit(&piob);
if (vasprintf(&msg,fmt,al) < 0)
diee("vasprintf failed in safety_vpanic fmt=\"%s\"", fmt);
}
oprintf(UPO, "\n");
}
-
-void die_hook() {
+
+void die_vprintf_hook(const char *fmt, va_list al) {
+ ovprintf(UPO, fmt, al);
+}
+
+void die_hook(void) {
int e;
e= obc_tryflush(UPO);
if (e) fprintf(stderr,"(unwritten command output: %s)\n",strerror(e));
oop_sys_run(sys_events);
abort();
}
+
+DEFINE_ERRORCODELIST_DATA
#include "common.h"
+static void vdie_vprintf(const char *fmt, va_list al) {
+ va_list al_copy;
+ va_copy(al_copy,al);
+ vfprintf(stderr,fmt,al_copy);
+ die_vprintf_hook(fmt,al);
+}
+
+static void vdie_printf(const char *fmt, ...) {
+ va_list al;
+ va_start(al,fmt);
+ vdie_vprintf(fmt,al);
+ va_end(al);
+}
+
void vdie(const char *fmt, int ev, va_list al) {
+ vdie_printf("%s: fatal: ", progname);
+ vdie_vprintf(fmt,al);
+ if (ev) vdie_printf(": %s",strerror(ev));
+ vdie_printf("\n");
die_hook();
- fprintf(stderr, "%s: fatal: ", progname);
- vfprintf(stderr,fmt,al);
- if (ev) fprintf(stderr,": %s",strerror(ev));
- fputc('\n',stderr);
exit(12);
}