Scilab: add string matrix typemaps
This commit is contained in:
parent
9b270b9f6a
commit
e6af8948ef
3 changed files with 166 additions and 1 deletions
|
|
@ -5,6 +5,6 @@
|
||||||
|
|
||||||
%include <scimatrixdouble.swg>
|
%include <scimatrixdouble.swg>
|
||||||
%include <scimatrixint.swg>
|
%include <scimatrixint.swg>
|
||||||
|
%include <scimatrixchar.swg>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -175,3 +175,77 @@ SwigScilabStringFromCharPtr(void *_pvApiCtx, int _iVarOut, const char *_pchValue
|
||||||
return Rhs + _iVarOut;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
91
Lib/scilab/scimatrixchar.swg
Normal file
91
Lib/scilab/scimatrixchar.swg
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue