/* ------------------------------------------------------------- * SWIG library containing argc and argv multi-argument typemaps * ------------------------------------------------------------- */ %{ SWIGINTERN int SWIG_AsVal_strings (SwigSciObject iVar, int **array, int report) { int iType = 0; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, iVar, array); if (sciErr.iErr) { if (report) printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, *array, &iType); if (sciErr.iErr) { if (report) printError(&sciErr, 0); return SWIG_ERROR; } if (iType != sci_strings) { /* An empty matrix has type sci_matrix. */ if (!isEmptyMatrix(pvApiCtx, *array)) { return SWIG_TypeError; } *array = SWIG_NULLPTR; } return SWIG_OK; } %} %typemap(in) (int ARGC, char **ARGV) { SciErr sciErr; size_t memsize; int i, rows, cols, res, len, *aLen, *array; res = SWIG_AsVal_strings ($input, &array, 1); if (!SWIG_IsOK(res)) { if (res == SWIG_TypeError) { SWIG_exception_fail(SWIG_TypeError, "not a string matrix"); } SWIG_fail; } if (array == SWIG_NULLPTR) { /* Special case for empty matrix. */ $1 = 0; $2 = ($2_ltype) malloc(sizeof($*2_ltype)); $2[0] = SWIG_NULLPTR; } else { /* first call to retrieve dimensions */ rows = 0; cols = 0; sciErr = getMatrixOfString(pvApiCtx, array, &rows, &cols, SWIG_NULLPTR, SWIG_NULLPTR); if (sciErr.iErr) { printError(&sciErr, 0); SWIG_fail; } len = rows * cols; memsize = sizeof(int) * len; aLen = (int*)malloc(memsize); if (aLen == SWIG_NULLPTR) { SWIG_exception_fail(SWIG_MemoryError, "fail allocate sizes array"); } memset(aLen, 0, memsize); /*second call to retrieve length of each string */ sciErr = getMatrixOfString(pvApiCtx, array, &rows, &cols, aLen, SWIG_NULLPTR); if (sciErr.iErr) { printError(&sciErr, 0); free((void *)aLen); SWIG_fail; } memsize = sizeof($*2_ltype) * (len + 1); $1 = ($1_ltype) len; $2 = ($2_ltype) malloc(memsize); if ($2 == SWIG_NULLPTR) { free((void *)aLen); SWIG_exception_fail(SWIG_MemoryError, "fail allocate array"); } memset($2, 0, memsize); for(i = 0 ; i < len ; i++) { $2[i] = ($*2_ltype)malloc(aLen[i] + 1); if ($2[i] == SWIG_NULLPTR) { free((void *)aLen); SWIG_exception_fail(SWIG_MemoryError, "fail allocate array string element"); } } /* third call to retrieve data */ sciErr = getMatrixOfString(pvApiCtx, array, &rows, &cols, aLen, $2); if(sciErr.iErr) { printError(&sciErr, 0); free((void *)aLen); SWIG_fail; } $2[len] = SWIG_NULLPTR; free((void *)aLen); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { int *array; $1 = SWIG_IsOK(SWIG_AsVal_strings ($input, &array, 0)); } %typemap(freearg) (int ARGC, char **ARGV) { if ($2 != SWIG_NULLPTR) { $1_ltype i; for (i = 0; i < $1; i++) { free((void *)$2[i]); } free((void *)$2); } }