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 <scimatrixint.swg>
|
||||
|
||||
%include <scimatrixchar.swg>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
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