aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code
diff options
context:
space:
mode:
Diffstat (limited to 'mps/code')
-rw-r--r--mps/code/eventpro.c44
1 files changed, 18 insertions, 26 deletions
diff --git a/mps/code/eventpro.c b/mps/code/eventpro.c
index f23fc189113..92996fbac28 100644
--- a/mps/code/eventpro.c
+++ b/mps/code/eventpro.c
@@ -239,46 +239,38 @@ EventString LabelText(EventProc proc, Word id)
239 239
240Res EventRead(Event *eventReturn, EventProc proc) 240Res EventRead(Event *eventReturn, EventProc proc)
241{ 241{
242 size_t eventIndex, size; 242 size_t eventIndex;
243 Res res; 243 Res res;
244 EventCode code; 244 EventAnyStruct anyStruct;
245 Event event; 245 Event event;
246 void *restOfEvent; 246 void *restOfEvent;
247 247
248 res = proc->reader(proc->readerP, &code, sizeof(EventCode)); 248 res = proc->reader(proc->readerP, &anyStruct, sizeof(anyStruct));
249 if (res != ResOK) 249 if (res != ResOK)
250 return res; 250 return res;
251 251
252 eventIndex = eventCode2Index(code, TRUE); 252 eventIndex = eventCode2Index(anyStruct.code, TRUE);
253 size = eventTypes[eventIndex].size; 253 assert(anyStruct.code == EventInternCode ||
254 anyStruct.size == eventTypes[eventIndex].size);
255
254 if (proc->cachedEvent != NULL) { 256 if (proc->cachedEvent != NULL) {
255 event = proc->cachedEvent; 257 event = proc->cachedEvent;
256 proc->cachedEvent = NULL; 258 proc->cachedEvent = NULL;
257 } else { 259 } else {
258 /* This is too long for most events, but never mind. */ 260 /* This is too long for most events, but never mind. */
259 event = (Event)malloc(sizeof(EventUnion)); 261 event = (Event)malloc(sizeof(EventUnion));
260 if (event == NULL) return ResMEMORY; 262 if (event == NULL)
263 return ResMEMORY;
261 } 264 }
262 265
263 event->any.code = code; 266 event->any = anyStruct;
264 restOfEvent = PointerAdd(event, sizeof(EventCode)); 267 restOfEvent = PointerAdd(event, sizeof(anyStruct));
265 if (code == EventInternCode) { /* the only string event */ 268 res = proc->reader(proc->readerP,
266 /* read enough to get the length */ 269 PointerAdd(event, sizeof(anyStruct)),
267 res = proc->reader(proc->readerP, restOfEvent, 270 anyStruct.size - sizeof(anyStruct));
268 internStrOffset - sizeof(EventCode)); 271 if (res != ResOK)
269 if (res != ResOK) 272 return res;
270 return res; 273
271 /* read the rest */
272 res = proc->reader(proc->readerP, &event->Intern.f1.str,
273 /* Length must agree with EVENT_WS. */
274 EventSizeAlign(internStrOffset + event->Intern.f1.len)
275 - internStrOffset);
276 if (res != ResOK) return res;
277 } else {
278 res = proc->reader(proc->readerP, restOfEvent,
279 size - sizeof(EventCode));
280 if (res != ResOK) return res;
281 }
282 *eventReturn = event; 274 *eventReturn = event;
283 return ResOK; 275 return ResOK;
284} 276}