String reading (Scilab gateway) — How to read matrices of strings in a gateway.
Input argument profile:
SciErr getMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piLength, char** _pstStrings)
SciErr getMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piLength, wchar_t** _pwstStrings)
Named variable profile:
SciErr createNamedMatrixOfString(void* _pvCtx, char* _pstName, int _iRows, int _iCols, char** _pstStrings)
SciErr createNamedMatrixOfWideString(void* _pvCtx, char* _pstName, int _iRows, int _iCols, wchar_t** _pwstStrings)
Scilab environment pointer, pass in "pvApiCtx" provided by api_scilab.h.
Address of the Scilab variable.
Name of the variable for "named" functions.
Return number of rows.
Return number of columns.
Address of array of strings length (must be allocated size: _piRows * _piCols)
Address of array of char* (must be allocated size: _piRows * _piCols)
Address of array of wchar_t* (must be allocated size: _piRows * _piCols)
Error structure where is stored errors messages history and first error number.
int read_string(char *fname,unsigned long fname_len) { SciErr sciErr; int i,j; int iLen = 0; //variable info int iRows = 0; int iCols = 0; int* piAddr = NULL; int* piLen = NULL; char** pstData = NULL; //output variable int iRowsOut = 1; int iColsOut = 1; char* pstOut = NULL; //check input and output arguments CheckRhs(1,1); CheckLhs(1,1); //get variable address sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //fisrt call to retrieve dimensions sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } piLen = (int*)malloc(sizeof(int) * iRows * iCols); //second call to retrieve length of each string sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } pstData = (char**)malloc(sizeof(char*) * iRows * iCols); for(i = 0 ; i < iRows * iCols ; i++) { pstData[i] = (char*)malloc(sizeof(char) * (piLen[i] + 1));//+ 1 for null termination } //third call to retrieve data sciErr = getMatrixOfString(pvApiCtx, piAddr, &iRows, &iCols, piLen, pstData); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //computer length of all strings for(i = 0 ; i < iRows * iCols ; i++) { iLen += piLen[i]; } //alloc output variable pstOut = (char*)malloc(sizeof(char) * (iLen + iRows * iCols)); //initialize string to 0x00 memset(pstOut, 0x00, sizeof(char) * (iLen + iRows * iCols)); //concat input strings in output string for(i = 0 ; i < iRows ; i++) { for(j = 0 ; j < iCols ; j++) { int iCurLen = strlen(pstOut); if(iCurLen) { strcat(pstOut, " "); } strcpy(pstOut + strlen(pstOut), pstData[j * iRows + i]); } } //create new variable sciErr = createMatrixOfString(pvApiCtx, Rhs + 1, iRowsOut, iColsOut, &pstOut); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } //free memory free(piLen); for(i = 0 ; i < iRows * iCols ; i++) { free(pstData[i]); } free(pstData); free(pstOut); LhsVar(1) = Rhs + 1; return 0; }