add import int 8,16,32,(64) from HDF5
antoine ELIAS [Mon, 29 Jun 2009 09:05:24 +0000 (11:05 +0200)]
scilab/modules/core/src/c/api_int.c
scilab/modules/core/src/c/api_internal_int.h [new file with mode: 0644]
scilab/modules/core/src/c/api_list.c
scilab/modules/core/src/c/core.vcproj
scilab/modules/fileio/sci_gateway/cpp/sci_import_from_hdf5.cpp
scilab/modules/fileio/src/c/h5_readDataFromFile.c

index 6ab08ed..b099c39 100644 (file)
 
 #include "api_common.h"
 #include "api_internal_common.h"
+#include "api_internal_int.h"
 #include "api_int.h"
 
 #include "CallScilab.h"
 #include "stack-c.h"
 
-//integer
-static int getCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int* _piRows, int* _piCols, void** _piData);
-static int allocCommonMatrixOfInteger(int _iVar, int *_piAddress, int _iPrecision, int _iRows, int _iCols, void** piData);
-static int fillCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int _iRows, int _iCols, void** _pdiData);
-static int createCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int _iRows, int _iCols, void* _piData);
-static int readCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int* _piRows, int* _piCols, void* _piData);
-
 int getMatrixOfIntegerPrecision(int* _piAddress, int* _piPrecision)
 {
        if(_piAddress == NULL)
@@ -58,7 +52,7 @@ int getMatrixOfInteger32(int* _piAddress, int* _piRows, int* _piCols, int** _piD
        return getCommonMatrixOfInteger(_piAddress, SCI_INT32, _piRows, _piCols, (void**)_piData32);
 }
 
-static int getCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int* _piRows, int* _piCols, void** _piData)
+int getCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int* _piRows, int* _piCols, void** _piData)
 {
        int iPrec               = 0;
        int iRet                = 0;
@@ -216,7 +210,7 @@ int allocMatrixOfInteger64(int _iVar, int _iRows, int _iCols, long long** _piDat
 }
 #endif
 
-static int allocCommonMatrixOfInteger(int _iVar, int *_piAddress, int _iPrecision, int _iRows, int _iCols, void** piData)
+int allocCommonMatrixOfInteger(int _iVar, int *_piAddress, int _iPrecision, int _iRows, int _iCols, void** piData)
 {
        int iNewPos                     = Top - Rhs + _iVar;
        int iAddr                               = *Lstk(iNewPos);
@@ -234,7 +228,7 @@ static int allocCommonMatrixOfInteger(int _iVar, int *_piAddress, int _iPrecisio
        return 0;
 }
 
-static int fillCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int _iRows, int _iCols, void** _pdiData)
+int fillCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int _iRows, int _iCols, void** _pdiData)
 {
        _piAddress[0]           = sci_ints;
        _piAddress[1]           = Min(_iRows, _iRows * _iCols);
@@ -269,7 +263,7 @@ int createNamedMatrixOfInteger64(char* _pstName, int _iNameLen, int _iRows, int
 }
 #endif
 
-static int createCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int _iRows, int _iCols, void* _piData)
+int createCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int _iRows, int _iCols, void* _piData)
 {
        int iVarID[nsiz];
   int iSaveRhs                 = Rhs;
@@ -350,7 +344,7 @@ int readNamedMatrixOfInteger64(char* _pstName, int _iNameLen, int* _piRows, int*
 }
 #endif
 
-static int readCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int* _piRows, int* _piCols, void* _piData)
+int readCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int* _piRows, int* _piCols, void* _piData)
 {
        int iRet                                        = 0;
        int* piAddr                             = NULL;
diff --git a/scilab/modules/core/src/c/api_internal_int.h b/scilab/modules/core/src/c/api_internal_int.h
new file mode 100644 (file)
index 0000000..8fa5550
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
+ *
+ * This file must be used under the terms of the CeCILL.
+ * 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
+ */
+
+#ifndef __INTERNAL_INT_API__
+#define __INTERNAL_INT_API__
+
+//internal
+int getCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int* _piRows, int* _piCols, void** _piData);
+int allocCommonMatrixOfInteger(int _iVar, int *_piAddress, int _iPrecision, int _iRows, int _iCols, void** piData);
+int fillCommonMatrixOfInteger(int* _piAddress, int _iPrecision, int _iRows, int _iCols, void** _pdiData);
+int createCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int _iRows, int _iCols, void* _piData);
+int readCommonNamedMatrixOfInteger(char* _pstName, int _iNameLen, int _iPrecision, int* _piRows, int* _piCols, void* _piData);
+
+#endif /* __INTERNAL_INT_API__ */
index 152ddc4..2e512b4 100644 (file)
 #include "api_internal_string.h"
 #include "api_internal_boolean.h"
 #include "api_internal_poly.h"
