summaryrefslogtreecommitdiff
path: root/src/matfile.c
blob: 188e14ff9325b1b0849d160e31188a0a067ddabb (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 <string.h>
#include <time.h>
#include <stdlib.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, 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));
}