summaryrefslogtreecommitdiff
path: root/example/main.c
blob: ef7e0dd8b514ca9eaa82b9638da9897676eec56b (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//
// Copyright (c) 2026 Jacob McDonnell
//
// SPDX-License-Identifier: BSD-2-Clause
//
#include <assert.h>
#include <matfile.h>
#include <stdio.h>
#include <string.h>

int nums[2][4] = {
    {1, 2, 3, 4},
    {2, 4, 6, 8},
};

double doubles[5] = {3.14, 2.72, 3.7, 22. / 7., 7.7};

void write_int_array(FILE *fp);
void write_double_array(FILE *fp);

int main(void) {
    FILE *fp = fopen("test.mat", "w");
    if (fp == NULL) {
        perror("fopen");
        return -1;
    }

    // Write File Header
    assert(write_header(fp));
    write_int_array(fp);
    write_double_array(fp);

    fclose(fp);
    return 0;
}

void write_int_array(FILE *fp) {
    // Array Flags
    mArrayFlags_t flags;
    memset(&flags, 0, sizeof(flags));
    flags.global  = 0;
    flags.complex = 0;
    flags.logical = 0;
    flags.class   = mxINT32_CLASS;

    mData_t flags_data;
    flags_data.tag.type = miUINT32;
    flags_data.tag.size = 8;
    flags_data.data     = (void *)&flags;

    // Setup Array Dimensions
    int32_t dims[2] = {4, 2};
    mData_t dim_data;
    dim_data.data     = (void *)&dims;
    dim_data.tag.type = miINT32;
    dim_data.tag.size = 8;

    // Name
    mSmallData_t name;
    name.tag.type = miINT8;
    name.tag.size = 1;
    name.data     = 'A';

    mData_t data;
    data.tag.type = miINT32;
    data.tag.size = sizeof(nums);
    data.data     = (void *)nums;

    mTag_t array;
    array.type = miMATRIX;
    array.size = 80;

    fwrite((void *)&array, 1, sizeof(array), fp);
    write_data(fp, flags_data);
    write_data(fp, dim_data);
    write_small_data(fp, name);
    write_data(fp, data);
}

void write_double_array(FILE *fp) {
    // Array Flags
    mArrayFlags_t flags;
    memset(&flags, 0, sizeof(flags));
    flags.global  = 0;
    flags.complex = 0;
    flags.logical = 0;
    flags.class   = mxDOUBLE_CLASS;

    mData_t flags_data;
    flags_data.tag.type = miUINT32;
    flags_data.tag.size = 8;
    flags_data.data     = (void *)&flags;

    // Setup Array Dimensions
    int32_t dims[2] = {1, 5};
    mData_t dim_data;
    dim_data.data     = (void *)&dims;
    dim_data.tag.type = miINT32;
    dim_data.tag.size = 8;

    // Name
    mData_t name;
    name.tag.type = miINT8;
    name.tag.size = 7;
    name.data     = "doubles";

    mData_t data;
    data.tag.type = miDOUBLE;
    data.tag.size = sizeof(doubles);
    data.data     = (void *)doubles;

    mTag_t array;
    array.type = miMATRIX;
    array.size = 96;

    fwrite((void *)&array, 1, sizeof(array), fp);
    write_data(fp, flags_data);
    write_data(fp, dim_data);
    write_data(fp, name);
    write_data(fp, data);
}