Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #5
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, &timestamp)) return -1;
    fseeko (l->f, -20, SEEK_CUR);

    l->eventcount = event_num;

    return timestamp;

eof:
    return -1;
}