+#include "api_internal_int.h"
 #include "api_list.h"
 #include "api_string.h"
 #include "api_boolean.h"
+#include "api_int.h"
 
 
 //internal functions
@@ -1135,43 +1137,182 @@ int readCommonMatrixOfPolyInNamedList(char* _pstName, int _iNameLen, int _piPare
 //TODO !!!!!
 }
 
+static int fillCommonMatrixOfIntegerInList(int _iVar, int* _piParent, int _iItemPos, int _iPrecision, int _iRows, int _iCols, void** _pvData)
+{
+       int iRet                                        = 0;
+       int iNbItem                             = 0;
+       int* piOffset                   = NULL;
+       int* piChildAddr        = NULL;
+
+       //Does item can be added in the list
+       getListItemNumber(_piParent, &iNbItem);
+       if(iNbItem < _iItemPos)
+       {
+               return 1;
+       }
+
+
+       iRet = allocCommonItemInList(_piParent, _iItemPos, &piChildAddr);
+       if(iRet)
+       {
+               return 1;
+       }
+
+       iRet = fillCommonMatrixOfInteger(piChildAddr, _iPrecision, _iRows, _iCols, _pvData);
+       if(iRet)
+       {
+               return 1;
+       }
+
+       piOffset                                                = _piParent + 2;
+
+       //integer : size in double
+       //1st case, 5 * 1 int8  -> (10,5) (1,1) (1,2,3,4,5,x,x,x)                                                                                       -> 3 : 2 + 5/8 + !!(5%8) -> 2 + 0 + 1 -> 3
+       //2nd case, 5 * 1 int16 -> (10,5) (1,2)                 (1,2,3,4)                               (5,x,x,x)                                       -> 4 : 2 + 5/4 + !!(5%4) -> 2 + 1 + 1 -> 4
+       //3th case, 5 * 1 int32 -> (10,5) (1,3)                         (1,2)                                           (3,4)                   (5,x)   -> 5 : 2 + 5/2 + !!(5%2) -> 2 + 2 + 1 -> 5
+
+       //with 5*5 int matrix
+       //1st case, 5 * 5 int8  -> (10,5) (5,1) (1:25) -> 3 : 2 + 25/8 + !!(25%8) -> 2 + 3  + 1 -> 6
+       //2nd case, 5 * 1 int16 -> (10,5) (5,2) (1:25) -> 4 : 2 + 25/4 + !!(25%4) -> 2 + 6  + 1 -> 9
+       //3th case, 5 * 5 int32 -> (10,5) (5,3) (1:25) -> 5 : 2 + 25/2 + !!(25%2) -> 2 + 12 + 1 -> 15
+       piOffset[_iItemPos] = piOffset[_iItemPos - 1] + 2 + _iRows * _iCols / (sizeof(double) / _iPrecision) + !!(_iRows * _iCols) % (sizeof(double) / _iPrecision);
+
+       return 0;
+}
+
+static int allocCommonMatrixOfIntegerInList(int _iVar, int* _piParent, int _iItemPos, int _iPrecision, int _iRows, int _iCols, void** _pvData)
+{
+       int iRet                                        = 0;
+       int iNewPos                             = Top - Rhs + _iVar;
+       int* piEnd                              = NULL;
+
+       iRet = fillCommonMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, _iPrecision, _iRows, _iCols, _pvData);
+       if(iRet)
+       {
+               return 1;
+       }
+
+       piEnd = (int*)*_pvData + _iRows * _iCols / (sizeof(int) / _iPrecision) + !!(_iRows * _iCols) % (sizeof(int) / _iPrecision);
+       closeList(iNewPos, piEnd);
+
+       if(_iItemPos == _piParent[1])
+       {
+               updateListOffset(_iVar, _piParent, _iItemPos, piEnd);
+       }
+       return 0;
+}
+
 int allocMatrixOfInteger8InList(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, char* _pcData)
 {
+       return allocCommonMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, SCI_INT8, _iRows, _iCols, &_pcData);
 }
 
 int allocMatrixOfInteger16InList(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, short* _psData)
 {
+       return allocCommonMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, SCI_INT16, _iRows, _iCols, &_psData);
 }
 
 int allocMatrixOfInteger32InList(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, int* _piData)
 {
+       return allocCommonMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, SCI_INT32, _iRows, _iCols, &_piData);
+}
+
+static int createCommomMatrixOfIntegerInList(int _iVar, int* _piParent, int _iItemPos, int _iPrecison, int _iRows, int _iCols, void* _pvData)
+{
+       void *pvData = NULL;
+
+       int iRet = 0;
+
+       iRet = allocCommonMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, _iPrecison, _iRows, _iCols, &pvData);
+       if(iRet)
+       {
+               return 1;
+       }
+       if(pvData != NULL)
+       {
+               memcpy(pvData, _pvData, _iRows * _iCols * _iPrecison);
+       }
+       return 0;
 }
 
 int createMatrixOfInteger8InList(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, char* _pcData)
 {
+       return createCommomMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, SCI_INT8, _iRows, _iCols, _pcData);
 }
 
 int createMatrixOfInteger16InList(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, short* _psData)
 {
+       return createCommomMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, SCI_INT16, _iRows, _iCols, _psData);
 }
 
 int createMatrixOfInteger32InList(int _iVar, int* _piParent, int _iItemPos, int _iRows, int _iCols, int* _piData)
 {
+       return createCommomMatrixOfIntegerInList(_iVar, _piParent, _iItemPos, SCI_INT32, _iRows, _iCols, _piData);
 }
 
