Res EventWrite(Event event, mps_lib_FILE *stream) { Res res; if (event == NULL) return ResFAIL; if (stream == NULL) return ResFAIL; res = EVENT_CLOCK_WRITE(stream, event->any.clock); if (res != ResOK) return res; switch (event->any.code) { #define EVENT_WRITE_PARAM(name, index, sort, ident) \ EVENT_WRITE_PARAM_##sort(name, index, sort, ident) #define EVENT_WRITE(X, name, code, always, kind) \ case code: \ res = WriteF(stream, " $S", #name, \ EVENT_##name##_PARAMS(EVENT_WRITE_PARAM, name) \ NULL); \ if (res != ResOK) return res; \ break; EVENT_LIST(EVENT_WRITE, X) default: res = WriteF(stream, " <unknown code $U>", event->any.code, NULL); if (res != ResOK) return res; /* TODO: Hexdump unknown event contents. */ break; } return ResOK; }
Res EventDescribe(Event event, mps_lib_FILE *stream, Count depth) { Res res; /* TODO: Some sort of EventCheck would be good */ if (event == NULL) return ResFAIL; if (stream == NULL) return ResFAIL; res = WriteF(stream, depth, "Event $P {\n", (WriteFP)event, " code $U\n", (WriteFU)event->any.code, " clock ", NULL); if (res != ResOK) return res; res = EVENT_CLOCK_WRITE(stream, depth, event->any.clock); if (res != ResOK) return res; res = WriteF(stream, depth, "\n size $U\n", (WriteFU)event->any.size, NULL); if (res != ResOK) return res; switch (event->any.code) { #define EVENT_DESC_PARAM(name, index, sort, ident) \ "\n $S", (WriteFS)#ident, \ EVENT_WRITE_PARAM_##sort(name, index, sort, ident) #define EVENT_DESC(X, name, _code, always, kind) \ case _code: \ res = WriteF(stream, depth, \ " event \"$S\"", (WriteFS)#name, \ EVENT_##name##_PARAMS(EVENT_DESC_PARAM, name) \ NULL); \ if (res != ResOK) \ return res; \ break; EVENT_LIST(EVENT_DESC, X) default: res = WriteF(stream, depth, " event type unknown", NULL); if (res != ResOK) return res; /* TODO: Hexdump unknown event contents. */ break; } res = WriteF(stream, depth, "\n} Event $P\n", (WriteFP)event, NULL); return res; }