String management

How to manage Scilab’s String read and write process using call_scilab and api_scilab

Description

This help describes how strings and matrix of strings can be handle through the `Call Scilab API`_ and api Scilab.

There are several functions which can be used to read / write from the memory of Scilab. These functions are described in dedicated pages.

Note: Access to variables is done through api Scilab (named variable).

Examples

// This example shows how to write a Scilab string in Scilab engine
// It is the equivalent to A="my Message"; in Scilab interpretor
// See: modules/call_scilab/examples/basicExamples/readwritestring.c

// StartScilab
`int`_ row = 1, col = 1; /* Size of the `matrix`_ */
/* Declare the `string`_ */
`char`_ **myMatrixOfString = (char**)malloc(sizeof(char*) * row * col);
myMatrixOfString[0]="my Message";
`char`_ variableName[] = "A";
SciErr sciErr;

/* Write it into Scilab's memory */
sciErr = createNamedMatrixOfString(pvApiCtx, variableName, row, col, myMatrixOfString);
if(sciErr.iErr)
{
    printError(&sciErr, 0);
}

/*
 * Prior to Scilab 5.2
 * C2F(cwritechain)(variableName, &sizeOfMyString  , myString, strlen(variableName), sizeOfMyString);
*/

printf("Display from Scilab of A:\n");
SendScilabJob("disp(A);"); /* Display A */
/* Load the previously `set`_ variable A */
// See: modules/call_scilab/examples/basicExamples/readwritestring.c

`char`_ variableToBeRetrieved[]="A";
`int`_ iRows       = 0;
`int`_ iCols       = 0;
`int`_ i,j;
`int`_* piAddr     = NULL;
`int`_* piLen      = NULL;
`char`_** pstData  = NULL;
SciErr sciErr;

//fisrt call to retrieve dimensions
sciErr = readNamedMatrixOfString(pvApiCtx,variableToBeRetrieved,&iRows, &iCols, NULL, NULL);
if(sciErr.iErr)
{
    printError(&sciErr, 0);
}

piLen = (`int`_*)malloc(sizeof(`int`_) * iRows * iCols);
//second call to retrieve length of each string
sciErr = readNamedMatrixOfString(pvApiCtx,variableToBeRetrieved, &iRows, &iCols, piLen, NULL);
if(sciErr.iErr)
{
    printError(&sciErr, 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 = readNamedMatrixOfString(pvApiCtx, variableToBeRetrieved, &iRows, &iCols, piLen, pstData);
if(sciErr.iErr)
{
    printError(&sciErr, 0);
}

printf("\n");
printf("Load and display of A:\n");
for(j = 0 ; j < iCols ; j++)
{
    for(i = 0 ; i < iRows ; i++)
    {
        /* Display the formated `matrix`_ with same scilab indice */
        printf("[%d,%d] = %s\n",j+1,i+1,pstData[j* iRows + i]);
    }
}

printf("\n");
free(piLen);
for(i = 0 ; i < iRows * iCols ; i++)
    {
        free(pstData[i]);
    }
free(pstData);

See Also

Table Of Contents

This Page