2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution. The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
13 #include "ScilabObjects.hxx"
20 extern int C2F(varfunptr)(int *, int *, int *);
23 namespace org_modules_external_objects
25 bool ScilabObjects::isInit = false;
26 const char * ScilabObjects::_EOBJ[] = {"_EObj", "_EnvId", "_id"};
27 const char * ScilabObjects::_ECLASS[] = {"_EClass", "_EnvId", "_id"};
28 const char * ScilabObjects::_EVOID[] = {"_EVoid", "_EnvId", "_id"};
29 const char * ScilabObjects::_INVOKE_ = "!!_invoke_";
31 void ScilabObjects::initialization(ScilabAbstractEnvironment & env, void * pvApiCtx)
39 int ScilabObjects::createNamedEnvironmentObject(int type, const char * name, int id, const int envId, void * pvApiCtx)
47 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid environment"));
53 fields = static_cast<const char **>(_EOBJ);
56 fields = static_cast<const char **>(_ECLASS);
59 fields = static_cast<const char **>(_EVOID);
62 fields = static_cast<const char **>(_EOBJ);
66 err = createNamedMList(pvApiCtx, name, FIELDS_LENGTH, &mlistaddr);
69 if (err.iErr == API_ERROR_INVALID_NAME)
71 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable name: %s"), name);
74 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
77 err = createMatrixOfStringInNamedList(pvApiCtx, name, mlistaddr, 1, 1, FIELDS_LENGTH, fields);
80 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
83 err = createMatrixOfInteger32InNamedList(pvApiCtx, name, mlistaddr, EXTERNAL_ENV_ID_POSITION, 1, 1, &envId);
86 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
89 err = createMatrixOfInteger32InNamedList(pvApiCtx, name, mlistaddr, EXTERNAL_OBJ_ID_POSITION, 1, 1, &id);
92 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
98 void ScilabObjects::createEnvironmentObjectAtPos(int type, int pos, int id, const int envId, void * pvApiCtx)
100 const char ** fields = 0;
106 throw ScilabAbstractEnvironmentException("Invalid environment");
111 case EXTERNAL_OBJECT:
112 fields = static_cast<const char **>(_EOBJ);
115 fields = static_cast<const char **>(_ECLASS);
118 fields = static_cast<const char **>(_EVOID);
121 fields = static_cast<const char **>(_EOBJ);
125 err = createMList(pvApiCtx, pos, FIELDS_LENGTH, &mlistaddr);
128 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
131 err = createMatrixOfStringInList(pvApiCtx, pos, mlistaddr, 1, 1, FIELDS_LENGTH, fields);
134 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
137 err = createMatrixOfInteger32InList(pvApiCtx, pos, mlistaddr, EXTERNAL_ENV_ID_POSITION, 1, 1, &envId);
140 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
143 err = createMatrixOfInteger32InList(pvApiCtx, pos, mlistaddr, EXTERNAL_OBJ_ID_POSITION, 1, 1, &id);
146 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot allocate memory"));
150 void ScilabObjects::copyInvocationMacroToStack(int pos, ScilabAbstractEnvironment & env, void * pvApiCtx)
152 static bool init = false;
154 static int interf = 0;
155 static int funnumber = 0;
160 C2F(str2name)(const_cast<char *>(_INVOKE_), id, strlen(_INVOKE_));
162 int funs = C2F(com).fun;
166 interf = C2F(com).fun;
172 // Remove 1 since varfunptr will increment Top
173 Top = Top - Rhs + pos - 1;
175 // Create a function pointer variable
176 C2F(varfunptr)(id, &interf, &funnumber);
177 C2F(intersci).ntypes[pos - 1] = '$';
181 OptionsHelper::setCopyOccurred(true);
184 void ScilabObjects::removeTemporaryVars(const int envId, int * tmpvar)
186 if (tmpvar && *tmpvar)
188 ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
189 env.removeobject(tmpvar + 1, *tmpvar);
194 void ScilabObjects::removeVar(int * addr, void * pvApiCtx)
197 int type, row, col, * id;
199 err = getVarType(pvApiCtx, addr, &type);
202 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
205 if (type == sci_mlist && (isExternalObjOrClass(addr, pvApiCtx)))
207 err = getMatrixOfInteger32InList(pvApiCtx, addr, EXTERNAL_OBJ_ID_POSITION, &row, &col, &id);
210 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
213 int envId = getEnvironmentId(addr, pvApiCtx);
214 ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
216 env.removeobject(*id);
218 else if (type == sci_strings)
221 if (getAllocatedSingleString(pvApiCtx, addr, &varName))
223 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
226 err = getVarAddressFromName(pvApiCtx, varName, &addr);
229 freeAllocatedSingleString(varName);
233 err = getVarType(pvApiCtx, addr, &type);
236 freeAllocatedSingleString(varName);
237 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
240 if (type == sci_mlist && isExternalObjOrClass(addr, pvApiCtx))
242 err = getMatrixOfInteger32InList(pvApiCtx, addr, EXTERNAL_OBJ_ID_POSITION, &row, &col, &id);
245 freeAllocatedSingleString(varName);
246 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
249 int envId = getEnvironmentId(addr, pvApiCtx);
250 ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
252 env.removeobject(*id);
253 deleteNamedVariable(pvApiCtx, varName);
254 freeAllocatedSingleString(varName);
259 bool ScilabObjects::unwrap(int idObj, int pos, const int envId, void * pvApiCtx)
263 // id == 0 <==> null object plugged on empty matrix
264 if (createEmptyMatrix(pvApiCtx, pos))
266 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot create data"));
271 VariableType type = Nothing;
272 ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
273 const ScilabAbstractEnvironmentWrapper & wrapper = env.getWrapper();
275 type = env.isunwrappable(idObj);
281 if (createEmptyMatrix(pvApiCtx, pos))
283 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot create data"));
287 wrapper.unwrapdouble(idObj, ScilabDoubleStackAllocator(pvApiCtx, pos));
290 wrapper.unwraprowdouble(idObj, ScilabDoubleStackAllocator(pvApiCtx, pos));
293 wrapper.unwrapmatdouble(idObj, ScilabDoubleStackAllocator(pvApiCtx, pos));
296 wrapper.unwrapstring(idObj, ScilabStringStackAllocator(pvApiCtx, pos));
299 wrapper.unwraprowstring(idObj, ScilabStringStackAllocator(pvApiCtx, pos));
302 wrapper.unwrapmatstring(idObj, ScilabStringStackAllocator(pvApiCtx, pos));
305 wrapper.unwrapboolean(idObj, ScilabBooleanStackAllocator(pvApiCtx, pos));
308 wrapper.unwraprowboolean(idObj, ScilabBooleanStackAllocator(pvApiCtx, pos));
311 wrapper.unwrapmatboolean(idObj, ScilabBooleanStackAllocator(pvApiCtx, pos));
314 wrapper.unwrapchar(idObj, ScilabCharStackAllocator(pvApiCtx, pos));
317 wrapper.unwraprowchar(idObj, ScilabCharStackAllocator(pvApiCtx, pos));
320 wrapper.unwrapmatchar(idObj, ScilabCharStackAllocator(pvApiCtx, pos));
323 wrapper.unwrapuchar(idObj, ScilabUCharStackAllocator(pvApiCtx, pos));
326 wrapper.unwraprowuchar(idObj, ScilabUCharStackAllocator(pvApiCtx, pos));
329 wrapper.unwrapmatuchar(idObj, ScilabUCharStackAllocator(pvApiCtx, pos));
332 wrapper.unwrapshort(idObj, ScilabShortStackAllocator(pvApiCtx, pos));
335 wrapper.unwraprowshort(idObj, ScilabShortStackAllocator(pvApiCtx, pos));
338 wrapper.unwrapmatshort(idObj, ScilabShortStackAllocator(pvApiCtx, pos));
341 wrapper.unwrapushort(idObj, ScilabUShortStackAllocator(pvApiCtx, pos));
344 wrapper.unwraprowushort(idObj, ScilabUShortStackAllocator(pvApiCtx, pos));
347 wrapper.unwrapmatushort(idObj, ScilabUShortStackAllocator(pvApiCtx, pos));
350 wrapper.unwrapint(idObj, ScilabIntStackAllocator(pvApiCtx, pos));
353 wrapper.unwraprowint(idObj, ScilabIntStackAllocator(pvApiCtx, pos));
356 wrapper.unwrapmatint(idObj, ScilabIntStackAllocator(pvApiCtx, pos));
359 wrapper.unwrapuint(idObj, ScilabUIntStackAllocator(pvApiCtx, pos));
362 wrapper.unwraprowuint(idObj, ScilabUIntStackAllocator(pvApiCtx, pos));
365 wrapper.unwrapmatuint(idObj, ScilabUIntStackAllocator(pvApiCtx, pos));
368 wrapper.unwraplong(idObj, ScilabLongStackAllocator(pvApiCtx, pos));
371 wrapper.unwraprowlong(idObj, ScilabLongStackAllocator(pvApiCtx, pos));
374 wrapper.unwrapmatlong(idObj, ScilabLongStackAllocator(pvApiCtx, pos));
377 wrapper.unwrapulong(idObj, ScilabULongStackAllocator(pvApiCtx, pos));
380 wrapper.unwraprowulong(idObj, ScilabULongStackAllocator(pvApiCtx, pos));
383 wrapper.unwrapmatulong(idObj, ScilabULongStackAllocator(pvApiCtx, pos));
386 wrapper.unwrapfloat(idObj, ScilabFloatStackAllocator(pvApiCtx, pos));
389 wrapper.unwraprowfloat(idObj, ScilabFloatStackAllocator(pvApiCtx, pos));
392 wrapper.unwrapmatfloat(idObj, ScilabFloatStackAllocator(pvApiCtx, pos));
395 wrapper.unwrapcomplex(idObj, ScilabComplexStackAllocator(pvApiCtx, pos));
398 wrapper.unwraprowcomplex(idObj, ScilabComplexStackAllocator(pvApiCtx, pos));
401 wrapper.unwrapmatcomplex(idObj, ScilabComplexStackAllocator(pvApiCtx, pos));
410 int ScilabObjects::getEnvironmentId(int * addr, void * pvApiCtx)
413 int row = 0, col = 0;
416 err = getMatrixOfInteger32InList(pvApiCtx, addr, EXTERNAL_ENV_ID_POSITION, &row, &col, &envId);
419 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
425 int ScilabObjects::getExternalId(int * addr, void * pvApiCtx)
428 int row = 0, col = 0;
431 err = getMatrixOfInteger32InList(pvApiCtx, addr, EXTERNAL_OBJ_ID_POSITION, &row, &col, &id);
434 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
440 int ScilabObjects::getArgumentId(int * addr, int * tmpvars, const bool isRef, const bool isClass, const int envId, void * pvApiCtx)
443 int typ, row = 0, col = 0, returnId;
444 const ScilabAbstractEnvironmentWrapper & wrapper = ScilabEnvironments::getEnvironment(envId).getWrapper();
446 err = getVarType(pvApiCtx, addr, &typ);
449 removeTemporaryVars(envId, tmpvars);
450 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
453 if (isClass && typ != sci_mlist)
455 removeTemporaryVars(envId, tmpvars);
456 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("External Class expected"));
465 if (isVarComplex(pvApiCtx, addr))
468 err = getComplexMatrixOfDouble(pvApiCtx, addr, &row, &col, &mat, &imag);
471 removeTemporaryVars(envId, tmpvars);
472 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
475 returnId = wrap(row, col, mat, imag, wrapper, isRef);
479 err = getMatrixOfDouble(pvApiCtx, addr, &row, &col, &mat);
482 removeTemporaryVars(envId, tmpvars);
483 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
486 returnId = wrap<double>(row, col, mat, wrapper, isRef);
489 tmpvars[++tmpvars[0]] = returnId;
495 /* '$+1' should be handled to ease insertion/extraction */
499 err = getPolyVariableName(pvApiCtx, addr, name, &nameLen);
502 removeTemporaryVars(envId, tmpvars);
503 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
506 if (name[0] == '$' && nameLen == 1)
508 err = getMatrixOfPoly(pvApiCtx, addr, &row, &col, NULL, NULL);
511 removeTemporaryVars(envId, tmpvars);
512 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
517 removeTemporaryVars(envId, tmpvars);
518 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
522 err = getMatrixOfPoly(pvApiCtx, addr, &row, &col, &coefs, NULL);
525 removeTemporaryVars(envId, tmpvars);
526 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
529 // should be std::dynarray
530 std::vector<double> mat = std::vector<double>(row * col * coefs);
531 double* pMat = mat.data();
532 err = getMatrixOfPoly(pvApiCtx, addr, &row, &col, &coefs, &pMat);
535 removeTemporaryVars(envId, tmpvars);
536 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
539 returnId = wrapper.wrapPoly(row * col * coefs, mat.data());
543 removeTemporaryVars(envId, tmpvars);
544 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
553 err = getMatrixOfIntegerPrecision(pvApiCtx, addr, &prec);
556 removeTemporaryVars(envId, tmpvars);
557 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
563 err = getMatrixOfInteger8(pvApiCtx, addr, &row, &col, (char**)(&ints));
566 removeTemporaryVars(envId, tmpvars);
567 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
570 returnId = wrap<char>(row, col, static_cast<char *>(ints), wrapper, isRef);
571 tmpvars[++tmpvars[0]] = returnId;
574 err = getMatrixOfUnsignedInteger8(pvApiCtx, addr, &row, &col, (unsigned char**)(&ints));
577 removeTemporaryVars(envId, tmpvars);
578 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
581 returnId = wrap<unsigned char>(row, col, static_cast<unsigned char *>(ints), wrapper, isRef);
582 tmpvars[++tmpvars[0]] = returnId;
585 err = getMatrixOfInteger16(pvApiCtx, addr, &row, &col, (short**)(&ints));
588 removeTemporaryVars(envId, tmpvars);
589 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
592 returnId = wrap<short>(row, col, static_cast<short *>(ints), wrapper, isRef);
593 tmpvars[++tmpvars[0]] = returnId;
596 err = getMatrixOfUnsignedInteger16(pvApiCtx, addr, &row, &col, (unsigned short**)(&ints));
599 removeTemporaryVars(envId, tmpvars);
600 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
603 returnId = wrap<unsigned short>(row, col, static_cast<unsigned short *>(ints), wrapper, isRef);
604 tmpvars[++tmpvars[0]] = returnId;
607 err = getMatrixOfInteger32(pvApiCtx, addr, &row, &col, (int**)(&ints));
610 removeTemporaryVars(envId, tmpvars);
611 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
614 returnId = wrap<int>(row, col, static_cast<int *>(ints), wrapper, isRef);
615 tmpvars[++tmpvars[0]] = returnId;
618 err = getMatrixOfUnsignedInteger32(pvApiCtx, addr, &row, &col, (unsigned int**)(&ints));
621 removeTemporaryVars(envId, tmpvars);
622 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
625 returnId = wrap<unsigned int>(row, col, static_cast<unsigned int *>(ints), wrapper, isRef);
626 tmpvars[++tmpvars[0]] = returnId;
629 #ifdef __SCILAB_INT64__
631 err = getMatrixOfInteger64(pvApiCtx, addr, &row, &col, (long long**)(&ints));
634 removeTemporaryVars(envId, tmpvars);
635 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
638 returnId = wrap<long long>(row, col, static_cast<long long *>(ints), wrapper, isRef);
639 tmpvars[++tmpvars[0]] = returnId;
642 err = getMatrixOfUnsignedInteger64(pvApiCtx, addr, &row, &col, (unsigned long long**)(&ints));
645 removeTemporaryVars(envId, tmpvars);
646 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
649 returnId = wrap<unsigned long long>(row, col, static_cast<unsigned long long *>(ints), wrapper, isRef);
650 tmpvars[++tmpvars[0]] = returnId;
655 // invalid int code : should never be called
656 removeTemporaryVars(envId, tmpvars);
657 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
662 if (getAllocatedMatrixOfString(pvApiCtx, addr, &row, &col, &matS))
664 removeTemporaryVars(envId, tmpvars);
665 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
668 returnId = wrap<char *>(row, col, matS, wrapper, isRef);
669 freeAllocatedMatrixOfString(row, col, matS);
670 tmpvars[++tmpvars[0]] = returnId;
678 err = getMatrixOfBoolean(pvApiCtx, addr, &row, &col, &matB);
681 removeTemporaryVars(envId, tmpvars);
682 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
685 returnId = wrapBool(row, col, matB, wrapper, isRef);
686 tmpvars[++tmpvars[0]] = returnId;
694 err = getListItemNumber(pvApiCtx, addr, &length);
697 removeTemporaryVars(envId, tmpvars);
698 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
707 // should be std::dynarray
708 std::vector<int> childrenIds = std::vector<int>(length + 1);
710 // loop all over the items
711 for (int i = 0; i < length; i++)
715 err = getListItemAddress(pvApiCtx, addr, i + 1, &pvItem);
718 removeTemporaryVars(envId, childrenIds.data());
719 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
722 getArgumentId(pvItem, childrenIds.data(), false, false, envId, pvApiCtx);
725 returnId = wrapper.wrapList(length, childrenIds.data());
726 tmpvars[++tmpvars[0]] = returnId;
733 int type = getMListType(addr, pvApiCtx);
734 int eId = getEnvironmentId(addr, pvApiCtx);
736 if (type == EXTERNAL_INVALID)
738 removeTemporaryVars(envId, tmpvars);
739 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("External object expected"));
742 err = getMatrixOfInteger32InList(pvApiCtx, addr, EXTERNAL_OBJ_ID_POSITION, &row, &col, &id);
745 removeTemporaryVars(envId, tmpvars);
746 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
749 if (eId != envId && id != 0)
751 removeTemporaryVars(envId, tmpvars);
752 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Incompatible External object"));
757 if (type == EXTERNAL_CLASS)
763 removeTemporaryVars(envId, tmpvars);
764 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("External Class expected"));
768 if (type == EXTERNAL_OBJECT || type == EXTERNAL_CLASS)
772 else if (type == EXTERNAL_VOID)
781 removeTemporaryVars(envId, tmpvars);
782 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Unable to wrap. Unmanaged datatype (%d) ?"), typ);
789 int ScilabObjects::getMListType(int * mlist, void * pvApiCtx)
791 char * mlist_type[3];
797 // OK it's crappy... but it works and it is performant...
801 return EXTERNAL_VOID;
804 if (mlist[0] != sci_mlist || mlist[1] != 3)
806 return EXTERNAL_INVALID;
809 if (mlist[6] != sci_strings || mlist[7] != 1 || mlist[8] != 3)
811 // first field is not a matrix 1x3 of strings
812 return EXTERNAL_INVALID;
815 if (mlist[11] - 1 == strlen("_EClass") && mlist[14] == 36 && mlist[15] == -14 && mlist[16] == -12 && mlist[17] == 21 && mlist[18] == 10 && mlist[19] == 28 && mlist[20] == 28)
817 return EXTERNAL_CLASS;
820 if (mlist[11] - 1 == strlen("_EObj") && mlist[14] == 36 && mlist[15] == -14 && mlist[16] == -24 && mlist[17] == 11 && mlist[18] == 19)
822 return EXTERNAL_OBJECT;
825 if (mlist[11] - 1 == strlen("_EVoid") && mlist[14] == 36 && mlist[15] == -14 && mlist[16] == -31 && mlist[17] == 24 && mlist[18] == 18 && mlist[19] == 13)
827 return EXTERNAL_VOID;
830 return EXTERNAL_INVALID;
833 bool ScilabObjects::isValidExternal(int * mlist, void * pvApiCtx)
835 int type = getMListType(mlist, pvApiCtx);
836 return type == EXTERNAL_OBJECT || type == EXTERNAL_CLASS;
839 bool ScilabObjects::isExternalObj(int * mlist, void * pvApiCtx)
841 return getMListType(mlist, pvApiCtx) == EXTERNAL_OBJECT;
844 bool ScilabObjects::isExternalClass(int * mlist, void * pvApiCtx)
846 return getMListType(mlist, pvApiCtx) == EXTERNAL_CLASS;
849 bool ScilabObjects::isExternalObjOrClass(int * mlist, void * pvApiCtx)
851 int type = getMListType(mlist, pvApiCtx);
852 return type == EXTERNAL_OBJECT || type == EXTERNAL_CLASS;
855 bool ScilabObjects::isExternalVoid(int * mlist, void * pvApiCtx)
857 return getMListType(mlist, pvApiCtx) == EXTERNAL_VOID;
860 char * ScilabObjects::getSingleString(int pos, void * pvApiCtx)
866 err = getVarAddressFromPosition(pvApiCtx, pos, &addr);
869 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid String"));
872 if (!isStringType(pvApiCtx, addr))
874 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("A single string expected"));
877 if (!isScalar(pvApiCtx, addr))
879 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("A single String expected"));
882 if (getAllocatedSingleString(pvApiCtx, addr, &str))
884 throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid String"));
890 int ScilabObjects::isPositiveIntegerAtAddress(int * addr, void * pvApiCtx)
893 int typ = 0, row, col, prec;
895 err = getVarDimension(pvApiCtx, addr, &row, &col);
901 if (row != 1 || col != 1)
906 err = getVarType(pvApiCtx, addr, &typ);
914 err = getMatrixOfIntegerPrecision(pvApiCtx, addr, &prec);
924 err = getMatrixOfInteger8(pvApiCtx, addr, &row, &col, &cvalue);
929 return (int)(*cvalue);
934 unsigned char * ucvalue = 0;
935 err = getMatrixOfUnsignedInteger8(pvApiCtx, addr, &row, &col, &ucvalue);
940 return (int)(*ucvalue);
946 err = getMatrixOfInteger16(pvApiCtx, addr, &row, &col, &svalue);
951 return (int)(*svalue);
956 unsigned short * usvalue = 0;
957 err = getMatrixOfUnsignedInteger16(pvApiCtx, addr, &row, &col, &usvalue);
962 return (int)(*usvalue);
968 err = getMatrixOfInteger32(pvApiCtx, addr, &row, &col, &ivalue);
973 return (int)(*ivalue);
978 unsigned int * uivalue = 0;
979 err = getMatrixOfUnsignedInteger32(pvApiCtx, addr, &row, &col, &uivalue);
984 return (int)(*uivalue);
987 #ifdef __SCILAB_INT64__
990 long long * llvalue = 0;
991 err = getMatrixOfInteger64(pvApiCtx, addr, &row, &col, &llvalue);
996 return (int)(*llvalue);
1001 unsigned long long * ullvalue = 0;
1002 err = getMatrixOfUnsignedInteger64(pvApiCtx, addr, &row, &col, &ullvalue);
1007 return (int)(*ullvalue);
1015 else if (typ == sci_matrix)
1017 double * dvalue = 0;
1019 if (isVarComplex(pvApiCtx, addr))
1024 err = getMatrixOfDouble(pvApiCtx, addr, &row, &col, &dvalue);
1030 if (*dvalue - (double)(int)(*dvalue) == 0.0)
1032 return (int)(*dvalue);