scilab: char* array matrix and vector typemaps

This commit is contained in:
Simon Marchetto 2014-03-12 13:04:12 +01:00
commit 89d4dac99d
3 changed files with 114 additions and 35 deletions

View file

@ -179,67 +179,55 @@ SWIG_SciString_FromCharPtr(void *_pvApiCtx, int _iVarOut, const char *_pchValue)
%fragment("SWIG_SciString_AsCharPtrArrayAndSize", "header") {
SWIGINTERN int
SWIG_SciString_AsCharPtrArrayAndSize(void *_pvApiCtx, int _iVar, char ***_charPtrArray, int* _charPtrArraySize, char *_fname) {
SWIG_SciString_AsCharPtrArrayAndSize(void *_pvApiCtx, int _iVar, int *_iRows, int *_iCols, char ***_charPtrArray, 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);
sciErr = getMatrixOfString(_pvApiCtx, piAddrVar, _iRows, _iCols, NULL, NULL);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
piLength = (int*) malloc(iRows * iCols * sizeof(int));
piLength = (int*) malloc((*_iRows) * (*_iCols) * sizeof(int));
sciErr = getMatrixOfString(_pvApiCtx, piAddrVar, &iRows, &iCols, piLength, NULL);
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 = (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);
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("SWIG_SciString_FromCharPtrArray", "header") {
%fragment("SWIG_SciString_FromCharPtrArrayAndSize", "header") {
SWIGINTERN int
SWIG_SciString_FromCharPtrArray(void *_pvApiCtx, int _iVarOut, char **_charPtrArray, int _charPtrArraySize) {
SWIG_SciString_FromCharPtrArrayAndSize(void *_pvApiCtx, int _iVarOut, int _iRows, int _iCols, char **_charPtrArray) {
SciErr sciErr;
if (_charPtrArray == NULL) {
return SWIG_ERROR;
}
sciErr = createMatrixOfString(_pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + _iVarOut, 1, _charPtrArraySize, _charPtrArray);
sciErr = createMatrixOfString(_pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + _iVarOut, _iRows, _iCols, _charPtrArray);
if (sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;

View file

@ -5,16 +5,103 @@
%include <scichar.swg>
// in (char** vectorIn, int vectorInSize)
// in (char** matrixIn, int matrixInRowCount, int matrixInColCount)
%typemap(in, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char** vectorIn, int vectorInSize)
%typemap(in, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char** matrixIn, int matrixInRowCount, int matrixInColCount)
{
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$1, &$2, fname) != SWIG_OK)
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK)
{
return SWIG_ERROR;
}
}
// in (int matrixInRowCount, int matrixInColCount, char** matrixIn)
%typemap(in, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int matrixInRowCount, int matrixInColCount, char** matrixIn)
{
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK)
{
return SWIG_ERROR;
}
}
// in (char** vectorIn, int vectorInSize)
%typemap(in, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char** vectorIn, int vectorInSize)
{
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, 1, &$2, &$1, fname) != SWIG_OK)
{
return SWIG_ERROR;
}
}
// out (char*** matrixOut, int* matrixOutRowCount, int* matrixOutColCount)
%typemap(in, numinputs=0) (char*** matrixOut, int* matrixOutRowCount, int* matrixOutColCount)
{
}
%typemap(arginit) (char*** matrixOut, int* matrixOutRowCount, int* matrixOutColCount)
{
$1 = (char***) malloc(sizeof(char**));
$2 = (int*) malloc(sizeof(int));
$3 = (int*) malloc(sizeof(int));
}
%typemap(argout, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char*** matrixOut, int* matrixOutRowCount, int* matrixOutColCount)
{
if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK)
{
SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition());
}
else
{
return SWIG_ERROR;
}
}
%typemap(freearg) (char*** matrixOut, int* matrixOutRowCount, int* matrixOutColCount)
{
free(*$1);
free($1);
free($2);
free($3);
}
// out (int* matrixOutRowCount, int* matrixOutColCount, char*** matrixOut)
%typemap(in, numinputs=0) (int* matrixOutRowCount, int* matrixOutColCount, char*** matrixOut)
{
}
%typemap(arginit) (int* matrixOutRowCount, int* matrixOutColCount, char*** matrixOut)
{
$1 = (char***) malloc(sizeof(char**));
$2 = (int*) malloc(sizeof(int));
$3 = (int**) malloc(sizeof(int*));
}
%typemap(argout, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int* matrixOutRowCount, int* matrixOutColCount, char*** matrixOut)
{
if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK)
{
SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition());
}
else
{
return SWIG_ERROR;
}
}
%typemap(freearg) (int* matrixOutRowCount, int* matrixOutColCount, char*** matrixOut)
{
free($1);
free($2);
free(*$3);
free($3);
}
// out (char*** vectorOut, int* vectorOutSize)
%typemap(in, numinputs=0) (char*** vectorOut, int* vectorOutSize)
@ -35,9 +122,9 @@
free($2);
}
%typemap(argout, fragment="SWIG_SciString_FromCharPtrArray") (char*** vectorOut, int* vectorOutSize)
%typemap(argout, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char*** vectorOut, int* vectorOutSize)
{
if (SWIG_SciString_FromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2) == SWIG_OK)
if (SWIG_SciString_FromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK)
{
SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition());
}
@ -51,7 +138,7 @@
%typemap(in, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int vectorInSize, char** vectorIn)
{
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$2, &$1, fname) != SWIG_OK)
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, 1, &$1, &$2, fname) != SWIG_OK)
{
return SWIG_ERROR;
}
@ -69,9 +156,9 @@
$2 = (char***) malloc(sizeof(char**));
}
%typemap(argout, fragment="SWIG_SciString_FromCharPtrArray") (int* vectorOutSize, char*** vectorOut)
%typemap(argout, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int* vectorOutSize, char*** vectorOut)
{
if (SWIG_SciString_FromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$1) == SWIG_OK)
if (SWIG_SciString_FromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK)
{
SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition());
}

