summaryrefslogtreecommitdiff
path: root/src/matfile.c
diff options
context:
space:
mode:
authorJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-04 17:41:01 -0400
committerJacob McDonnell <jacob@jacobmcdonnell.com>2026-04-04 17:41:01 -0400
commit20e247e31fb40bf2228a2ed84b93896fc48b5eff (patch)
tree91f721c57a0565b66eae16562e1fbbf9a588d324 /src/matfile.c
parent0ead69cdfa8886775212a85fed3aa962fc22902a (diff)
feat: Producing a Readable MAT-File
Producing a readable MAT-File of a 1x5 Array of doubles. The file is somewhat manually generated, but currently works.
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