summaryrefslogtreecommitdiff
path: root/src/matfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/matfile.c')
-rw-r--r--src/matfile.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/matfile.c b/src/matfile.c
new file mode 100644
index 0000000..188e14f
--- /dev/null
+++ b/src/matfile.c
@@ -0,0 +1,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));
+} \ No newline at end of file