sciunsignedint.swg 6.5 KB

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