static bool read_data(int _iDatasetId, int _iItemPos, int *_piAddress, VarInfo* _pInfo) { bool bRet = false; _pInfo->iType = getScilabTypeFromDataSet(_iDatasetId); switch (_pInfo->iType) { case sci_matrix: { bRet = read_double(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_strings: { bRet = read_string(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_list: case sci_tlist: case sci_mlist: { bRet = read_list(_iDatasetId, _pInfo->iType, _iItemPos, _piAddress, _pInfo); break; } case sci_boolean: { bRet = read_boolean(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_poly: { bRet = read_poly(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_ints: { bRet = read_integer(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_sparse: { bRet = read_sparse(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_boolean_sparse: { bRet = read_boolean_sparse(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_void: //void item only on list variable { bRet = read_void(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } case sci_undefined: //undefined item only on list variable { bRet = read_undefined(_iDatasetId, _iItemPos, _piAddress, _pInfo); break; } default: { Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), "listvar_in_hdf5"); break; } } return bRet; }
static bool import_data(int* pvCtx, int _iDatasetId, int _iItemPos, int *_piAddress, char *_pstVarname) { bool bRet = false; //get var type int iVarType = getScilabTypeFromDataSet(_iDatasetId); switch (iVarType) { case sci_matrix: { bRet = import_double(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_strings: { bRet = import_string(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_list: case sci_tlist: case sci_mlist: { 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; } case sci_boolean: { bRet = import_boolean(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_poly: { bRet = import_poly(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_ints: { bRet = import_integer(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_sparse: { bRet = import_sparse(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_boolean_sparse: { bRet = import_boolean_sparse(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_void: //void item only on list variable { bRet = import_void(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } case sci_undefined: //undefined item only on list variable { bRet = import_undefined(pvCtx, _iDatasetId, _iItemPos, _piAddress, _pstVarname); break; } default: { Scierror(999, _("%s: Invalid HDF5 Scilab format.\n"), fname.data()); } } return bRet; }
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) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get first item int iItemDataset = 0; iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset); if (iRet || iItemDataset == 0) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get first item type int iItemType = getScilabTypeFromDataSet(iItemDataset); if (iItemType != sci_strings) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get size of first item iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL); if (iRet < 0 || iDims != 2) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } int* piDims = new int[2]; int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims); if (iSize != iItems) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { // if not the good type, do not h5close (deleteListItemReferences) FREE(piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get first item int iItemDataset = 0; iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset); if (iRet || iItemDataset == 0) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get first item type int iItemType = getScilabTypeFromDataSet(iItemDataset); if (iItemType != sci_strings) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get size of first item iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL); if (iRet < 0 || iDims != 2) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } int* piDims = new int[2]; int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims); if (iSize != 3) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { // if not the good type, do not h5close (deleteListItemReferences) FREE(piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL); if (iRet < 0 || iDims != 2) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } piDims = new int[2]; iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims); if (piDims[0] != 1) { deleteListItemReferences(_iDatasetId, piItemRef); delete[] piDims; return false; } int* piDimsArray = new int[piDims[1]]; iRet = readInteger32Matrix(iItemDataset, piDimsArray); if (iRet) { deleteListItemReferences(_iDatasetId, piItemRef); 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) { deleteListItemReferences(_iDatasetId, piItemRef); delete pList; delete pCell; return false; } bool bRet = import_data(pvCtx, iItemDataset, 1, (int*)pList, NULL); if (bRet == false) { deleteListItemReferences(_iDatasetId, piItemRef); 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; }
static bool import_hypermat(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) { // hypermatrix have 3 elements return false; } iRet = getListItemReferences(_iDatasetId, &piItemRef); if (iRet) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get first item int iItemDataset = 0; iRet = getListItemDataset(_iDatasetId, piItemRef, 0, &iItemDataset); if (iRet || iItemDataset == 0) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get first item type int iItemType = getScilabTypeFromDataSet(iItemDataset); if (iItemType != sci_strings) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } // get size of first item iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL); if (iRet < 0 || iDims != 2) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } int* piDims = new int[2]; int iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims); if (iSize != 3) { deleteListItemReferences(_iDatasetId, piItemRef); 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], "hm") != 0) { // if not the good type, do not h5close (deleteListItemReferences) FREE(piItemRef); freeStringMatrix(iItemDataset, pstData); delete[] pstData; return false; } freeStringMatrix(iItemDataset, pstData); delete[] pstData; pstData = NULL; // get second item, the Size of hypermatrix iRet = getListItemDataset(_iDatasetId, piItemRef, 1, &iItemDataset); if (iRet) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } iRet = getDatasetInfo(iItemDataset, &iComplex, &iDims, NULL); if (iRet < 0 || iDims != 2) { deleteListItemReferences(_iDatasetId, piItemRef); return false; } piDims = new int[2]; iSize = getDatasetInfo(iItemDataset, &iComplex, &iDims, piDims); if (piDims[0] != 1) { deleteListItemReferences(_iDatasetId, piItemRef); delete[] piDims; return false; } int* piDimsArray = new int[piDims[1]]; iRet = readInteger32Matrix(iItemDataset, piDimsArray); if (iRet) { deleteListItemReferences(_iDatasetId, piItemRef); delete[] piDims; delete[] piDimsArray; return false; } // get third item, the Data of hypermatrix // import data like a "type" (Double, Int, ...) instead of mlist iRet = getListItemDataset(_iDatasetId, piItemRef, 2, &iItemDataset); bool bRet = import_data(pvCtx, iItemDataset, _iItemPos, _piAddress, _pstVarname); if (bRet == false) { deleteListItemReferences(_iDatasetId, piItemRef); delete[] piDims; delete[] piDimsArray; return false; } // get imported hypermatrix from List or Context types::GenericType* pGT = NULL; types::InternalType* pIT = NULL; if (_piAddress) { types::List* pL = (types::List*)_piAddress; pIT = pL->get(_iItemPos - 1); } else { wchar_t* pwcsName = to_wide_string(_pstVarname); pIT = symbol::Context::getInstance()->getCurrentLevel(symbol::Symbol(pwcsName)); FREE(pwcsName); } // reshape data with size of hypermatrix pGT = pIT->getAs<types::GenericType>(); pGT->reshape(piDimsArray, piDims[1]); delete[] piDims; delete[] piDimsArray; iRet = deleteListItemReferences(_iDatasetId, piItemRef); if (iRet) { return false; } return true; }