* Bug #13298 fixed - Static analysis bugs detected by PVS-Studio fixed
[scilab.git] / scilab / modules / hdf5 / src / c / h5_readDataFromFile_v1.c
index 804c1d8..5d8ce5a 100644 (file)
@@ -6,11 +6,11 @@
 *  This source file is licensed as described in the file COPYING, which
 *  you should have received as part of this distribution.  The terms
 *  are also available at
-*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*  http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 *
 */
 
-#define H5_USE_16_API
+#define H5_NO_DEPRECATED_SYMBOLS
 
 #ifndef _MSC_VER
 #include <sys/time.h>
 #include <string.h>
 #include <hdf5.h>
 #include <stdlib.h>
-#include "MALLOC.h"
+#include "sci_malloc.h"
 #include "sci_types.h"
 #include "h5_attributeConstants.h"
 #include "h5_readDataFromFile_v1.h"
 
 //#define TIME_DEBUG
 
-static herr_t find_attr_by_name_v1(hid_t loc_id, const char *name, void *data)
+static herr_t find_attr_by_name_v1(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *data)
 {
     return !strcmp(name, (const char *)data);
 }
@@ -40,33 +40,35 @@ Operator function.  Prints the name and type of the object
 being examined.
 
 ************************************************************/
-static herr_t op_func_v1(hid_t loc_id, const char *name, void *operator_data)
+static herr_t op_func_v1(hid_t loc_id, const char *name, const H5L_info_t *info, void *operator_data)
 {
-    H5G_stat_t statbuf;
+    H5O_info_t oinfo;
     herr_t status = 0;
     int *pDataSetId = (int*)operator_data;
+    hid_t obj = H5Oopen(loc_id, name, H5P_DEFAULT);
+    if (obj < 0)
+    {
+        return -1;
+    }
 
     /*
-    * Get type of the object and return only datasetId
-    * through operator_data.
-    */
-    status = H5Gget_objinfo(loc_id, name, 0, &statbuf);
+     * Get type of the object and return only datasetId
+     * through operator_data.
+     */
+    status = H5Oget_info(obj, &oinfo);
     if (status < 0)
     {
+        H5Oclose(obj);
         return -1;
     }
 
-    switch (statbuf.type)
+    if (oinfo.type == H5O_TYPE_DATASET)
+    {
+        *pDataSetId = obj;
+    }
+    else
     {
-    case H5G_GROUP:
-        break;
-    case H5G_DATASET:
-        *pDataSetId = H5Dopen(loc_id, name);
-        break;
-    case H5G_TYPE:
-        break;
-    default:
-        break;
+        H5Oclose(obj);
     }
 
     return 0;
@@ -76,11 +78,12 @@ static int readIntAttribute_v1(int _iDatasetId, const char *_pstName)
 {
     hid_t iAttributeId;
     herr_t status;
+    hsize_t n = 0;
     int iVal = -1;
 
-    if (H5Aiterate(_iDatasetId, NULL, find_attr_by_name_v1, (void *)_pstName))
+    if (H5Aiterate(_iDatasetId, H5_INDEX_NAME, H5_ITER_NATIVE, &n, find_attr_by_name_v1, (void *)_pstName) > 0)
     {
-        iAttributeId = H5Aopen_name(_iDatasetId, _pstName);
+        iAttributeId = H5Aopen_by_name(_iDatasetId, ".", _pstName, H5P_DEFAULT, H5P_DEFAULT);
         if (iAttributeId < 0)
         {
             return -1;
@@ -110,13 +113,14 @@ static char* readAttribute_v1(int _iDatasetId, const char *_pstName)
     hid_t iFileType, memtype, iSpace;
     herr_t status;
     hsize_t dims[1];
+    hsize_t n = 0;
     size_t iDim;
 
     char *pstValue = NULL;
 
-    if (H5Aiterate(_iDatasetId, NULL, find_attr_by_name_v1, (void *)_pstName))
+    if (H5Aiterate(_iDatasetId, H5_INDEX_NAME, H5_ITER_NATIVE, &n, find_attr_by_name_v1, (void *)_pstName) > 0)
     {
-        iAttributeId = H5Aopen_name(_iDatasetId, _pstName);
+        iAttributeId = H5Aopen_by_name(_iDatasetId, ".", _pstName, H5P_DEFAULT, H5P_DEFAULT);
         if (iAttributeId < 0)
         {
             return NULL;
@@ -157,6 +161,7 @@ static char* readAttribute_v1(int _iDatasetId, const char *_pstName)
         status = H5Tset_size(memtype, iDim);
         if (status < 0)
         {
+            FREE(pstValue);
             return NULL;
         }
 
@@ -322,24 +327,31 @@ int getVariableNames_v1(int _iFile, char **pstNameList)
     hsize_t iCount = 0;
     herr_t status = 0;
     int iNbItem = 0;
+    H5O_info_t oinfo;
+    H5G_info_t ginfo;
 
-    status = H5Gget_num_objs(_iFile, &iCount);
+    status = H5Gget_info(_iFile, &ginfo);
     if (status != 0)
     {
         return 0;
     }
 
+    iCount = ginfo.nlinks;
     for (i = 0; i < iCount; i++)
     {
-        if (H5Gget_objtype_by_idx(_iFile, i) == H5G_DATASET)
+        status = H5Oget_info_by_idx(_iFile, "/", H5_INDEX_NAME, H5_ITER_NATIVE, i, &oinfo, H5P_DEFAULT);
+        if (status < 0)
+        {
+            return 0;
+        }
+
+        if (oinfo.type == H5O_TYPE_DATASET)
         {
             if (pstNameList != NULL)
             {
-                int iLen = 0;
-
-                iLen = (int)H5Gget_objname_by_idx(_iFile, i, NULL, iLen);
-                pstNameList[iNbItem] = (char *)MALLOC(sizeof(char) * (iLen + 1));   //null terminated
-                H5Gget_objname_by_idx(_iFile, i, pstNameList[iNbItem], iLen + 1);
+                ssize_t iLen = H5Lget_name_by_idx(_iFile, ".", H5_INDEX_NAME, H5_ITER_INC, i, 0, 0, H5P_DEFAULT) + 1;
+                pstNameList[iNbItem] = (char*)MALLOC(sizeof(char) * iLen);
+                H5Lget_name_by_idx(_iFile, ".", H5_INDEX_NAME, H5_ITER_INC, i, pstNameList[iNbItem], iLen, H5P_DEFAULT);
             }
             iNbItem++;
         }
@@ -349,18 +361,33 @@ int getVariableNames_v1(int _iFile, char **pstNameList)
 
 int getDataSetIdFromName_v1(int _iFile, char *_pstName)
 {
-    return H5Dopen(_iFile, _pstName);
+    return H5Dopen(_iFile, _pstName, H5P_DEFAULT);
+}
+
+void closeDataSet_v1(int _id)
+{
+    if (_id > 0)
+    {
+        herr_t status = H5Dclose(_id);
+        if (status < 0)
+        {
+            return;
+        }
+    }
+
+    return;
 }
 
 int getDataSetId_v1(int _iFile)
 {
     herr_t status = 0;
     int iDatasetId = 0;
+    hsize_t idx = 0;
 
     /*
     * Begin iteration.
     */
-    status = H5Giterate(_iFile, "/", NULL, op_func_v1, &iDatasetId);
+    status = H5Literate(_iFile, H5_INDEX_NAME, H5_ITER_NATIVE, &idx, op_func_v1, &iDatasetId);
     if (status < 0)
     {
         return -1;
@@ -781,7 +808,7 @@ static int readPoly_v1(int _iDatasetId, int *_piNbCoef, double **_pdblData)
 }
 
 int readCommonPolyMatrix_v1(int _iDatasetId, char *_pstVarname, int _iComplex, int _iRows, int _iCols, int *_piNbCoef, double **_pdblReal,
-    double **_pdblImg)
+                            double **_pdblImg)
 {
     int i = 0;
     hid_t obj = 0;
@@ -1023,7 +1050,7 @@ int readUnsignedInteger64Matrix_v1(int _iDatasetId, int _iRows, int _iCols, unsi
 }
 
 int readCommonSparseComplexMatrix_v1(int _iDatasetId, int _iComplex, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos,
-    double *_pdblReal, double *_pdblImg)
+                                     double *_pdblReal, double *_pdblImg)
 {
     hid_t obj = 0;
     hobj_ref_t pRef[3] = {0};
@@ -1080,7 +1107,7 @@ int readSparseMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, i
 }
 
 int readSparseComplexMatrix_v1(int _iDatasetId, int _iRows, int _iCols, int _iNbItem, int *_piNbItemRow, int *_piColPos, double *_pdblReal,
-    double *_pdblImg)
+                               double *_pdblImg)
 {
     return readCommonSparseComplexMatrix_v1(_iDatasetId, 1, _iRows, _iCols, _iNbItem, _piNbItemRow, _piColPos, _pdblReal, _pdblImg);
 }
@@ -1141,10 +1168,6 @@ int getScilabTypeFromDataSet_v1(int _iDatasetId)
     {
         iVarType = sci_boolean;
     }
-    else if (strcmp(pstScilabClass, g_SCILAB_CLASS_BOOLEAN) == 0)
-    {
-        iVarType = sci_boolean;
-    }
     else if (strcmp(pstScilabClass, g_SCILAB_CLASS_POLY) == 0)
     {
         iVarType = sci_poly;