diff --git a/Lib/scilab/matrix.i b/Lib/scilab/matrix.i index d36240cd1..0be93fa50 100644 --- a/Lib/scilab/matrix.i +++ b/Lib/scilab/matrix.i @@ -5,6 +5,6 @@ %include %include - +%include diff --git a/Lib/scilab/scichar.swg b/Lib/scilab/scichar.swg index 4b84c21fd..ec93d4783 100644 --- a/Lib/scilab/scichar.swg +++ b/Lib/scilab/scichar.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; +} +} diff --git a/Lib/scilab/scimatrixchar.swg b/Lib/scilab/scimatrixchar.swg new file mode 100644 index 000000000..0619270fe --- /dev/null +++ b/Lib/scilab/scimatrixchar.swg @@ -0,0 +1,91 @@ +/* + * C-type: char* + * Scilab type: string matrix + */ + +%include + +// 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); +} +