summaryrefslogtreecommitdiff
path: root/src/matfile.c
blob: c629db0949dda91606db72599392e203ffc31c66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "matfile.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>

static const char *const default_description = "MATLAB 5.0 MAT-file, Created on: ";

bool write_header(FILE *file) {
    if (file == NULL) {
        return false;
    }

    mHeader_t header;
    memset((void *)&header, 0, sizeof(header));
    memset((void *)header.description, ' ', sizeof(header.description));

    time_t            t       = time(NULL);
    const char *const strtime = ctime(&t);

    snprintf(header.description, sizeof(header.description), "%s%s", default_description, strtime);

    header.version          = 0x0100;
    header.endian_indicator = (('M' << 8) | 'I');

    const size_t status = fwrite((const void *)&header, 1, sizeof(header), file);

    return (status == sizeof(header));
}

bool write_data(FILE *file, const mData_t data) {
    if (data.data == NULL) {
        return false;
    }

    bool success = true;
    success      = (fwrite((const void *)&data.tag, 1, sizeof(data.tag), file) == sizeof(data.tag)) && success;
    success      = (fwrite(data.data, 1, data.tag.size, file) == data.tag.size) && success;

    const size_t  padding           = data.tag.size % 8;
    const uint8_t padding_buffer[8] = {0};
    if (padding > 0 && success) {
        success = (fwrite((const void *)padding_buffer, 1, (8 - padding), file) == padding) && success;
    }

    return success;
}

bool write_small_data(FILE *file, const mSmallData_t data) {
    const size_t w = fwrite((const void *)&data, 1, sizeof(data), file);

    return (w == sizeof(data));
}