sciint.swg 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * C-type: int
  3. * Scilab type: double or int32
  4. */
  5. %fragment(SWIG_AsVal_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsInt", fragment="<limits.h>") {
  6. %#define SWIG_AsVal_int(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName())
  7. }
  8. %fragment("SWIG_SciDoubleOrInt32_AsInt", "header") {
  9. SWIGINTERN int
  10. SWIG_SciDoubleOrInt32_AsInt(void *pvApiCtx, SwigSciObject iVar, int *piValue, char *fname)
  11. {
  12. SciErr sciErr;
  13. int iType = 0;
  14. int iRows = 0;
  15. int iCols = 0;
  16. int *piAddrVar = NULL;
  17. sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar);
  18. if (sciErr.iErr) {
  19. printError(&sciErr, 0);
  20. return SWIG_ERROR;
  21. }
  22. sciErr = getVarType(pvApiCtx, piAddrVar, &iType);
  23. if (sciErr.iErr) {
  24. printError(&sciErr, 0);
  25. return SWIG_ERROR;
  26. }
  27. if (iType == sci_ints) {
  28. if (piValue) {
  29. int iPrec = 0;
  30. int *piData = NULL;
  31. sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec);
  32. if (sciErr.iErr) {
  33. printError(&sciErr, 0);
  34. return SWIG_ERROR;
  35. }
  36. if (iPrec != SCI_INT32) {
  37. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar);
  38. return SWIG_TypeError;
  39. }
  40. sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData);
  41. if (sciErr.iErr) {
  42. printError(&sciErr, 0);
  43. return SWIG_ERROR;
  44. }
  45. if (iRows * iCols != 1) {
  46. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar);
  47. return SWIG_TypeError;
  48. }
  49. *piValue = *piData;
  50. }
  51. }
  52. else if (iType == sci_matrix) {
  53. if (piValue) {
  54. double *pdData = NULL;
  55. double dValue = 0.0f;
  56. sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData);
  57. if (sciErr.iErr) {
  58. printError(&sciErr, 0);
  59. return SWIG_ERROR;
  60. }
  61. if (iRows * iCols != 1) {
  62. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar);
  63. return SWIG_TypeError;
  64. }
  65. dValue = *pdData;
  66. if (dValue != floor(dValue)) {
  67. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar);
  68. return SWIG_ValueError;
  69. }
  70. if ((dValue < INT_MIN) || (dValue > INT_MAX)) {
  71. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar);
  72. return SWIG_OverflowError;
  73. }
  74. *piValue = (int) dValue;
  75. }
  76. }
  77. else {
  78. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar);
  79. return SWIG_TypeError;
  80. }
  81. return SWIG_OK;
  82. }
  83. }
  84. %fragment(SWIG_From_frag(int), "header", fragment="SWIG_SciDouble_FromInt") {
  85. %#define SWIG_From_int(scilabValue) SWIG_SciDouble_FromInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName())
  86. }
  87. %fragment("SWIG_SciDouble_FromInt", "header") {
  88. SWIGINTERN int
  89. SWIG_SciDouble_FromInt(void *pvApiCtx, int iVarOut, int iValue, char *fname){
  90. if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx)
  91. + iVarOut, (double) iValue))
  92. return SWIG_ERROR;
  93. return SWIG_OK;
  94. }
  95. }
  96. /*
  97. * C-type: int[]
  98. * Scilab type: double or int32 matrix
  99. */
  100. %fragment("SWIG_SciDoubleOrInt32_AsIntArrayAndSize", "header") {
  101. SWIGINTERN int
  102. SWIG_SciDoubleOrInt32_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) {
  103. SciErr sciErr;
  104. int iType = 0;
  105. int *piAddrVar = NULL;
  106. sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar);
  107. if (sciErr.iErr) {
  108. printError(&sciErr, 0);
  109. return SWIG_ERROR;
  110. }
  111. sciErr = getVarType(pvApiCtx, piAddrVar, &iType);
  112. if (sciErr.iErr) {
  113. printError(&sciErr, 0);
  114. return SWIG_ERROR;
  115. }
  116. if (iType == sci_matrix) {
  117. double *pdData = NULL;
  118. int size = 0;
  119. int i;
  120. sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData);
  121. if (sciErr.iErr) {
  122. printError(&sciErr, 0);
  123. return SWIG_ERROR;
  124. }
  125. size = (*iRows) * (*iCols);
  126. *piValue = (int*) malloc(size * sizeof(int*));
  127. for (i = 0; i < size; i++)
  128. (*piValue)[i] = (int) pdData[i];
  129. }
  130. else if (iType == sci_ints) {
  131. int iPrec = 0;
  132. sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec);
  133. if (sciErr.iErr) {
  134. printError(&sciErr, 0);
  135. return SWIG_ERROR;
  136. }
  137. if (iPrec != SCI_INT32) {
  138. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar);
  139. return SWIG_ERROR;
  140. }
  141. sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, iRows, iCols, piValue);
  142. if (sciErr.iErr) {
  143. printError(&sciErr, 0);
  144. return SWIG_ERROR;
  145. }
  146. }
  147. else {
  148. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar);
  149. return SWIG_ERROR;
  150. }
  151. return SWIG_OK;
  152. }
  153. }
  154. %fragment("SWIG_SciDouble_FromIntArrayAndSize", "header") {
  155. SWIGINTERN int
  156. SWIG_SciDouble_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const int *piData) {
  157. SciErr sciErr;
  158. double *pdValues = NULL;
  159. int i;
  160. pdValues = (double*) malloc(iRows * iCols * sizeof(double));
  161. for (i=0; i<iRows * iCols; i++)
  162. pdValues[i] = piData[i];
  163. sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdValues);
  164. if (sciErr.iErr) {
  165. printError(&sciErr, 0);
  166. free(pdValues);
  167. return SWIG_ERROR;
  168. }
  169. free(pdValues);
  170. return SWIG_OK;
  171. }
  172. }
  173. %fragment(SWIG_CreateScilabVariable_frag(int), "wrapper") {
  174. SWIGINTERN int
  175. SWIG_CreateScilabVariable_dec(int)(void *pvApiCtx, const char* psVariableName, const int iVariableValue) {
  176. SciErr sciErr;
  177. sciErr = createNamedMatrixOfInteger32(pvApiCtx, psVariableName, 1, 1, &iVariableValue);
  178. if (sciErr.iErr) {
  179. printError(&sciErr, 0);
  180. return SWIG_ERROR;
  181. }
  182. return SWIG_OK;
  183. }
  184. }