scishort.swg 5.8 KB

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