lcm_eventlog_event_t *lcm_eventlog_read_next_event(lcm_eventlog_t *l) { lcm_eventlog_event_t *le = (lcm_eventlog_event_t*) calloc(1, sizeof(lcm_eventlog_event_t)); int32_t magic = 0; int r; do { r = fgetc(l->f); if (r < 0) goto eof; magic = (magic << 8) | r; } while( magic != MAGIC ); if (0 != fread64(l->f, &le->eventnum) || 0 != fread64(l->f, &le->timestamp) || 0 != fread32(l->f, &le->channellen) || 0 != fread32(l->f, &le->datalen)) { return NULL; } // Sanity check the channel length and data length if (le->channellen < 0 || le->channellen >= 1000) { fprintf(stderr, "Log event has invalid channel length: %d\n", le->channellen); return NULL; } if (le->datalen < 0) { fprintf(stderr, "Log event has invalid data length: %d\n", le->datalen); return NULL; } le->channel = (char *) calloc(1, le->channellen+1); if (fread(le->channel, 1, le->channellen, l->f) != (size_t) le->channellen) goto eof; le->data = calloc(1, le->datalen+1); if (fread(le->data, 1, le->datalen, l->f) != (size_t) le->datalen) goto eof; // Check that there's a valid event or the EOF after this event. int32_t next_magic; if (0 == fread32(l->f, &next_magic)) { if (next_magic != MAGIC) { fprintf(stderr, "Invalid header after log data\n"); return NULL; } fseeko (l->f, -4, SEEK_CUR); } return le; eof: free(le->channel); free(le->data); free(le); return NULL; }
lcm_eventlog_event_t *lcm_eventlog_read_next_event(lcm_eventlog_t *l) { lcm_eventlog_event_t *le = (lcm_eventlog_event_t*) calloc(1, sizeof(lcm_eventlog_event_t)); int32_t magic = 0; int r; do { r = fgetc(l->f); if (r < 0) goto eof; magic = (magic << 8) | r; } while( magic != MAGIC ); fread64(l->f, &le->eventnum); fread64(l->f, &le->timestamp); fread32(l->f, &le->channellen); fread32(l->f, &le->datalen); assert (le->channellen < 1000); if (l->eventcount != le->eventnum) { // these warnings will spew unnecessarily for log files that have been // filtered through lcm-logplayer-gui since it preserves event numbers // printf ("Mismatch: eventcount %"PRId64" eventnum %"PRId64"\n", // l->eventcount, le->eventnum); // printf ("file offset %"PRId64"\n", ftello (l->f)); l->eventcount = le->eventnum; } le->channel = (char *) calloc(1, le->channellen+1); if (fread(le->channel, 1, le->channellen, l->f) != (size_t) le->channellen) goto eof; le->data = calloc(1, le->datalen+1); if (fread(le->data, 1, le->datalen, l->f) != (size_t) le->datalen) goto eof; l->eventcount++; return le; eof: return NULL; }
eventlog_event_t *eventlog_read_next_event(eventlog_t *l) { eventlog_event_t *le = (eventlog_event_t*) calloc(1, sizeof(eventlog_event_t)); int32_t magic = 0; int r; do { r = fgetc(l->f); if (r < 0) goto eof; magic = (magic << 8) | r; } while( magic != MAGIC ); fread64(l->f, &le->eventnum); fread64(l->f, &le->timestamp); fread32(l->f, &le->channellen); fread32(l->f, &le->datalen); assert (le->channellen < 1000); assert (le->datalen < 65536); if (l->eventcount != le->eventnum) { printf ("Mismatch: eventcount %"PRId64" eventnum %"PRId64"\n", l->eventcount, le->eventnum); printf ("file offset %"PRId64"\n", ftello (l->f)); l->eventcount = le->eventnum; } le->channel = calloc(1, le->channellen+1); if (fread(le->channel, 1, le->channellen, l->f) != (size_t) le->channellen) goto eof; le->data = calloc(1, le->datalen+1); if (fread(le->data, 1, le->datalen, l->f) != (size_t) le->datalen) goto eof; l->eventcount++; return le; eof: return NULL; }
int fread_header(Header *header, FILE *file) { int i = 0; unsigned int *namesize = malloc(sizeof(unsigned int)); unsigned short *treesize = malloc(sizeof(unsigned short)); unsigned long long *originalsize = malloc(sizeof(unsigned long long)); unsigned long long *filesize = malloc(sizeof(unsigned long long)); uint32_t *crc = malloc(sizeof(uint32_t)); char *filename; char *tree; if(fread32(namesize, file)) { return 1; } header->namesize = *namesize; filename = malloc(sizeof(char) * *namesize); fread(filename, sizeof(char), header->namesize, file); header->filename = filename; if(fread16(treesize, file)) { return 1; } header->treesize = *treesize; tree = malloc(sizeof(char) * *treesize); fread(tree, sizeof(char), header->treesize, file); header->tree = tree; if(fread32(crc, file)) { return 1; } header->crc = *crc; if(fread64(originalsize, file)) { return 1; } header->originalsize = *originalsize; if(fread64(filesize, file)) { return 1; } header->filesize = *filesize; return 0; }
static int64_t get_event_time(lcm_eventlog_t *l) { int32_t magic = 0; int r; do { r = fgetc(l->f); if (r < 0) goto eof; magic = (magic << 8) | r; } while( magic != MAGIC ); int64_t event_num; int64_t timestamp; if (0 != fread64(l->f, &event_num)) return -1; if (0 != fread64(l->f, ×tamp)) return -1; fseeko (l->f, -20, SEEK_CUR); l->eventcount = event_num; return timestamp; eof: return -1; }