View file

@ -36,8 +36,9 @@ SWIG_AsCheck_Sequence_dec(std::string)(SwigSciObject _obj) {
SWIGINTERN int
SWIG_AsGet_Sequence_dec(std::string)(SwigSciObject _obj, char ***_pSequence) {
int iSize;
return (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, _obj, _pSequence, &iSize, SWIG_Scilab_GetFname()));
int iRows = 0;
int iCols = 0;
return (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, _obj, &iRows, &iCols, _pSequence, SWIG_Scilab_GetFname()));
}
}
@ -47,7 +48,10 @@ SWIG_AsGet_Sequence_dec(std::string)(SwigSciObject _obj, char ***_pSequence) {
SWIGINTERN int
SWIG_AsSize_Sequence_dec(std::string)(SwigSciObject _obj, int *_piSize) {
char **pstMatrix;
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, _obj, &pstMatrix, _piSize, SWIG_Scilab_GetFname()) == SWIG_OK) {
int iCols = 0;
int iRows = 0;
if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, _obj, &iRows, &iCols, &pstMatrix, SWIG_Scilab_GetFname()) == SWIG_OK) {
*_piSize = iRows * iCols;
return SWIG_OK;
}
return SWIG_ERROR;
@ -64,11 +68,11 @@ SWIG_FromCreate_Sequence_dec(std::string)(int _size, char ***_sequence) {
}
%fragment(SWIG_FromSet_Sequence_frag(std::string), "header",
fragment="SWIG_SciString_FromCharPtrArray") {
fragment="SWIG_SciString_FromCharPtrArrayAndSize") {
SWIGINTERN SwigSciObject
SWIG_FromSet_Sequence_dec(std::string)(int _size, char **_sequence) {
SwigSciObject obj = SWIG_SciString_FromCharPtrArray(pvApiCtx, SWIG_Scilab_GetOutputPosition(), _sequence, _size);
SwigSciObject obj = SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, _size, _sequence);
delete (char **)_sequence;
return obj;
}