@@ -460,20 +460,10 @@ static int
460
460
Mat_H5ReadVarInfo (matvar_t * matvar , hid_t dset_id )
461
461
{
462
462
hid_t attr_id , type_id ;
463
- ssize_t name_len ;
464
463
int err = MATIO_E_NO_ERROR ;
465
464
char * class_str ;
466
465
467
- /* Get the HDF5 name of the variable */
468
- name_len = H5Iget_name (dset_id , NULL , 0 );
469
- if ( name_len > 0 ) {
470
- matvar -> internal -> hdf5_name = (char * )malloc (name_len + 1 );
471
- (void )H5Iget_name (dset_id , matvar -> internal -> hdf5_name , name_len + 1 );
472
- } else {
473
- /* Can not get an internal name, so leave the identifier open */
474
- matvar -> internal -> id = dset_id ;
475
- }
476
-
466
+ matvar -> internal -> id = dset_id ;
477
467
attr_id = H5Aopen_by_name (dset_id , "." , "MATLAB_class" , H5P_DEFAULT , H5P_DEFAULT );
478
468
type_id = H5Aget_type (attr_id );
479
469
class_str = (char * )calloc (H5Tget_size (type_id ) + 1 , 1 );
@@ -922,19 +912,17 @@ Mat_H5ReadGroupInfo(mat_t *mat, matvar_t *matvar, hid_t dset_id)
922
912
struct ReadGroupInfoIterData group_data = {0 , NULL };
923
913
924
914
/* First iteration to retrieve number of relevant links */
925
- herr = H5Literate_by_name (dset_id , matvar -> internal -> hdf5_name , H5_INDEX_NAME ,
926
- H5_ITER_NATIVE , NULL , Mat_H5ReadGroupInfoIterate ,
927
- (void * )& group_data , H5P_DEFAULT );
915
+ herr = H5Literate (dset_id , H5_INDEX_NAME , H5_ITER_NATIVE , NULL ,
916
+ Mat_H5ReadGroupInfoIterate , (void * )& group_data );
928
917
if ( herr > 0 && group_data .nfields > 0 ) {
929
918
matvar -> internal -> fieldnames = (char * * )calloc (
930
919
(size_t )(group_data .nfields ), sizeof (* matvar -> internal -> fieldnames ));
931
920
group_data .nfields = 0 ;
932
921
group_data .matvar = matvar ;
933
922
if ( matvar -> internal -> fieldnames != NULL ) {
934
923
/* Second iteration to fill fieldnames */
935
- H5Literate_by_name (dset_id , matvar -> internal -> hdf5_name , H5_INDEX_NAME ,
936
- H5_ITER_NATIVE , NULL , Mat_H5ReadGroupInfoIterate ,
937
- (void * )& group_data , H5P_DEFAULT );
924
+ H5Literate (dset_id , H5_INDEX_NAME , H5_ITER_NATIVE , NULL ,
925
+ Mat_H5ReadGroupInfoIterate , (void * )& group_data );
938
926
}
939
927
matvar -> internal -> num_fields = (unsigned )group_data .nfields ;
940
928
nfields = group_data .nfields ;
@@ -1085,19 +1073,18 @@ Mat_H5ReadGroupInfo(mat_t *mat, matvar_t *matvar, hid_t dset_id)
1085
1073
} else {
1086
1074
err = MATIO_E_OUT_OF_MEMORY ;
1087
1075
}
1076
+ H5Dclose (field_id );
1088
1077
} else {
1089
1078
fields [k ] = Mat_VarCalloc ();
1090
1079
fields [k ]-> name = strdup (matvar -> internal -> fieldnames [k ]);
1091
1080
err = Mat_H5ReadDatasetInfo (mat , fields [k ], field_id );
1092
1081
}
1093
- H5Dclose (field_id );
1094
1082
} else if ( object_info .type == H5O_TYPE_GROUP ) {
1095
1083
field_id = H5Gopen (dset_id , matvar -> internal -> fieldnames [k ], H5P_DEFAULT );
1096
1084
if ( -1 < field_id ) {
1097
1085
fields [k ] = Mat_VarCalloc ();
1098
1086
fields [k ]-> name = strdup (matvar -> internal -> fieldnames [k ]);
1099
1087
err = Mat_H5ReadGroupInfo (mat , fields [k ], field_id );
1100
- H5Gclose (field_id );
1101
1088
}
1102
1089
}
1103
1090
if ( err ) {
@@ -1225,8 +1212,10 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat)
1225
1212
int err = MATIO_E_NO_ERROR ;
1226
1213
size_t nelems = 1 ;
1227
1214
1228
- if ( NULL == matvar || NULL == matvar -> internal || matvar -> internal -> id < 0 )
1229
- return err ;
1215
+ if ( NULL == mat || NULL == matvar )
1216
+ return MATIO_E_BAD_ARGUMENT ;
1217
+ if ( matvar -> internal -> id < 0 )
1218
+ return MATIO_E_FAIL_TO_IDENTIFY ;
1230
1219
1231
1220
/* If the datatype with references is a cell, we've already read info into
1232
1221
* the variable data, so just loop over each cell element and call
@@ -1273,7 +1262,7 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat)
1273
1262
err |= Mul (& matvar -> nbytes , nelems , matvar -> data_size );
1274
1263
if ( err || matvar -> nbytes < 1 ) {
1275
1264
H5Dclose (matvar -> internal -> id );
1276
- matvar -> internal -> id = -1 ;
1265
+ matvar -> internal -> id = H5I_INVALID_HID ;
1277
1266
break ;
1278
1267
}
1279
1268
@@ -1286,8 +1275,6 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat)
1286
1275
err = Mat_H5ReadData (matvar -> internal -> id , data_type_id , H5S_ALL , H5S_ALL ,
1287
1276
matvar -> isComplex , matvar -> data );
1288
1277
}
1289
- H5Dclose (matvar -> internal -> id );
1290
- matvar -> internal -> id = -1 ;
1291
1278
break ;
1292
1279
}
1293
1280
case H5I_GROUP : {
@@ -1303,7 +1290,7 @@ Mat_H5ReadNextReferenceData(matvar_t *matvar, mat_t *mat)
1303
1290
fields = (matvar_t * * )matvar -> data ;
1304
1291
for ( i = 0 ; i < nelems ; i ++ ) {
1305
1292
if ( NULL != fields [i ] && 0 < fields [i ]-> internal -> hdf5_ref &&
1306
- -1 < fields [i ]-> internal -> id ) {
1293
+ fields [i ]-> internal -> id >= 0 ) {
1307
1294
/* Dataset of references */
1308
1295
err = Mat_H5ReadNextReferenceData (fields [i ], mat );
1309
1296
} else {
@@ -2679,8 +2666,8 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar)
2679
2666
2680
2667
if ( NULL == mat || NULL == matvar )
2681
2668
return MATIO_E_BAD_ARGUMENT ;
2682
- else if ( NULL == matvar -> internal -> hdf5_name && 0 > matvar -> internal -> id )
2683
- return MATIO_E_READ_VARIABLE_DOES_NOT_EXIST ;
2669
+ else if ( matvar -> internal -> id < 0 )
2670
+ return MATIO_E_FAIL_TO_IDENTIFY ;
2684
2671
2685
2672
fid = * (hid_t * )mat -> fp ;
2686
2673
@@ -2711,15 +2698,9 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar)
2711
2698
if ( nelems < 1 )
2712
2699
break ;
2713
2700
2714
- if ( NULL != matvar -> internal -> hdf5_name ) {
2715
- ref_id = H5Dopen (fid , matvar -> internal -> hdf5_name , H5P_DEFAULT );
2716
- if ( ref_id == H5I_INVALID_HID ) {
2717
- Mat_Critical ("Unexpected error from H5Dopen" );
2718
- }
2719
- } else {
2720
- ref_id = matvar -> internal -> id ;
2721
- H5Iinc_ref (ref_id );
2722
- }
2701
+ ref_id = matvar -> internal -> id ;
2702
+ H5Iinc_ref (ref_id );
2703
+
2723
2704
if ( 0 < matvar -> internal -> hdf5_ref ) {
2724
2705
dset_id = H5RDEREFERENCE (ref_id , H5R_OBJECT , & matvar -> internal -> hdf5_ref );
2725
2706
} else {
@@ -2754,15 +2735,9 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar)
2754
2735
return err ;
2755
2736
}
2756
2737
2757
- if ( NULL != matvar -> internal -> hdf5_name ) {
2758
- dset_id = H5Dopen (fid , matvar -> internal -> hdf5_name , H5P_DEFAULT );
2759
- if ( dset_id == H5I_INVALID_HID ) {
2760
- Mat_Critical ("Unexpected error from H5Dopen" );
2761
- }
2762
- } else {
2763
- dset_id = matvar -> internal -> id ;
2764
- H5Iinc_ref (dset_id );
2765
- }
2738
+ dset_id = matvar -> internal -> id ;
2739
+ H5Iinc_ref (dset_id );
2740
+
2766
2741
if ( matvar -> nbytes > 0 ) {
2767
2742
matvar -> data = malloc (matvar -> nbytes );
2768
2743
if ( NULL != matvar -> data ) {
@@ -2799,7 +2774,7 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar)
2799
2774
fields = (matvar_t * * )matvar -> data ;
2800
2775
for ( i = 0 ; i < nelems_x_nfields ; i ++ ) {
2801
2776
if ( NULL != fields [i ] && 0 < fields [i ]-> internal -> hdf5_ref &&
2802
- -1 < fields [i ]-> internal -> id ) {
2777
+ fields [i ]-> internal -> id >= 0 ) {
2803
2778
/* Dataset of references */
2804
2779
err = Mat_H5ReadNextReferenceData (fields [i ], mat );
2805
2780
} else {
@@ -2836,15 +2811,8 @@ Mat_VarRead73(mat_t *mat, matvar_t *matvar)
2836
2811
hid_t sparse_dset_id ;
2837
2812
mat_sparse_t * sparse_data = (mat_sparse_t * )calloc (1 , sizeof (* sparse_data ));
2838
2813
2839
- if ( NULL != matvar -> internal -> hdf5_name ) {
2840
- dset_id = H5Gopen (fid , matvar -> internal -> hdf5_name , H5P_DEFAULT );
2841
- if ( dset_id == H5I_INVALID_HID ) {
2842
- Mat_Critical ("Unexpected error from H5Dopen" );
2843
- }
2844
- } else {
2845
- dset_id = matvar -> internal -> id ;
2846
- H5Iinc_ref (dset_id );
2847
- }
2814
+ dset_id = matvar -> internal -> id ;
2815
+ H5Iinc_ref (dset_id );
2848
2816
2849
2817
if ( H5Lexists (dset_id , "ir" , H5P_DEFAULT ) ) {
2850
2818
size_t * dims ;
@@ -3010,7 +2978,7 @@ Mat_VarReadData73(mat_t *mat, matvar_t *matvar, void *data, int *start, int *str
3010
2978
if ( NULL == mat || NULL == matvar || NULL == data || NULL == start || NULL == stride ||
3011
2979
NULL == edge )
3012
2980
return MATIO_E_BAD_ARGUMENT ;
3013
- else if ( NULL == matvar -> internal -> hdf5_name && 0 > matvar -> internal -> id )
2981
+ else if ( matvar -> internal -> id < 0 )
3014
2982
return MATIO_E_FAIL_TO_IDENTIFY ;
3015
2983
3016
2984
fid = * (hid_t * )mat -> fp ;
@@ -3041,15 +3009,9 @@ Mat_VarReadData73(mat_t *mat, matvar_t *matvar, void *data, int *start, int *str
3041
3009
case MAT_C_UINT16 :
3042
3010
case MAT_C_INT8 :
3043
3011
case MAT_C_UINT8 :
3044
- if ( NULL != matvar -> internal -> hdf5_name ) {
3045
- ref_id = H5Dopen (fid , matvar -> internal -> hdf5_name , H5P_DEFAULT );
3046
- if ( ref_id == H5I_INVALID_HID ) {
3047
- Mat_Critical ("Unexpected error from H5Dopen" );
3048
- }
3049
- } else {
3050
- ref_id = matvar -> internal -> id ;
3051
- H5Iinc_ref (ref_id );
3052
- }
3012
+ ref_id = matvar -> internal -> id ;
3013
+ H5Iinc_ref (ref_id );
3014
+
3053
3015
if ( 0 < matvar -> internal -> hdf5_ref ) {
3054
3016
dset_id = H5RDEREFERENCE (ref_id , H5R_OBJECT , & matvar -> internal -> hdf5_ref );
3055
3017
} else {
@@ -3101,7 +3063,7 @@ Mat_VarReadDataLinear73(mat_t *mat, matvar_t *matvar, void *data, int start, int
3101
3063
3102
3064
if ( NULL == mat || NULL == matvar || NULL == data )
3103
3065
return MATIO_E_BAD_ARGUMENT ;
3104
- else if ( NULL == matvar -> internal -> hdf5_name && 0 > matvar -> internal -> id )
3066
+ else if ( matvar -> internal -> id < 0 )
3105
3067
return MATIO_E_FAIL_TO_IDENTIFY ;
3106
3068
3107
3069
fid = * (hid_t * )mat -> fp ;
@@ -3145,15 +3107,9 @@ Mat_VarReadDataLinear73(mat_t *mat, matvar_t *matvar, void *data, int start, int
3145
3107
}
3146
3108
free (dimp );
3147
3109
3148
- if ( NULL != matvar -> internal -> hdf5_name ) {
3149
- dset_id = H5Dopen (fid , matvar -> internal -> hdf5_name , H5P_DEFAULT );
3150
- if ( dset_id == H5I_INVALID_HID ) {
3151
- Mat_Critical ("Unexpected error from H5Dopen" );
3152
- }
3153
- } else {
3154
- dset_id = matvar -> internal -> id ;
3155
- H5Iinc_ref (dset_id );
3156
- }
3110
+ dset_id = matvar -> internal -> id ;
3111
+ H5Iinc_ref (dset_id );
3112
+
3157
3113
dset_space = H5Dget_space (dset_id );
3158
3114
H5Sselect_elements (dset_space , H5S_SELECT_SET , (size_t )dset_edge , points );
3159
3115
free (points );
@@ -3280,7 +3236,6 @@ Mat_VarReadNextInfoIterate(hid_t id, const char *name, const H5L_info_t *info, v
3280
3236
3281
3237
dset_id = H5Gopen (id , name , H5P_DEFAULT );
3282
3238
err = Mat_H5ReadGroupInfo (mat , matvar , dset_id );
3283
- H5Gclose (dset_id );
3284
3239
if ( err ) {
3285
3240
Mat_VarFree (matvar );
3286
3241
return -1 ;
0 commit comments