+int createCommonMatrixOfIntegerInNamedList(char* _pstName, int _iNameLen, int* _piParent, int _iItemPos, int _iPrecision, int _iRows, int _iCols, void* _pvData)
+{
+       int iVarID[nsiz];
+  int iSaveRhs                 = Rhs;
+       int iSaveTop                    = Top;
+       int iRet                                        = 0;
+       int *piAddr                             = NULL;
+       int* piEnd                              = NULL;
+       int* piChildAddr        = NULL;
+
+  C2F(str2name)(_pstName, iVarID, _iNameLen);
+  Top = Top + Nbvars + 1;
+
+       iRet = getNewVarAddressFromPosition(Top, &piAddr);
+       if(iRet)
+       {
+               return 1;
+       }
+
+       iRet = createCommomMatrixOfIntegerInList(Top, _piParent, _iItemPos, _iPrecision, _iRows, _iCols, _pvData);
+       if(iRet)
+       {
+               return 1;
+       }
+
+       iRet = allocCommonItemInList(_piParent, _iItemPos, &piChildAddr);
+       if(iRet)
+       {
+               return 1;
+       }
+
+       //integer : size in int32
+       //1st case, 5 * 1 int8  -> 10 5 1 1 (1,2,3,4) (5,x,x,x)                                         -> 6 : 4 + 5/4 + !!(5%4) -> 4 + 1 + 1 -> 6
+       //2nd case, 5 * 1 int16 -> 10 5 1 2   (1,2)     (3,4)   (5,x)                   -> 7 : 4 + 5/2 + !!(5%2) -> 4 + 2 + 1 -> 7
+       //3th case, 5 * 1 int32 -> 10 5 1 4     1         2       3   4 5       -> 9 : 4 + 5/1 + !!(5%1) -> 4 + 5 + 0 -> 9
+       piEnd = piChildAddr + 4 + _iRows * _iCols / (sizeof(int) / _iPrecision) + !!(_iRows * _iCols) % ((sizeof(int) / _iPrecision));
+       closeList(Top, piEnd);
+
+       if(_iItemPos == _piParent[1])
+       {
+               updateNamedListOffset(Top, _piParent, _iItemPos, piEnd);
+               createNamedVariable(iVarID);
+       }
+
+       Top = iSaveTop;
+  Rhs = iSaveRhs;
+
+       return 0;
+}
 
 int createMatrixOfInteger8InNamedList(char* _pstName, int _iNameLen, int* _piParent, int _iItemPos, int _iRows, int _iCols, char* _pcData)
 {
-
+       return createCommonMatrixOfIntegerInNamedList(_pstName, _iNameLen, _piParent, _iItemPos, SCI_INT8, _iRows, _iCols, _pcData);
 }
 
 int createMatrixOfInteger16InNamedList(char* _pstName, int _iNameLen, int* _piParent, int _iItemPos, int _iRows, int _iCols, short* _psData)
 {
-
+       return createCommonMatrixOfIntegerInNamedList(_pstName, _iNameLen, _piParent, _iItemPos, SCI_INT16, _iRows, _iCols, _psData);
 }
 
 int createMatrixOfInteger32InNamedList(char* _pstName, int _iNameLen, int* _piParent, int _iItemPos, int _iRows, int _iCols, int* _piData)
 {
+       return createCommonMatrixOfIntegerInNamedList(_pstName, _iNameLen, _piParent, _iItemPos, SCI_INT32, _iRows, _iCols, _piData);
 }
 
 
