mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-03 18:41:25 -08:00
Fixing event reader to use sizes read from log, not (wrong) assumptions about the layout of events.
Copied from Perforce Change: 179139 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
c4c3595fb8
commit
ee11a255db
1 changed files with 18 additions and 26 deletions
|
|
@ -239,46 +239,38 @@ EventString LabelText(EventProc proc, Word id)
|
|||
|
||||
Res EventRead(Event *eventReturn, EventProc proc)
|
||||
{
|
||||
size_t eventIndex, size;
|
||||
size_t eventIndex;
|
||||
Res res;
|
||||
EventCode code;
|
||||
EventAnyStruct anyStruct;
|
||||
Event event;
|
||||
void *restOfEvent;
|
||||
|
||||
res = proc->reader(proc->readerP, &code, sizeof(EventCode));
|
||||
|
||||
res = proc->reader(proc->readerP, &anyStruct, sizeof(anyStruct));
|
||||
if (res != ResOK)
|
||||
return res;
|
||||
|
||||
eventIndex = eventCode2Index(code, TRUE);
|
||||
size = eventTypes[eventIndex].size;
|
||||
eventIndex = eventCode2Index(anyStruct.code, TRUE);
|
||||
assert(anyStruct.code == EventInternCode ||
|
||||
anyStruct.size == eventTypes[eventIndex].size);
|
||||
|
||||
if (proc->cachedEvent != NULL) {
|
||||
event = proc->cachedEvent;
|
||||
proc->cachedEvent = NULL;
|
||||
} else {
|
||||
/* This is too long for most events, but never mind. */
|
||||
event = (Event)malloc(sizeof(EventUnion));
|
||||
if (event == NULL) return ResMEMORY;
|
||||
if (event == NULL)
|
||||
return ResMEMORY;
|
||||
}
|
||||
|
||||
event->any.code = code;
|
||||
restOfEvent = PointerAdd(event, sizeof(EventCode));
|
||||
if (code == EventInternCode) { /* the only string event */
|
||||
/* read enough to get the length */
|
||||
res = proc->reader(proc->readerP, restOfEvent,
|
||||
internStrOffset - sizeof(EventCode));
|
||||
if (res != ResOK)
|
||||
return res;
|
||||
/* read the rest */
|
||||
res = proc->reader(proc->readerP, &event->Intern.f1.str,
|
||||
/* Length must agree with EVENT_WS. */
|
||||
EventSizeAlign(internStrOffset + event->Intern.f1.len)
|
||||
- internStrOffset);
|
||||
if (res != ResOK) return res;
|
||||
} else {
|
||||
res = proc->reader(proc->readerP, restOfEvent,
|
||||
size - sizeof(EventCode));
|
||||
if (res != ResOK) return res;
|
||||
}
|
||||
event->any = anyStruct;
|
||||
restOfEvent = PointerAdd(event, sizeof(anyStruct));
|
||||
res = proc->reader(proc->readerP,
|
||||
PointerAdd(event, sizeof(anyStruct)),
|
||||
anyStruct.size - sizeof(anyStruct));
|
||||
if (res != ResOK)
|
||||
return res;
|
||||
|
||||
*eventReturn = event;
|
||||
return ResOK;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue