Scilab: add string matrix typemaps

This commit is contained in:
Simon Marchetto 2013-06-19 16:34:12 +02:00
commit e6af8948ef
3 changed files with 166 additions and 1 deletions

View file

@ -5,6 +5,6 @@
%include <scimatrixdouble.swg>
%include <scimatrixint.swg>
%include <scimatrixchar.swg>

View file

@ -175,3 +175,77 @@ SwigScilabStringFromCharPtr(void *_pvApiCtx, int _iVarOut, const char *_pchValue
return Rhs + _iVarOut;
}
}
/*
* CHAR * ARRAY
*/
%fragment("SwigScilabStringToCharPtrArrayAndSize", "header") {
SWIGINTERN int
SwigScilabStringToCharPtrArrayAndSize(void *_pvApiCtx, int _iVar, char ***_charPtrArray, int* _charPtrArraySize, char *_fname) {
SciErr sciErr;
int i = 0;
int *piAddrVar = NULL;
int iRows = 0;
int iCols = 0;
int* piLength = NULL;
if ((_charPtrArray == NULL) || (_charPtrArraySize == NULL)) {
return SWIG_ERROR;
}
sciErr = getVarAddressFromPosition(_pvApiCtx, _iVar, &piAddrVar);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
sciErr = getMatrixOfString(_pvApiCtx, piAddrVar, &iRows, &iCols, NULL, NULL);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
piLength = (int*) malloc(iRows * iCols * sizeof(int));
sciErr = getMatrixOfString(_pvApiCtx, piAddrVar, &iRows, &iCols, piLength, NULL);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
*_charPtrArray = (char**) malloc(iRows * iCols * sizeof(char*));
for(i = 0 ; i < iRows * iCols ; i++)
{
(*_charPtrArray)[i] = (char*) malloc(sizeof(char) * (piLength[i] + 1));
}
sciErr = getMatrixOfString(_pvApiCtx, piAddrVar, &iRows, &iCols, piLength, *_charPtrArray);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
*_charPtrArraySize = iRows * iCols;
free(piLength);
return SWIG_OK;
}
}
%fragment("SwigScilabStringFromCharPtrArray", "header") {
SWIGINTERN int
SwigScilabStringFromCharPtrArray(void *_pvApiCtx, int _iVarOut, char **_charPtrArray, int _charPtrArraySize) {
SciErr sciErr;
if (_charPtrArray == NULL) {
return SWIG_ERROR;
}
sciErr = createMatrixOfString(_pvApiCtx, nbInputArgument(pvApiCtx) + _iVarOut, _charPtrArraySize, 1, _charPtrArray);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
return nbInputArgument(pvApiCtx) + _iVarOut;
}
}

View file

@ -0,0 +1,91 @@
/*
* C-type: char*
* Scilab type: string matrix
*/
%include <scichar.swg>
// in (char** vectorIn, int vectorInSize)
%typemap(in, fragment="SwigScilabStringToCharPtrArrayAndSize") (char** vectorIn, int vectorInSize)
{
if (SwigScilabStringToCharPtrArrayAndSize(pvApiCtx, $input, &$1, &$2, fname) == SWIG_ERROR)
{
return SWIG_ERROR;
}
}
// out (char*** vectorOut, int* vectorOutSize)
%typemap(in, numinputs=0) (char*** vectorOut, int* vectorOutSize)
{
}
%typemap(arginit) (char*** vectorOut, int* vectorOutSize)
{
$1 = (char***) malloc(sizeof(char**));
$2 = (int*) malloc(sizeof(int));
}
%typemap(freearg) (char*** vectorOut, int* vectorOutSize)
{
free(*(*$1));
free(*$1);
free($1);
free($2);
}
%typemap(argout, fragment="SwigScilabStringFromCharPtrArray") (char*** vectorOut, int* vectorOutSize)
{
if (SwigScilabStringFromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2) != SWIG_ERROR)
{
AssignOutputVariable(pvApiCtx, outputPosition) = nbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition();
}
else
{
return SWIG_ERROR;
}
}
// in (int vectorInSize, char** vectorIn)
%typemap(in, fragment="SwigScilabStringToCharPtrArrayAndSize") (int vectorInSize, char** vectorIn)
{
if (SwigScilabStringToCharPtrArrayAndSize(pvApiCtx, $input, &$2, &$1, fname) == SWIG_ERROR)
{
return SWIG_ERROR;
}
}
// out (int* vectorOutSize, char*** vectorOut)
%typemap(in, numinputs=0) (int* vectorOutSize, char*** vectorOut)
{
}
%typemap(arginit) (int* vectorOutSize, char*** vectorOut)
{
$1 = (int*) malloc(sizeof(int));
$2 = (char***) malloc(sizeof(char**));
}
%typemap(argout, fragment="SwigScilabStringFromCharPtrArray") (int* vectorOutSize, char*** vectorOut)
{
if (SwigScilabStringFromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$1) != SWIG_ERROR)
{
AssignOutputVariable(pvApiCtx, outputPosition) = nbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition();
}
else
{
return SWIG_ERROR;
}
}
%typemap(freearg) (int* vectorOutSize, char*** vectorOut)
{
free($1);
free(*(*$2));
free(*$2);
free($2);
}