Skip to content

Commit bc5289a

Browse files
committed
Read uncompressed MAT file in blocks
As reported by #65
1 parent 91ff267 commit bc5289a

File tree

1 file changed

+76
-52
lines changed

1 file changed

+76
-52
lines changed

src/read_data.c

+76-52
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,54 @@
4141
# include <zlib.h>
4242
#endif
4343

44+
#if !defined(READ_BLOCK_SIZE)
45+
#define READ_BLOCK_SIZE (256)
46+
#endif
47+
48+
#define Mat_uint8Swap(x) (*x)
49+
#define Mat_int8Swap(x) (*x)
50+
4451
#define READ_DATA(SwapFunc) \
4552
do { \
4653
if ( mat->byteswap ) { \
47-
for ( i = 0; i < len; i++ ) { \
48-
bytesread += fread(&v,data_size,1,(FILE*)mat->fp); \
49-
data[i] = SwapFunc(&v); \
54+
if ( len <= READ_BLOCK_SIZE ) { \
55+
bytesread += fread(v,data_size,len,(FILE*)mat->fp); \
56+
for (j = 0; j < len; j++) { \
57+
data[j] = SwapFunc(&v[j]); \
58+
} \
59+
} else { \
60+
for ( i = 0; i < len-READ_BLOCK_SIZE; i+=READ_BLOCK_SIZE ) { \
61+
bytesread += fread(v,data_size,READ_BLOCK_SIZE,(FILE*)mat->fp); \
62+
for (j = 0; j < READ_BLOCK_SIZE; j++) { \
63+
data[i+j] = SwapFunc(&v[j]); \
64+
} \
65+
} \
66+
if ( len > i ) { \
67+
bytesread += fread(v,data_size,len-i,(FILE*)mat->fp); \
68+
for (j = 0; j < len-i; j++) { \
69+
data[i+j] = SwapFunc(&v[j]); \
70+
} \
71+
}\
5072
} \
5173
} else { \
52-
for ( i = 0; i < len; i++ ) { \
53-
bytesread += fread(&v,data_size,1,(FILE*)mat->fp); \
54-
data[i] = v; \
74+
if ( len <= READ_BLOCK_SIZE ) { \
75+
bytesread += fread(v,data_size,len,(FILE*)mat->fp); \
76+
for (j = 0; j < len; j++) { \
77+
data[j] = v[j]; \
78+
} \
79+
} else { \
80+
for ( i = 0; i < len-READ_BLOCK_SIZE; i+=READ_BLOCK_SIZE ) { \
81+
bytesread += fread(v,data_size,READ_BLOCK_SIZE,(FILE*)mat->fp); \
82+
for (j = 0; j < READ_BLOCK_SIZE; j++) { \
83+
data[i+j] = v[j]; \
84+
} \
85+
} \
86+
if ( len > i ) { \
87+
bytesread += fread(v,data_size,len-i,(FILE*)mat->fp); \
88+
for (j = 0; j < len-i; j++) { \
89+
data[i+j] = v[j]; \
90+
} \
91+
}\
5592
} \
5693
} \
5794
} while (0)
@@ -60,7 +97,7 @@
6097
#define READ_DATA_INT64 \
6198
do { \
6299
if ( MAT_T_INT64 == data_type ) { \
63-
mat_int64_t v; \
100+
mat_int64_t v[READ_BLOCK_SIZE]; \
64101
READ_DATA(Mat_int64Swap); \
65102
} \
66103
} while (0)
@@ -72,7 +109,7 @@
72109
#define READ_DATA_UINT64 \
73110
do { \
74111
if ( MAT_T_UINT64 == data_type ) { \
75-
mat_uint64_t v; \
112+
mat_uint64_t v[READ_BLOCK_SIZE]; \
76113
READ_DATA(Mat_uint64Swap); \
77114
} \
78115
} while (0)
@@ -85,56 +122,50 @@
85122
switch ( data_type ) { \
86123
case MAT_T_DOUBLE: \
87124
{ \
88-
double v; \
125+
double v[READ_BLOCK_SIZE]; \
89126
READ_DATA(Mat_doubleSwap); \
90127
break; \
91128
} \
92129
case MAT_T_SINGLE: \
93130
{ \
94-
float v; \
131+
float v[READ_BLOCK_SIZE]; \
95132
READ_DATA(Mat_floatSwap); \
96133
break; \
97134
} \
98135
case MAT_T_INT32: \
99136
{ \
100-
mat_int32_t v; \
137+
mat_int32_t v[READ_BLOCK_SIZE]; \
101138
READ_DATA(Mat_int32Swap); \
102139
break; \
103140
} \
104141
case MAT_T_UINT32: \
105142
{ \
106-
mat_uint32_t v; \
143+
mat_uint32_t v[READ_BLOCK_SIZE]; \
107144
READ_DATA(Mat_uint32Swap); \
108145
break; \
109146
} \
110147
case MAT_T_INT16: \
111148
{ \
112-
mat_int16_t v; \
149+
mat_int16_t v[READ_BLOCK_SIZE]; \
113150
READ_DATA(Mat_int16Swap); \
114151
break; \
115152
} \
116153
case MAT_T_UINT16: \
117154
{ \
118-
mat_uint16_t v; \
155+
mat_uint16_t v[READ_BLOCK_SIZE]; \
119156
READ_DATA(Mat_uint16Swap); \
120157
break; \
121158
} \
122159
case MAT_T_INT8: \
123160
{ \
124-
mat_int8_t v; \
125-
for ( i = 0; i < len; i++ ) { \
126-
bytesread += fread(&v,data_size,1,(FILE*)mat->fp); \
127-
data[i] = v; \
128-
} \
161+
mat_int8_t v[READ_BLOCK_SIZE]; \
162+
READ_DATA(Mat_int8Swap); \
129163
break; \
130164
} \
131165
case MAT_T_UINT8: \
132166
{ \
133-
mat_uint8_t v; \
134-
for ( i = 0; i < len; i++ ) { \
135-
bytesread += fread(&v,data_size,1,(FILE*)mat->fp); \
136-
data[i] = v; \
137-
} \
167+
mat_uint8_t v[READ_BLOCK_SIZE]; \
168+
READ_DATA(Mat_uint8Swap); \
138169
break; \
139170
} \
140171
default: \
@@ -272,7 +303,7 @@
272303
int
273304
ReadDoubleData(mat_t *mat,double *data,enum matio_types data_type,int len)
274305
{
275-
int bytesread = 0, data_size, i;
306+
int bytesread = 0, data_size, i, j;
276307

277308
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
278309
return 0;
@@ -294,67 +325,60 @@ ReadDoubleData(mat_t *mat,double *data,enum matio_types data_type,int len)
294325
}
295326
case MAT_T_SINGLE:
296327
{
297-
float v;
328+
float v[READ_BLOCK_SIZE];
298329
READ_DATA(Mat_floatSwap);
299330
break;
300331
}
301332
#ifdef HAVE_MAT_INT64_T
302333
case MAT_T_INT64:
303334
{
304-
mat_int64_t v;
335+
mat_int64_t v[READ_BLOCK_SIZE];
305336
READ_DATA(Mat_int64Swap);
306337
break;
307338
}
308339
#endif
309340
#ifdef HAVE_MAT_UINT64_T
310341
case MAT_T_UINT64:
311342
{
312-
mat_uint64_t v;
343+
mat_uint64_t v[READ_BLOCK_SIZE];
313344
READ_DATA(Mat_uint64Swap);
314345
break;
315346
}
316347
#endif
317348
case MAT_T_INT32:
318349
{
319-
mat_int32_t v;
350+
mat_int32_t v[READ_BLOCK_SIZE];
320351
READ_DATA(Mat_int32Swap);
321352
break;
322353
}
323354
case MAT_T_UINT32:
324355
{
325-
mat_uint32_t v;
356+
mat_uint32_t v[READ_BLOCK_SIZE];
326357
READ_DATA(Mat_uint32Swap);
327358
break;
328359
}
329360
case MAT_T_INT16:
330361
{
331-
mat_int16_t v;
362+
mat_int16_t v[READ_BLOCK_SIZE];
332363
READ_DATA(Mat_int16Swap);
333364
break;
334365
}
335366
case MAT_T_UINT16:
336367
{
337-
mat_uint16_t v;
368+
mat_uint16_t v[READ_BLOCK_SIZE];
338369
READ_DATA(Mat_uint16Swap);
339370
break;
340371
}
341372
case MAT_T_INT8:
342373
{
343-
mat_int8_t v;
344-
for ( i = 0; i < len; i++ ) {
345-
bytesread += fread(&v,data_size,1,(FILE*)mat->fp);
346-
data[i] = v;
347-
}
374+
mat_int8_t v[READ_BLOCK_SIZE];
375+
READ_DATA(Mat_int8Swap);
348376
break;
349377
}
350378
case MAT_T_UINT8:
351379
{
352-
mat_uint8_t v;
353-
354-
for ( i = 0; i < len; i++ ) {
355-
bytesread += fread(&v,data_size,1,(FILE*)mat->fp);
356-
data[i] = v;
357-
}
380+
mat_uint8_t v[READ_BLOCK_SIZE];
381+
READ_DATA(Mat_uint8Swap);
358382
break;
359383
}
360384
default:
@@ -769,7 +793,7 @@ ReadCompressedDoubleData(mat_t *mat,z_streamp z,double *data,
769793
int
770794
ReadSingleData(mat_t *mat,float *data,enum matio_types data_type,int len)
771795
{
772-
int bytesread = 0, data_size, i;
796+
int bytesread = 0, data_size, i, j;
773797

774798
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
775799
return 0;
@@ -827,7 +851,7 @@ ReadCompressedSingleData(mat_t *mat,z_streamp z,float *data,
827851
int
828852
ReadInt64Data(mat_t *mat,mat_int64_t *data,enum matio_types data_type,int len)
829853
{
830-
int bytesread = 0, data_size, i;
854+
int bytesread = 0, data_size, i, j;
831855

832856
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
833857
return 0;
@@ -887,7 +911,7 @@ ReadCompressedInt64Data(mat_t *mat,z_streamp z,mat_int64_t *data,
887911
int
888912
ReadUInt64Data(mat_t *mat,mat_uint64_t *data,enum matio_types data_type,int len)
889913
{
890-
int bytesread = 0, data_size, i;
914+
int bytesread = 0, data_size, i, j;
891915

892916
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
893917
return 0;
@@ -947,7 +971,7 @@ ReadCompressedUInt64Data(mat_t *mat,z_streamp z,mat_uint64_t *data,
947971
int
948972
ReadInt32Data(mat_t *mat,mat_int32_t *data,enum matio_types data_type,int len)
949973
{
950-
int bytesread = 0, data_size, i;
974+
int bytesread = 0, data_size, i, j;
951975

952976
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
953977
return 0;
@@ -1005,7 +1029,7 @@ ReadCompressedInt32Data(mat_t *mat,z_streamp z,mat_int32_t *data,
10051029
int
10061030
ReadUInt32Data(mat_t *mat,mat_uint32_t *data,enum matio_types data_type,int len)
10071031
{
1008-
int bytesread = 0, data_size, i;
1032+
int bytesread = 0, data_size, i, j;
10091033

10101034
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
10111035
return 0;
@@ -1063,7 +1087,7 @@ ReadCompressedUInt32Data(mat_t *mat,z_streamp z,mat_uint32_t *data,
10631087
int
10641088
ReadInt16Data(mat_t *mat,mat_int16_t *data,enum matio_types data_type,int len)
10651089
{
1066-
int bytesread = 0, data_size, i;
1090+
int bytesread = 0, data_size, i, j;
10671091

10681092
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
10691093
return 0;
@@ -1121,7 +1145,7 @@ ReadCompressedInt16Data(mat_t *mat,z_streamp z,mat_int16_t *data,
11211145
int
11221146
ReadUInt16Data(mat_t *mat,mat_uint16_t *data,enum matio_types data_type,int len)
11231147
{
1124-
int bytesread = 0, data_size, i;
1148+
int bytesread = 0, data_size, i, j;
11251149

11261150
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
11271151
return 0;
@@ -1179,7 +1203,7 @@ ReadCompressedUInt16Data(mat_t *mat,z_streamp z,mat_uint16_t *data,
11791203
int
11801204
ReadInt8Data(mat_t *mat,mat_int8_t *data,enum matio_types data_type,int len)
11811205
{
1182-
int bytesread = 0, data_size, i;
1206+
int bytesread = 0, data_size, i, j;
11831207

11841208
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
11851209
return 0;
@@ -1237,7 +1261,7 @@ ReadCompressedInt8Data(mat_t *mat,z_streamp z,mat_int8_t *data,
12371261
int
12381262
ReadUInt8Data(mat_t *mat,mat_uint8_t *data,enum matio_types data_type,int len)
12391263
{
1240-
int bytesread = 0, data_size, i;
1264+
int bytesread = 0, data_size, i, j;
12411265

12421266
if ( (mat == NULL) || (data == NULL) || (mat->fp == NULL) )
12431267
return 0;

0 commit comments

Comments
 (0)