index 10b1d66..f87afdf 100644 (file)
                                >
                        </File>
                        <File
+                               RelativePath=".\api_internal_int.h"
+                               >
+                       </File>
+                       <File
                                RelativePath=".\api_internal_poly.h"
                                >
                        </File>
index 5beade0..e72fd9a 100644 (file)
@@ -319,6 +319,11 @@ bool import_integer(int _iDatasetId, int _iItemPos, int* _piAddress, char* _pstV
        }
 
        iRet                                                            = getDatasetPrecision(_iDatasetId, &iPrec);
+       if(iRet)
+       {
+               return false;
+       }
+
        switch(iPrec)
        {
        case SCI_INT8 : 
index c7f535e..bddafb4 100644 (file)
@@ -147,27 +147,27 @@ int getDatasetPrecision(int _iDatasetId, int* _piPrec)
        char* pstScilabClass    = readAttribute(_iDatasetId, g_SCILAB_CLASS_PREC);
        if(pstScilabClass == NULL)
        {
-               return 0;
+               return 1;
        }
        else if(strcmp(pstScilabClass, "8") == 0)
        {
-               iRet    = SCI_INT8;
+               *_piPrec        = SCI_INT8;
        }
        else if(strcmp(pstScilabClass, "16") == 0)
        {
-               iRet = SCI_INT16;
+               *_piPrec = SCI_INT16;
        }
        else if(strcmp(pstScilabClass, "32") == 0)
        {
-               iRet = SCI_INT32;
+               *_piPrec = SCI_INT32;
        }
        else if(strcmp(pstScilabClass, "64") == 0)
        {
-               iRet = SCI_INT64;
+               *_piPrec = SCI_INT64;
        }
        else
        {
-               iRet = 0;
+               iRet = 1;
        }
        
        free(pstScilabClass);
@@ -551,22 +551,122 @@ int readPolyComplexMatrix(int _iDatasetId, char* _pstVarname, int _iRows, int _i
 
 int readInterger8Matrix(int _iDatasetId, int _iRows, int _iCols, char* _pcData)
 {
-       return 0;
+       herr_t status                   = 0;
+       char* pcLocalData = NULL;
+       int i                                                   = 0;
+       int j                                                   = 0;
+       char* pstMajor          = NULL;
+       char* pstMinor          = NULL;
+
+       pcLocalData = (char*)malloc(sizeof(char) * _iRows * _iCols);
+       /*
+       * Read the data.
+       */
+       status = H5Dread(_iDatasetId, H5T_NATIVE_INT8, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+               pcLocalData);
+
+       for (i = 0 ; i < _iRows ; ++i)
+       {
+               for (j = 0 ; j < _iCols ; ++j)
+               {
+                       _pcData[i + _iRows * j] = pcLocalData[i * _iCols + j];
+               }
+       }
+       status = H5Dclose(_iDatasetId);
+
+       free(pcLocalData);
+
+       return status;
 }
 
 int readInterger16Matrix(int _iDatasetId, int _iRows, int _iCols, short* _psData)
 {
-       return 0;
+       herr_t status                           = 0;
+       short* psLocalData      = NULL;
+       int i                                                           = 0;
+       int j                                                           = 0;
+       char* pstMajor                  = NULL;
+       char* pstMinor                  = NULL;
+
+       psLocalData = (short*)malloc(sizeof(short) * _iRows * _iCols);
+       /*
+       * Read the data.
+       */
+       status = H5Dread(_iDatasetId, H5T_NATIVE_INT16, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+               psLocalData);
+
+       for (i = 0 ; i < _iRows ; ++i)
+       {
+               for (j = 0 ; j < _iCols ; ++j)
+               {
+                       _psData[i + _iRows * j] = psLocalData[i * _iCols + j];
+               }
+       }
+       status = H5Dclose(_iDatasetId);
+
+       free(psLocalData);
+
+       return status;
 }
 
 int readInterger32Matrix(int _iDatasetId, int _iRows, int _iCols, int* _piData)
 {
-       return 0;
+       herr_t status                           = 0;
+       int* piLocalData                = NULL;
+       int i                                                           = 0;
+       int j                                                           = 0;
+       char* pstMajor                  = NULL;
+       char* pstMinor                  = NULL;
+
+       piLocalData = (int*)malloc(sizeof(int) * _iRows * _iCols);
+       /*
+       * Read the data.
+       */
+       status = H5Dread(_iDatasetId, H5T_NATIVE_INT32, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+               piLocalData);
+
+       for (i = 0 ; i < _iRows ; ++i)
+       {
+               for (j = 0 ; j < _iCols ; ++j)
+               {
+                       _piData[i + _iRows * j] = piLocalData[i * _iCols + j];
+               }
+       }
+       status = H5Dclose(_iDatasetId);
+
+       free(piLocalData);
+
+       return status;
 }
 
 int readInterger64Matrix(int _iDatasetId, int _iRows, int _iCols, long long* _pllData)
 {
-       return 0;
+       herr_t status                                                   = 0;
+       long long* pllLocalData         = NULL;
+       int i                                                                                   = 0;
+       int j                                                                                   = 0;
+       char* pstMajor                                          = NULL;
+       char* pstMinor                                          = NULL;
+
+       pllLocalData = (long long*)malloc(sizeof(long long) * _iRows * _iCols);
+       /*
+       * Read the data.
+       */
+       status = H5Dread(_iDatasetId, H5T_NATIVE_INT64, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+               pllLocalData);
+
+       for (i = 0 ; i < _iRows ; ++i)
+       {
+               for (j = 0 ; j < _iCols ; ++j)
+               {
+                       _pllData[i + _iRows * j] = pllLocalData[i * _iCols + j];
+               }
+       }
+       status = H5Dclose(_iDatasetId);
+
+       free(pllLocalData);
+
+       return status;
 }
 
 int getScilabTypeFromDataSet(int _iDatasetId)