int sci_deleteNamedVariable(char *fname, unsigned long fname_len) { SciErr sciErr; int iRet = 0; int* piAddr = NULL; char* pstVarName = NULL; CheckRhs(1, 1); CheckLhs(1, 1); sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if (sciErr.iErr) { printError(&sciErr, 0); return 1; } if (getAllocatedSingleString(pvApiCtx, piAddr, &pstVarName)) { //error return 1; } if (isNamedVarExist(pvApiCtx, pstVarName)) { iRet = deleteNamedVariable(pvApiCtx, pstVarName); } createScalarBoolean(pvApiCtx, Rhs + 1, iRet); AssignOutputVariable(pvApiCtx, 1) = Rhs + 1; return 0; }
int ScilabGateway::exists(char * fname, const int envId, void * pvApiCtx) { SciErr err; int * addr = 0; int * id = 0; int row = 0; int col = 0; bool exists = false; CheckInputArgument(pvApiCtx, 1, 1); CheckOutputArgument(pvApiCtx, 1, 1); ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId); ScilabGatewayOptions & options = env.getGatewayOptions(); OptionsHelper::setCopyOccured(false); ScilabObjects::initialization(env, pvApiCtx); options.setIsNew(false); err = getVarAddressFromPosition(pvApiCtx, 1, &addr); if (err.iErr) { throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data")); } if (!ScilabObjects::isExternalObjOrClass(addr, pvApiCtx)) { throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: An External Object expected."), 1); return 0; } err = getMatrixOfInteger32InList(pvApiCtx, addr, EXTERNAL_OBJ_ID_POSITION, &row, &col, &id); if (err.iErr) { throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data")); } try { exists = env.isvalidobject(*id); } catch (std::exception & e) { throw; } createScalarBoolean(pvApiCtx, 1, exists ? 1 : 0); LhsVar(1) = 1; PutLhsVar(); return 0; }
int ScilabGateway::getsetOptions(char * fname, const int envId, ScilabAbstractOptionsSetter & setter, void * pvApiCtx) { SciErr sciErr; int * addr = 0; int val = 0; CheckInputArgument(pvApiCtx, 0, 1); CheckOutputArgument(pvApiCtx, 1, 1); ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId); ScilabGatewayOptions & options = env.getGatewayOptions(); OptionsHelper::setCopyOccured(false); ScilabObjects::initialization(env, pvApiCtx); options.setIsNew(false); if (Rhs == 0) { createScalarBoolean(pvApiCtx, 1, (int)setter.get()); LhsVar(1) = 1; PutLhsVar(); return 0; } sciErr = getVarAddressFromPosition(pvApiCtx, 1, &addr); if (sciErr.iErr) { throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data")); } if (!isBooleanType(pvApiCtx, addr)) { throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: A boolean expected."), 1); } if (!isScalar(pvApiCtx, addr)) { throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: A single boolean expected."), 1); } getScalarBoolean(pvApiCtx, addr, &val); setter.set(val == 1); LhsVar(1) = 0; PutLhsVar(); return 0; }
/*--------------------------------------------------------------------------*/ int sci_fftwlibraryisloaded(char *fname, void* pvApiCtx) { int iErr; if ( IsLoadedFFTW() ) { iErr = createScalarBoolean(pvApiCtx, nbInputArgument(pvApiCtx) + 1, 1); // true } else { iErr = createScalarBoolean(pvApiCtx, nbInputArgument(pvApiCtx) + 1, 0); // false } if (iErr) { Scierror(999, _("%s: Memory allocation error.\n"), fname); return iErr; } AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; ReturnArguments(pvApiCtx); return 0; }
/*--------------------------------------------------------------------------*/ int sci_win64(char *fname,unsigned long l) { BOOL Status = FALSE; CheckRhs(0,0); CheckLhs(0,1); #ifdef _WIN64 Status = TRUE; #endif if(createScalarBoolean(pvApiCtx, Rhs + 1, Status) != 0) { return 1; } LhsVar(1) = Rhs + 1; PutLhsVar(); return 0; }
/*--------------------------------------------------------------------------*/ int sci_TCL_UnsetVar(char *fname, void* pvApiCtx) { SciErr sciErr; int* piAddrl1 = NULL; int* piAddrl2 = NULL; char* l2 = NULL; static int n1, m1; static int n2, m2; Tcl_Interp *TCLinterpreter = NULL; CheckInputArgument(pvApiCtx, 1, 2); CheckOutputArgument(pvApiCtx, 1, 1); if (checkInputArgumentType(pvApiCtx, 1, sci_strings)) { int paramoutINT = 0; char *VarName = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrl1); if (sciErr.iErr) { printError(&sciErr, 0); return 1; } // Retrieve a matrix of double at position 1. if (getAllocatedSingleString(pvApiCtx, piAddrl1, &VarName)) { Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 1); return 1; } if (!existsGlobalInterp()) { freeAllocatedSingleString(VarName); Scierror(999, _("%s: Error main TCL interpreter not initialized.\n"), fname); return 0; } if (nbInputArgument(pvApiCtx) == 2) { // two arguments given - get a pointer on the slave interpreter if (checkInputArgumentType(pvApiCtx, 2, sci_strings)) { sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrl2); if (sciErr.iErr) { freeAllocatedSingleString(VarName); printError(&sciErr, 0); return 1; } // Retrieve a matrix of double at position 2. if (getAllocatedSingleString(pvApiCtx, piAddrl2, &l2)) { freeAllocatedSingleString(VarName); Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 2); return 1; } TCLinterpreter = Tcl_GetSlave(getTclInterp(), (l2)); freeAllocatedSingleString(l2); releaseTclInterp(); if (TCLinterpreter == NULL) { freeAllocatedSingleString(VarName); Scierror(999, _("%s: No such slave interpreter.\n"), fname); return 0; } } else { freeAllocatedSingleString(VarName); Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 2); return 0; } } else { // only one argument given - use the main interpreter TCLinterpreter = getTclInterp(); } paramoutINT = (int)(Tcl_UnsetVar(TCLinterpreter, VarName, TCL_GLOBAL_ONLY) != TCL_ERROR); freeAllocatedSingleString(VarName); if (createScalarBoolean(pvApiCtx, nbInputArgument(pvApiCtx) + 1, paramoutINT)) { Scierror(999, _("%s: Memory allocation error.\n"), fname); return 1; } AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; ReturnArguments(pvApiCtx); } else { releaseTclInterp(); Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 1); return 0; } releaseTclInterp(); return 0; }
/*--------------------------------------------------------------------------*/ int sci_TCL_SetVar(char *fname, void* pvApiCtx) { SciErr sciErr; int* piAddrl2 = NULL; char* l2 = NULL; int* piAddrl1 = NULL; int* piAddrStr = NULL; char *VarName = NULL; static int n1, m1; static int n2, m2; int paramoutINT = 0; Tcl_Interp *TCLinterpreter = NULL; CheckInputArgument(pvApiCtx, 2, 3); CheckOutputArgument(pvApiCtx, 0, 1); if (getTclInterp() == NULL) { releaseTclInterp(); Scierror(999, _("%s: Error main TCL interpreter not initialized.\n"), fname); return 0; } releaseTclInterp(); if (nbInputArgument(pvApiCtx) == 3) { // three arguments given - get a pointer on the slave interpreter if (checkInputArgumentType(pvApiCtx, 3, sci_strings)) { sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddrl2); if (sciErr.iErr) { printError(&sciErr, 0); return 1; } // Retrieve a matrix of double at position 3. if (getAllocatedSingleString(pvApiCtx, piAddrl2, &l2)) { Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 3); return 1; } TCLinterpreter = Tcl_GetSlave(getTclInterp(), (l2)); freeAllocatedSingleString(l2); if (TCLinterpreter == NULL) { releaseTclInterp(); Scierror(999, _("%s: No such slave interpreter.\n"), fname); return 0; } } else { Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname, 3); return 0; } } else { // only two arguments given - use the main interpreter TCLinterpreter = getTclInterp(); } if (checkInputArgumentType(pvApiCtx, 1, sci_strings) && checkInputArgumentType(pvApiCtx, 2, sci_strings)) { char **Str = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrl1); if (sciErr.iErr) { printError(&sciErr, 0); return 1; } // Retrieve a matrix of double at position 1. if (getAllocatedSingleString(pvApiCtx, piAddrl1, &VarName)) { Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 1); return 1; } sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrStr); if (sciErr.iErr) { printError(&sciErr, 0); return 1; } // Retrieve a matrix of string at position 2. if (getAllocatedMatrixOfString(pvApiCtx, piAddrStr, &m1, &n1, &Str)) { Scierror(202, _("%s: Wrong type for argument #%d: String matrix expected.\n"), fname, 2); return 1; } // Efface valeur precedente Tcl_UnsetVar(TCLinterpreter, VarName, TCL_GLOBAL_ONLY); if ( (m1 == 1) && (n1 == 1) ) { paramoutINT = SetVarAString(TCLinterpreter, VarName, Str); } else { paramoutINT = SetVarStrings(TCLinterpreter, VarName, Str, m1, n1); } freeAllocatedSingleString(VarName); freeAllocatedMatrixOfString(m1, n1, Str); } else if (checkInputArgumentType(pvApiCtx, 1, sci_strings) && checkInputArgumentType(pvApiCtx, 2, sci_matrix)) { #define COMPLEX 1 int *header = NULL; int Cmplx; double* l1 = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddrl1); if (sciErr.iErr) { printError(&sciErr, 0); return 1; } // Retrieve a matrix of double at position 1. if (getAllocatedSingleString(pvApiCtx, piAddrl1, &VarName)) { Scierror(202, _("%s: Wrong type for argument #%d: A string expected.\n"), fname, 1); return 1; } sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddrl1); if (sciErr.iErr) { printError(&sciErr, 0); freeAllocatedSingleString(VarName); return 1; } if (isVarComplex(pvApiCtx, piAddrl1)) { Scierror(999, _("This function doesn't work with Complex.\n")); freeAllocatedSingleString(VarName); releaseTclInterp(); return 0; } // Retrieve a matrix of double at position 2. sciErr = getMatrixOfDouble(pvApiCtx, piAddrl1, &m1, &n1, &l1); if (sciErr.iErr) { printError(&sciErr, 0); Scierror(202, _("%s: Wrong type for argument %d: A real expected.\n"), fname, 2); freeAllocatedSingleString(VarName); return 1; } if ( (m1 == 0) && (n1 == 0) ) { Scierror(999, _("[] doesn't work with Tcl/Tk.\n")); freeAllocatedSingleString(VarName); releaseTclInterp(); return 0; } if ( (m1 == 1) && (n1 == 1) ) { paramoutINT = SetVarScalar(TCLinterpreter, VarName, *l1); } else { paramoutINT = SetVarMatrix(TCLinterpreter, VarName, l1, m1, n1); } freeAllocatedSingleString(VarName); } else { if ((!checkInputArgumentType(pvApiCtx, 1, sci_strings))) { Scierror(999, _("%s: Wrong type for input argument #%d: String expected.\n"), fname , 1); } if ((!checkInputArgumentType(pvApiCtx, 2, sci_matrix))) { Scierror(999, _("%s: Wrong type for input argument #%d: Matrix expected.\n"), fname , 2); } releaseTclInterp(); return 0; } if (createScalarBoolean(pvApiCtx, nbInputArgument(pvApiCtx) + 1, paramoutINT)) { Scierror(999, _("%s: Memory allocation error.\n"), fname); return 1; } releaseTclInterp(); AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; ReturnArguments(pvApiCtx); return 0; }
// ============================================================================= static int sci_csvDefault_two_rhs(char *fname, void* pvApiCtx) { int iErr = 0; int resultSet = 0; char *fieldname = NULL; char *fieldvalue = NULL; int ifieldvalue = 0; fieldname = csv_getArgumentAsString(pvApiCtx, 1, fname, &iErr); if (iErr) { freeVar(&fieldname, &fieldvalue); return 0; } if (strcmp(fieldname, PRECISION_FIELDNAME) == 0) { if (csv_isEmpty(pvApiCtx, 2)) { freeVar(&fieldname, &fieldvalue); Scierror(999, _("%s: Wrong type for input argument #%d: A double expected.\n"), fname, 2); return 0; } if (csv_isDoubleScalar(pvApiCtx, 2)) { #define FORMAT_FIELDVALUESTR "%%.%dlg" ifieldvalue = (int) csv_getArgumentAsScalarDouble(pvApiCtx, 2, fname, &iErr); if (iErr) { freeVar(&fieldname, &fieldvalue); return 0; } if ((ifieldvalue < 1) || (ifieldvalue > 17)) { freeVar(&fieldname, &fieldvalue); Scierror(999, _("%s: Wrong value for input argument #%d: A double (value %d to %d) expected.\n"), fname, 2, 1, 17); return 0; } fieldvalue = (char*)MALLOC(sizeof(char) * ((int)strlen(FORMAT_FIELDVALUESTR) + 1)); if (fieldvalue == NULL) { freeVar(&fieldname, &fieldvalue); Scierror(999, _("%s: Memory allocation error.\n"), fname); return 0; } sprintf(fieldvalue, FORMAT_FIELDVALUESTR, ifieldvalue); } else { fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr); if (iErr) { freeVar(&fieldname, &fieldvalue); return 0; } } } else { fieldvalue = csv_getArgumentAsString(pvApiCtx, 2, fname, &iErr); if (iErr) { freeVar(&fieldname, &fieldvalue); return 0; } } if (strcmp(fieldname, SEPARATOR_FIELDNAME) == 0) { resultSet = setCsvDefaultSeparator(fieldvalue); } else if (strcmp(fieldname, DECIMAL_FIELDNAME) == 0) { resultSet = setCsvDefaultDecimal(fieldvalue); } else if (strcmp(fieldname, CONVERSION_FIELDNAME) == 0) { resultSet = setCsvDefaultConversion(fieldvalue); } else if (strcmp(fieldname, PRECISION_FIELDNAME) == 0) { resultSet = setCsvDefaultPrecision(fieldvalue); } else if (strcmp(fieldname, COMMENTSREGEXP_FIELDNAME) == 0) { resultSet = setCsvDefaultCommentsRegExp(fieldvalue); } else if (strcmp(fieldname, EOL_FIELDNAME) == 0) { if (strcmp(fieldvalue, MACOS9_EOL_STRING) == 0) { resultSet = setCsvDefaultEOL(MACOS9_EOL); } else if (strcmp(fieldvalue, WINDOWS_EOL_STRING) == 0) { resultSet = setCsvDefaultEOL(WINDOWS_EOL); } else if (strcmp(fieldvalue, LINUX_EOL_STRING) == 0) { resultSet = setCsvDefaultEOL(LINUX_EOL); } else { resultSet = 1; } } else if (strcmp(fieldname, ENCODING_FIELDNAME) == 0) { resultSet = setCsvDefaultEncoding(fieldvalue); } else if (strcmp(fieldname, BLANK_FIELDNAME) == 0) { resultSet = setCsvDefaultCsvIgnoreBlankLine(fieldvalue); } else { Scierror(999, _("%s: Wrong value for input argument #%d: '%s', '%s', '%s' , '%s', '%s', '%s', '%s' or '%s' expected.\n"), fname, 1, SEPARATOR_FIELDNAME, DECIMAL_FIELDNAME, CONVERSION_FIELDNAME, PRECISION_FIELDNAME, COMMENTSREGEXP_FIELDNAME, EOL_FIELDNAME, ENCODING_FIELDNAME, BLANK_FIELDNAME); freeVar(&fieldname, &fieldvalue); return 0; } createScalarBoolean(pvApiCtx, Rhs + 1, (resultSet == 0)); freeVar(&fieldname, &fieldvalue); LhsVar(1) = Rhs + 1; PutLhsVar(); return 0; }
/*--------------------------------------------------------------------------*/ int sci_mputl(char *fname, unsigned long fname_len) { SciErr sciErr; int *piAddressVarOne = NULL; int *piAddressVarTwo = NULL; char **pStVarOne = NULL; int *lenStVarOne = NULL; int mOne = 0, nOne = 0; int mnOne = 0; char *filename = NULL; int fileDescriptor = -1; BOOL bCloseFile = FALSE; int i = 0; int mputlErr = MPUTL_ERROR; if (Rhs != 2) { Scierror(999, _("%s: Wrong number of input arguments: %d expected.\n"), fname, 2); return 0; } if (Lhs != 1) { Scierror(999, _("%s: Wrong number of output arguments: %d expected.\n"), fname, 1); return 0; } sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo); if(sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2); return 0; } if ( isDoubleType(pvApiCtx, piAddressVarTwo) ) { double dValue = 0.; if (!isScalar(pvApiCtx, piAddressVarTwo)) { Scierror(999,_("%s: Wrong size for input argument #%d: Integer expected.\n"), fname, 2); return 0; } if ( getScalarDouble(pvApiCtx, piAddressVarTwo, &dValue) == 0) { fileDescriptor = (int)dValue; } else { Scierror(999,_("%s: Memory allocation error.\n"), fname); return 0; } } else if ( isStringType(pvApiCtx, piAddressVarTwo) ) { if (!isScalar(pvApiCtx, piAddressVarTwo)) { Scierror(999,_("%s: Wrong size for input argument #%d: String expected.\n"), fname, 2); return 0; } if (getAllocatedSingleString(pvApiCtx, piAddressVarTwo, &filename) == 0) { #define WRITE_ONLY_TEXT_MODE "wt" int f_swap = 0; double res = 0.0; int ierr = 0; char *expandedFileName = expandPathVariable(filename); C2F(mopen)(&fileDescriptor, expandedFileName, WRITE_ONLY_TEXT_MODE, &f_swap, &res, &ierr); if (expandedFileName) {FREE(expandedFileName); expandedFileName = NULL;} switch (ierr) { case MOPEN_NO_ERROR: bCloseFile = TRUE; break; case MOPEN_NO_MORE_LOGICAL_UNIT: { freeAllocatedSingleString(filename); Scierror(66, _("%s: Too many files opened!\n"), fname); return 0; } break; case MOPEN_CAN_NOT_OPEN_FILE: { Scierror(999, _("%s: Cannot open file %s.\n"), fname, filename); freeAllocatedSingleString(filename); return 0; } break; case MOPEN_NO_MORE_MEMORY: { freeAllocatedSingleString(filename); Scierror(999, _("%s: No more memory.\n"), fname); return 0; } break; case MOPEN_INVALID_FILENAME: { if (filename) { Scierror(999, _("%s: invalid filename %s.\n"), fname, filename); } else { freeAllocatedSingleString(filename); Scierror(999, _("%s: invalid filename.\n"), fname); } return 0; } break; case MOPEN_INVALID_STATUS: default: { freeAllocatedSingleString(filename); Scierror(999, _("%s: invalid status.\n"), fname); return 0; } break; } bCloseFile = TRUE; freeAllocatedSingleString(filename); } else { Scierror(999,_("%s: Memory allocation error.\n"), fname); return 0; } } else { Scierror(999,_("%s: Wrong type for input argument #%d: a String or Integer expected.\n"), fname, 2); } sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne); if(sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1); return 0; } if (!isStringType(pvApiCtx, piAddressVarOne)) { Scierror(999,_("%s: Wrong type for input argument #%d: String expected.\n"), fname, 1); return 0; } sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&mOne, &nOne, NULL, NULL); if(sciErr.iErr) { printError(&sciErr, 0); return 0; } if ( !((mOne == 1) || (nOne == 1)) ) { Scierror(999,_("%s: Wrong size for input argument #%d: A 1-by-n or m-by-1 array expected.\n"), fname, 1); return 0; } mnOne = mOne * nOne; lenStVarOne = (int*)MALLOC(sizeof(int) * mnOne); if (lenStVarOne == NULL) { Scierror(999, _("%s: No more memory.\n"), fname); return 0; } sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne,&mOne, &nOne, lenStVarOne, NULL); if(sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1); return 0; } pStVarOne = (char**) MALLOC(sizeof(char*) * mnOne); if (pStVarOne == NULL) { FREE(lenStVarOne); lenStVarOne = NULL; Scierror(999, _("%s: No more memory.\n"), fname); return 0; } for (i = 0; i < mnOne; i++) { pStVarOne[i] = (char*)MALLOC(sizeof(char) * (lenStVarOne[i] + 1)); if (pStVarOne[i] == NULL) { freeArrayOfString(pStVarOne, i); if (lenStVarOne) {FREE(lenStVarOne); lenStVarOne = NULL;} Scierror(999, _("%s: No more memory.\n"), fname); return 0; } } sciErr = getMatrixOfString(pvApiCtx, piAddressVarOne, &mOne, &nOne, lenStVarOne, pStVarOne); if (lenStVarOne) {FREE(lenStVarOne); lenStVarOne = NULL;} if(sciErr.iErr) { freeArrayOfString(pStVarOne, mnOne); printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1); return 0; } mputlErr = mputl(fileDescriptor, pStVarOne, mnOne); freeArrayOfString(pStVarOne, mnOne); if (bCloseFile) { double dErrClose = 0.; C2F(mclose)(&fileDescriptor, &dErrClose); bCloseFile = FALSE; } switch (mputlErr) { case MPUTL_NO_ERROR: createScalarBoolean(pvApiCtx, Rhs + 1, TRUE); LhsVar(1) = Rhs + 1; PutLhsVar(); break; case MPUTL_INVALID_FILE_DESCRIPTOR: // commented for compatiblity // Scierror(999, _("%s: invalid file descriptor.\n"), fname); // break; case MPUTL_ERROR: case MPUTL_NO_WRITE_RIGHT: default: createScalarBoolean(pvApiCtx, Rhs + 1, FALSE); LhsVar(1) = Rhs + 1; PutLhsVar(); break; } return 0; }
int sci_mpi_send(char *fname, unsigned long fname_len) { SciErr sciErr; int iRet = 0; int *piAddr = NULL; int *piAddr2 = NULL; int *piBuffer = NULL; int iBufferSize = 0; double NodeID = 0; CheckInputArgument(pvApiCtx, 2, 2); CheckOutputArgument(pvApiCtx, 1, 1); sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2); if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 1); return 0; } if (getScalarDouble(pvApiCtx, piAddr2, &NodeID)) { Scierror(999, _("%s: Wrong type for input argument #%d: A scalar integer value expected.\n"), fname, 1); return 0; } sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), fname, 2); return 0; } //convert data from Scilab to MPI iRet = serialize_to_mpi(pvApiCtx, piAddr, &piBuffer, &iBufferSize); if (iRet) { Scierror(999, _("Unable to serialize data\n")); return 0; } //send data iRet = MPI_Send(piBuffer, iBufferSize, MPI_INT, (int)NodeID, TAG, MPI_COMM_WORLD); FREE(piBuffer); if (iRet != MPI_SUCCESS) { char error_string[MPI_MAX_ERROR_STRING]; int length_of_error_string; MPI_Error_string(iRet, error_string, &length_of_error_string); Scierror(999, _("%s: Could not send the variable to the node %d: %s\n"), fname, NodeID, error_string); return 0; } if (createScalarBoolean(pvApiCtx, nbInputArgument(pvApiCtx) + 1, !iRet)) { Scierror(999, _("%s: Memory allocation error.\n"), fname); return 0; } AssignOutputVariable(pvApiCtx, 1) = nbInputArgument(pvApiCtx) + 1; ReturnArguments(pvApiCtx); return 0; }
int sci_addlocalizationdomain(char *fname, void* pvApiCtx) { SciErr sciErr; int* piAddr1 = NULL; char* pstDomain = NULL; int* piAddr2 = NULL; char* pstPath = NULL; char* expandedPath = NULL; char* pstRet = NULL; int iRhs = nbInputArgument(pvApiCtx); int iLhs = nbOutputArgument(pvApiCtx); CheckInputArgument(pvApiCtx, 2, 2); CheckOutputArgument(pvApiCtx, 1, 1); //get domain name sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr1); if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), "addlocalizationdomain", 1); return 0; } if (isStringType(pvApiCtx, piAddr1) == 0 || isScalar(pvApiCtx, piAddr1) == 0) { Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), "addlocalizationdomain", 1); return 0; } if (getAllocatedSingleString(pvApiCtx, piAddr1, &pstDomain)) { Scierror(999, _("%s: Memory allocation error.\n"), "addlocalizationdomain"); return 0; } //get domain path sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddr2); if (sciErr.iErr) { printError(&sciErr, 0); Scierror(999, _("%s: Can not read input argument #%d.\n"), "addlocalizationdomain", 2); return 0; } if (isStringType(pvApiCtx, piAddr2) == 0 || isScalar(pvApiCtx, piAddr2) == 0) { Scierror(999, _("%s: Wrong size for input argument #%d: String expected.\n"), "addlocalizationdomain", 2); return 0; } if (getAllocatedSingleString(pvApiCtx, piAddr2, &pstPath)) { Scierror(999, _("%s: Memory allocation error.\n"), "addlocalizationdomain"); return 0; } expandedPath = expandPathVariable(pstPath); pstRet = bindtextdomain(pstDomain, expandedPath); freeAllocatedSingleString(pstPath); FREE(expandedPath); if (pstRet == NULL) { Scierror(999, _("%s: Unable to add new domain %s.\n"), "addlocalizationdomain", pstDomain); freeAllocatedSingleString(pstDomain); return 0; } bind_textdomain_codeset (pstDomain, "UTF-8"); /*such that gettext and dgettext return UTF8 string*/ if (createScalarBoolean(pvApiCtx, iRhs + 1, 1)) { Scierror(999, _("%s: Unable to add new domain %s.\n"), "addlocalizationdomain", pstDomain); freeAllocatedSingleString(pstDomain); return 0; } freeAllocatedSingleString(pstDomain); AssignOutputVariable(pvApiCtx, 1) = iRhs + 1; ReturnArguments(pvApiCtx); return 0; }