import or export for the struct and cell from hdf5 05/16305/9
Sylvain GENIN [Wed, 1 Apr 2015 10:16:11 +0000 (12:16 +0200)]
test_run("hdf5","exportImportHdf5",["no_check_error_output"]);

Change-Id: I7f4dedee7716543dbea7fe75887503d05fee4ee1

scilab/modules/api_scilab/src/cpp/api_list.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_export_to_hdf5.cpp
scilab/modules/hdf5/sci_gateway/cpp/sci_import_from_hdf5.cpp
scilab/modules/hdf5/tests/unit_tests/exportImportHdf5.dia.ref
scilab/modules/hdf5/tests/unit_tests/exportImportHdf5.tst

index b495012..78189f0 100644 (file)
@@ -482,7 +482,7 @@ static SciErr createCommonListInList(void* _pvCtx, const char* _pstName, int* _p
     const char* funcName = NULL;
     int apiError         = API_ERROR_CREATE_LIST_IN_LIST;
 
-    if (_pstName == NULL)
+    if (_piParent != NULL)
     {
         funcName = "createListInList";
     }
index b7f862d..b805e86 100644 (file)
@@ -13,6 +13,8 @@
 #include <hdf5.h>
 #include "internal.hxx"
 #include "types.hxx"
+#include "struct.hxx"
+#include "cell.hxx"
 
 extern "C"
 {
@@ -43,6 +45,8 @@ static bool isVarExist(int* pvCtx, int _iFile, char* _pstVarName);
 
 static bool export_data(int* pvCtx, int _iH5File, int *_piVar, char* _pstName);
 static bool export_list(int* pvCtx, int _iH5File, int *_piVar, char* _pstName, int _iVarType);
+static bool export_struct(int* pvCtx, int _iH5File, int *_piVar, char* _pstName, int _iVarType);
+static bool export_cell(int* pvCtx, int _iH5File, int *_piVar, char* _pstName, int _iVarType);
 static bool export_hypermat(int* pvCtx, int _iH5File, int *_piVar, char* _pstName);
 static bool export_double(int* pvCtx, int _iH5File, int *_piVar, char* _pstName);
 static bool export_poly(int* pvCtx, int _iH5File, int *_piVar, char* _pstName);
@@ -351,6 +355,14 @@ static bool export_data(int* pvCtx, int _iH5File, int* _piVar, char* _pstName)
             case sci_tlist :
             case sci_mlist :
             {
+                if (pIT->isStruct())
+                {
+                    return export_struct(pvCtx, _iH5File, _piVar, _pstName, iType);
+                }
+                if (pIT->isCell())
+                {
+                    return export_cell(pvCtx, _iH5File, _piVar, _pstName, iType);
+                }
                 bReturn = export_list(pvCtx, _iH5File, _piVar, _pstName, iType);
                 break;
             }
@@ -454,6 +466,247 @@ static bool export_list(int* pvCtx, int _iH5File, int *_piVar, char* _pstName, i
     return true;
 }
 
+static bool export_struct(int* pvCtx, int _iH5File, int *_piVar, char* _pstName, int _iVarType)
+{
+    char STR[] = "st";
+    char DIMS[] = "dims";
+
+    int iItemNumber = 0;
+
+    types::Struct* pStruct = (types::Struct*)_piVar;
+    types::SingleStruct** ppSStruct = pStruct->get();
+
+    types::String* pStr = pStruct->getFieldNames();
+    // for empty struct, getFieldNames return NULL
+    if (pStr)
+    {
+        iItemNumber = pStr->getSize();
+    }
+
+    char** strStruct = new char*[iItemNumber + 2];
+    strStruct[0] = STR;
+    strStruct[1] = DIMS;
+
+    for (int i = 0; i < iItemNumber; ++i)
+    {
+        strStruct[i + 2] = wide_string_to_UTF8(pStr->get(i));
+    }
+
+    //int iVarType = sci_mlist;
+    int iRet = 0;
+    bool bReturn = false;
+
+    //create groupe name
+    char* pstGroupName = createGroupName(_pstName);
+    iLevel++;
+
+    //open list
+    void *pvList = openList(_iH5File, pstGroupName, 2 + iItemNumber);
+
+    //export string ["st" "dims" "field name"]
+
+    int piStrDims[2] = { 1, iItemNumber + 2 };
+
+    char* pstPathName = createPathName(pstGroupName, 0);
+    iRet = writeStringMatrix(_iH5File, pstPathName, 2, piStrDims, strStruct);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iRet = addItemInList(_iH5File, pvList, 0, pstPathName);
+    FREE(pstPathName);
+    if (iRet)
+    {
+        return false;
+    }
+
+    // export size
+    int piSizeDims[2] = { 1, 0 };
+    piSizeDims[1] = pStruct->getDims();
+    pstPathName = createPathName(pstGroupName, 1);
+    iRet = writeInteger32Matrix(_iH5File, pstPathName, 2, piSizeDims, pStruct->getDimsArray());
+    if (iRet)
+    {
+        return false;
+    }
+
+    iRet = addItemInList(_iH5File, pvList, 1, pstPathName);
+    FREE(pstPathName);
+    if (iRet)
+    {
+        return false;
+    }
+
+    int *piNewVar = NULL;
+    if (pStruct->getSize() == 1)
+    {
+        for (int i = 0; i < iItemNumber; ++i)
+        {
+
+            char* pstPathName = createPathName(pstGroupName, i + 2);
+
+            piNewVar = (int*)ppSStruct[0]->get(pStr->get(i));
+
+
+            if (piNewVar == NULL)
+            {
+                //undefined item
+                bReturn = export_undefined(pvCtx, _iH5File, piNewVar, pstPathName);
+            }
+            else
+            {
+                bReturn = export_data(pvCtx, _iH5File, piNewVar, pstPathName);
+            }
+
+            iRet = addItemInList(_iH5File, pvList, i + 2, pstPathName);
+            FREE(pstPathName);
+            if (bReturn == false || iRet)
+            {
+                return false;
+            }
+        }
+    }
+    else if (pStruct->getSize() > 1) //
+    {
+        types::List* pListe = new types::List();
+
+        for (int i = 0; i < iItemNumber; ++i)
+        {
+
+            char* pstPathName = createPathName(pstGroupName, i + 2);
+
+            for (int iReadData = 0; iReadData < pStruct->getSize(); ++iReadData)
+            {
+                pListe->set(iReadData, ppSStruct[iReadData]->get(pStr->get(i)));
+            }
+            piNewVar = (int*)pListe;
+
+
+            if (piNewVar == NULL)
+            {
+                //undefined item
+                bReturn = export_undefined(pvCtx, _iH5File, piNewVar, pstPathName);
+            }
+            else
+            {
+                bReturn = export_data(pvCtx, _iH5File, piNewVar, pstPathName);
+            }
+
+            iRet = addItemInList(_iH5File, pvList, i + 2, pstPathName);
+            FREE(pstPathName);
+            if (bReturn == false || iRet)
+            {
+                return false;
+            }
+        }
+
+        delete pListe;
+    }
+
+    iLevel--;
+    closeList(_iH5File, pvList, _pstName, 2 + iItemNumber, _iVarType);
+    FREE(pstGroupName);
+    //close list
+    return true;
+}
+
+static bool export_cell(int* pvCtx, int _iH5File, int *_piVar, char* _pstName, int _iVarType)
+{
+    char CELL[] = "ce";
+    char DIMS[] = "dims";
+    char ENTRIES[] = "entries";
+
+    char* strCell[] = { CELL, DIMS, ENTRIES };
+
+    types::Cell* pCell = (types::Cell*)_piVar;
+
+    //int iVarType = sci_mlist;
+    int iRet = 0;
+    bool bReturn = false;
+
+    //create groupe name
+    char* pstGroupName = createGroupName(_pstName);
+    iLevel++;
+
+    //open list
+    void *pvList = openList(_iH5File, pstGroupName, 3);
+
+    //export string ["cell" "dims" "entries"]
+
+    int piStrDims[2] = { 1, 3 };
+
+    char* pstPathName = createPathName(pstGroupName, 0);
+    iRet = writeStringMatrix(_iH5File, pstPathName, 2, piStrDims, strCell);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iRet = addItemInList(_iH5File, pvList, 0, pstPathName);
+    FREE(pstPathName);
+    if (iRet)
+    {
+        return false;
+    }
+
+    // export size
+    int piSizeDims[2] = { 1, 0 };
+    piSizeDims[1] = pCell->getDims();
+    pstPathName = createPathName(pstGroupName, 1);
+    iRet = writeInteger32Matrix(_iH5File, pstPathName, 2, piSizeDims, pCell->getDimsArray());
+    if (iRet)
+    {
+        return false;
+    }
+
+    iRet = addItemInList(_iH5File, pvList, 1, pstPathName);
+    FREE(pstPathName);
+    if (iRet)
+    {
+        return false;
+    }
+
+    int *piNewVar = NULL;
+
+    types::List* pListe = new types::List();
+
+    pstPathName = createPathName(pstGroupName, 2);
+
+    for (int iReadData = 0; iReadData < pCell->getSize(); ++iReadData)
+    {
+        pListe->set(iReadData, pCell->get(iReadData));
+    }
+
+    piNewVar = (int*)pListe;
+
+    if (piNewVar == NULL)
+    {
+        //undefined item
+        bReturn = export_undefined(pvCtx, _iH5File, piNewVar, pstPathName);
+    }
+    else
+    {
+        bReturn = export_data(pvCtx, _iH5File, piNewVar, pstPathName);
+    }
+
+    iRet = addItemInList(_iH5File, pvList, 2, pstPathName);
+    FREE(pstPathName);
+    if (bReturn == false || iRet)
+    {
+        return false;
+    }
+
+    delete pListe;
+
+    iLevel--;
+    closeList(_iH5File, pvList, _pstName, 3, _iVarType);
+    FREE(pstGroupName);
+    //close list
+    return true;
+}
+
+
 static bool export_hypermat(int* pvCtx, int _iH5File, int *_piVar, char* _pstName)
 {
     char HM [] = "hm";
index b962b59..f0928e4 100644 (file)
@@ -13,6 +13,8 @@
 #include <hdf5.h>
 #include "context.hxx"
 #include "list.hxx"
+#include "struct.hxx"
+#include "cell.hxx"
 
 extern "C"
 {
@@ -45,6 +47,8 @@ static bool import_boolean_sparse(int* pvCtx, int _iDatasetId, int _iItemPos, in
 static bool import_poly(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
 static bool import_list(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
 static bool import_hypermat(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_struct(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
+static bool import_cell(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname);
 static bool import_void(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
 static bool import_undefined(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname);
 
@@ -239,6 +243,14 @@ static bool import_data(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddr
             bRet = import_hypermat(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
             if (bRet == false)
             {
+                bRet = import_struct(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
+            }
+            if (bRet == false)
+            {
+                bRet = import_cell(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
+            }
+            if (bRet == false)
+            {
                 bRet = import_list(pvCtx, _iDatasetId, iVarType, _iItemPos, _piAddress, _pstVarname);
             }
             break;
@@ -1286,3 +1298,415 @@ static bool import_hypermat(int* pvCtx, int _iDatasetId, int _iVarType, int _iIt
     return true;
 }
 /*--------------------------------------------------------------------------*/
+
+static bool import_struct(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int iComplex = 0;
+    int iDims = 0;
+    int iItems = 0;
+    hobj_ref_t *piItemRef = NULL;
+
+    // an struct is stored in an mlist
+    if (_iVarType != sci_mlist)
+    {
+        return false;
+    }
+
+    iRet = getListDims(_iDatasetId, &iItems);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (iItems < 2)
+    {
+        // struct have 2 elements minimal
+        return false;
+    }
+
+    iRet = getListItemReferences(_iDatasetId, &piItemRef);
+    if (iRet)
+    {
+        return false;
+    }
+
+    // get first item
+    int iItemDataset = 0;
+    iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
+    if (iRet || iItemDataset == 0)
+    {
+        return false;
+    }
+
+    // get first item type
+    int iItemType = getScilabTypeFromDataSet(iItemDataset);
+    if (iItemType != sci_strings)
+    {
+        return false;
+    }
+
+    // get size of first item
+    iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
+    if (iRet < 0 || iDims != 2)
+    {
+        return false;
+    }
+
+    int* piDims = new int[2];
+    int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
+    if (iSize != iItems)
+    {
+        delete[] piDims;
+        return false;
+    }
+
+    delete[] piDims;
+    piDims = NULL;
+
+    // get data of first item for check the type of mlist
+    char** pstData = new char*[iSize];
+    char** pstDataSave = new char*[iSize - 2];
+    iRet = readStringMatrix(iItemDataset, pstData);
+    if (iRet || strcmp(pstData[0], "st") != 0)
+    {
+        freeStringMatrix(iItemDataset, pstData);
+        delete[] pstData;
+        delete[] pstDataSave;
+        return false;
+    }
+
+    for (int i = 2; i < iSize; ++i)
+    {
+        pstDataSave[-2 + i] = new char[strlen(pstData[i]) + 1];
+        strcpy(pstDataSave[-2 + i], pstData[i]);
+    }
+
+    freeStringMatrix(iItemDataset, pstData);
+    delete[] pstData;
+    pstData = NULL;
+
+    // get second item, the Size of struct
+    iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
+    if (iRet)
+    {
+        for (int i = 0; i < (-2 + iItems); ++i)
+        {
+            delete pstDataSave[i];
+        }
+        delete[] pstDataSave;
+        pstDataSave = NULL;
+        return false;
+    }
+
+    iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
+    if (iRet < 0 || iDims != 2)
+    {
+        for (int i = 0; i < (-2 + iItems); ++i)
+        {
+            delete pstDataSave[i];
+        }
+        delete[] pstDataSave;
+        pstDataSave = NULL;
+        return false;
+    }
+
+    piDims = new int[2];
+    iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
+    if (piDims[0] != 1)
+    {
+        for (int i = 0; i < (-2 + iItems); ++i)
+        {
+            delete pstDataSave[i];
+        }
+        delete[] pstDataSave;
+        pstDataSave = NULL;
+        delete[] piDims;
+        return false;
+    }
+
+    int* piDimsArray = new int[piDims[1]];
+    iRet = readInteger32Matrix(iItemDataset, piDimsArray);
+    if (iRet)
+    {
+        for (int i = 0; i < (-2 + iItems); ++i)
+        {
+            delete pstDataSave[i];
+        }
+        delete[] pstDataSave;
+        pstDataSave = NULL;
+        delete[] piDims;
+        delete[] piDimsArray;
+        return false;
+    }
+
+    types::Struct* pStruct = new types::Struct(piDims[1], piDimsArray);
+
+    wchar_t* pwstName = NULL;
+    for (int i = 0; i < (-2 + iItems); ++i)
+    {
+        pwstName = to_wide_string(pstDataSave[i]);
+        pStruct->addField(pwstName);
+        delete pstDataSave[i];
+        FREE(pwstName);
+    }
+
+    delete[] pstDataSave;
+    pstDataSave = NULL;
+
+    types::SingleStruct** ppSStruct =  pStruct->get();
+    types::String* pStr = pStruct->getFieldNames();
+
+    types::List* pList = new types::List();
+    // fill the list to avoid api_scilab error about the list size.
+    pList->set(0, types::Double::Empty());
+
+    if (pStruct->getSize() == 1)
+    {
+        types::InternalType* pIT = NULL;
+        for (int i = 0; i < pStr->getSize(); ++i)
+        {
+            int iItemDataset = 0;
+            iRet = getListItemDataset(_iDatasetId, piItemRef, i + 2, &iItemDataset);
+            if (iRet || iItemDataset == 0)
+            {
+                delete pList;
+                delete pStruct;
+                return false;
+            }
+
+            wchar_t* pwcsName = pStr->get(i);
+            char* pcName = wide_string_to_UTF8(pwcsName);
+
+            bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, pcName);
+            if (bRet == false)
+            {
+                delete pList;
+                delete pStruct;
+                return false;
+            }
+
+            pIT = pList->get(0);
+            ppSStruct[0]->set(pwcsName, pIT);
+            FREE(pcName);
+        }
+    }
+    else if (pStruct->getSize() > 1)
+    {
+        for (int i = 0; i < pStr->getSize(); ++i)
+        {
+            int iItemDataset = 0;
+            iRet = getListItemDataset(_iDatasetId, piItemRef, i + 2, &iItemDataset);
+            if (iRet || iItemDataset == 0)
+            {
+                delete pList;
+                delete pStruct;
+                return false;
+            }
+
+            wchar_t* pwcsName = pStr->get(i);
+            char* pcName = wide_string_to_UTF8(pwcsName);
+
+            bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, pcName);
+            if (bRet == false)
+            {
+                delete pList;
+                delete pStruct;
+                return false;
+            }
+
+            types::List* pListData = pList->get(0)->getAs<types::List>();
+            for (int iWriteData = 0; iWriteData < pStruct->getSize(); ++iWriteData)
+            {
+                ppSStruct[iWriteData]->set(pwcsName, pListData->get(iWriteData));
+            }
+
+            FREE(pcName);
+        }
+
+    }
+
+    delete pList;
+    if (_piAddress == NULL)
+    {
+        pwstName = to_wide_string(_pstVarname);
+        symbol::Context::getInstance()->put(symbol::Symbol(pwstName), pStruct);
+        FREE(pwstName);
+    }
+    else
+    {
+        types::List* pParentList = (types::List*)_piAddress;
+        pParentList->set(_iItemPos - 1, pStruct);
+    }
+
+    iRet = deleteListItemReferences(_iDatasetId, piItemRef);
+    if (iRet)
+    {
+        return false;
+    }
+
+    return true;
+}
+/*--------------------------------------------------------------------------*/
+
+
+static bool import_cell(int* pvCtx, int _iDatasetId, int _iVarType, int _iItemPos, int *_piAddress, char *_pstVarname)
+{
+    int iRet = 0;
+    int iComplex = 0;
+    int iDims = 0;
+    int iItems = 0;
+    hobj_ref_t *piItemRef = NULL;
+
+    // an hypermatrix is stored in an mlist
+    if (_iVarType != sci_mlist)
+    {
+        return false;
+    }
+
+    iRet = getListDims(_iDatasetId, &iItems);
+    if (iRet)
+    {
+        return false;
+    }
+
+    if (iItems != 3)
+    {
+        // cell have 3 elements
+        return false;
+    }
+
+    iRet = getListItemReferences(_iDatasetId, &piItemRef);
+    if (iRet)
+    {
+        return false;
+    }
+
+    // get first item
+    int iItemDataset = 0;
+    iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset);
+    if (iRet || iItemDataset == 0)
+    {
+        return false;
+    }
+
+    // get first item type
+    int iItemType = getScilabTypeFromDataSet(iItemDataset);
+    if (iItemType != sci_strings)
+    {
+        return false;
+    }
+
+    // get size of first item
+    iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
+    if (iRet < 0 || iDims != 2)
+    {
+        return false;
+    }
+
+    int* piDims = new int[2];
+    int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
+    if (iSize != 3)
+    {
+        delete[] piDims;
+        return false;
+    }
+
+    delete[] piDims;
+    piDims = NULL;
+
+    // get data of first item for check the type of mlist
+    char** pstData = new char*[iSize];
+    iRet = readStringMatrix(iItemDataset, pstData);
+    if (iRet || strcmp(pstData[0], "ce") != 0)
+    {
+        freeStringMatrix(iItemDataset, pstData);
+        delete[] pstData;
+        return false;
+    }
+
+    freeStringMatrix(iItemDataset, pstData);
+    delete[] pstData;
+    pstData = NULL;
+
+    // get second item, the Size of cell
+    iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset);
+    if (iRet)
+    {
+        return false;
+    }
+
+    iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL);
+    if (iRet < 0 || iDims != 2)
+    {
+        return false;
+    }
+
+    piDims = new int[2];
+    iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims);
+    if (piDims[0] != 1)
+    {
+        delete[] piDims;
+        return false;
+    }
+
+    int* piDimsArray = new int[piDims[1]];
+    iRet = readInteger32Matrix(iItemDataset, piDimsArray);
+    if (iRet)
+    {
+        delete[] piDims;
+        delete[] piDimsArray;
+        return false;
+    }
+
+    types::Cell* pCell = new types::Cell(piDims[1], piDimsArray);
+    types::List* pList = new types::List();
+    pList->set(0, types::Double::Empty());
+
+    iRet = getListItemDataset(_iDatasetId, piItemRef, 2, &iItemDataset);
+    if (iRet || iItemDataset == 0)
+    {
+        delete pList;
+        delete pCell;
+        return false;
+    }
+
+    bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, NULL);
+    if (bRet == false)
+    {
+        delete pList;
+        delete pCell;
+        return false;
+    }
+
+    types::List* pListData = pList->get(0)->getAs<types::List>();
+    for (int iWriteData = 0; iWriteData < pCell->getSize(); ++iWriteData)
+    {
+        pCell->set(iWriteData, pListData->get(iWriteData));
+    }
+
+    delete pList;
+
+    if (_piAddress == NULL)
+    {
+        wchar_t* pwstName = to_wide_string(_pstVarname);
+        symbol::Context::getInstance()->put(symbol::Symbol(pwstName), pCell);
+        FREE(pwstName);
+    }
+    else
+    {
+        types::List* pParentList = (types::List*)_piAddress;
+        pParentList->set(_iItemPos - 1, pCell);
+    }
+
+    iRet = deleteListItemReferences(_iDatasetId, piItemRef);
+
+    if (iRet)
+    {
+        return false;
+    }
+
+    return true;
+}
+/*--------------------------------------------------------------------------*/
+
index 706c472..31177ed 100644 (file)
@@ -240,3 +240,29 @@ assert_checktrue(exists("l")==0);
 // import from hdf5
 assert_checktrue(import_from_hdf5(fileName));
 assert_checkequal(l == list(1, , 3), [%t %f %t]);
+// Struct
+data.data.data = 0;
+data.data.string = "Scilab";
+data.list = list(1,["S" "E"]);
+checkValue(data);
+data2.data.data = 42;
+data2.data.string = "Test";
+data2.list = list(1,["a" "b"]);
+checkValue(data2);
+struct_ = [data, data, data2; data2, data2, data];
+checkValue(struct_);
+emptyStruct = struct();
+checkValue(emptyStruct);
+// Cell
+Cell_ = cell(2,2,2);
+Cell_{1} = "scilab";
+Cell_{2} = 42;
+Cell_{3} = list(1,["a" "b"]);
+Cell_{4} = int8(2);
+Cell_{5} = 5;
+Cell_{6} = 6;
+Cell_{7} = poly(1:3,"s");
+Cell_{8} = "Yasp";
+checkValue(Cell_);
+emptyCell = cell();
+checkValue(emptyCell);
index f31a108..60b46ac 100644 (file)
@@ -258,3 +258,35 @@ assert_checktrue(exists("l")==0);
 // import from hdf5
 assert_checktrue(import_from_hdf5(fileName));
 assert_checkequal(l == list(1, , 3), [%t %f %t]);
+
+// Struct
+data.data.data = 0;
+data.data.string = "Scilab";
+data.list = list(1,["S" "E"]);
+checkValue(data);
+
+data2.data.data = 42;
+data2.data.string = "Test";
+data2.list = list(1,["a" "b"]);
+checkValue(data2);
+
+struct_ = [data, data, data2; data2, data2, data];
+checkValue(struct_);
+
+emptyStruct = struct();
+checkValue(emptyStruct);
+
+// Cell
+Cell_ = cell(2,2,2);
+Cell_{1} = "scilab";
+Cell_{2} = 42;
+Cell_{3} = list(1,["a" "b"]);
+Cell_{4} = int8(2);
+Cell_{5} = 5;
+Cell_{6} = 6;
+Cell_{7} = poly(1:3,"s");
+Cell_{8} = "Yasp";
+checkValue(Cell_);
+
+emptyCell = cell();
+checkValue(emptyCell);