diff options
Diffstat (limited to 'mps/code')
| -rw-r--r-- | mps/code/eventpro.c | 44 |
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 | ||
| 240 | Res EventRead(Event *eventReturn, EventProc proc) | 240 | Res 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 | } |