scichar.swg 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /*
  2. * C-type: char or char*
  3. * Scilab type: string
  4. */
  5. /*
  6. * CHAR
  7. */
  8. %fragment(SWIG_AsVal_frag(char), "header", fragment="SWIG_SciString_AsChar") {
  9. #define SWIG_AsVal_char(scilabValue, valuePointer) SWIG_SciString_AsChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName())
  10. }
  11. %fragment("SWIG_SciString_AsChar", "header") {
  12. SWIGINTERN int
  13. SWIG_SciString_AsChar(void *pvApiCtx, int iVar, char *pcValue, char *fname) {
  14. SciErr sciErr;
  15. int *piAddrVar = NULL;
  16. char *pstValue = NULL;
  17. int iRet;
  18. sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar);
  19. if (sciErr.iErr) {
  20. printError(&sciErr, 0);
  21. return SWIG_ERROR;
  22. }
  23. if (isStringType(pvApiCtx, piAddrVar) == 0)
  24. {
  25. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar);
  26. return SWIG_TypeError;
  27. }
  28. iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pstValue);
  29. if (iRet) {
  30. return SWIG_ERROR;
  31. }
  32. if (pcValue != NULL) {
  33. *pcValue = pstValue[0];
  34. }
  35. freeAllocatedSingleString(pstValue);
  36. return SWIG_OK;
  37. }
  38. }
  39. %fragment(SWIG_From_frag(char), "header", fragment="SWIG_SciString_FromChar") {
  40. #define SWIG_From_char(value) SWIG_SciString_FromChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value)
  41. }
  42. %fragment("SWIG_SciString_FromChar", "header") {
  43. SWIGINTERN int
  44. SWIG_SciString_FromChar(void *pvApiCtx, int iVarOut, char chValue) {
  45. char *pchValue = (char*)malloc(sizeof(char) * 2);
  46. pchValue[0] = chValue;
  47. pchValue[1] = '\0';
  48. if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pchValue))
  49. return SWIG_ERROR;
  50. free(pchValue);
  51. return SWIG_OK;
  52. }
  53. }
  54. /*
  55. * CHAR *
  56. */
  57. %fragment("SWIG_AsCharArray", "header", fragment = "SWIG_SciString_AsCharPtr") {
  58. #define SWIG_AsCharArray(scilabValue, charPtrPointer, charPtrLength) SWIG_SciString_AsCharPtr(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, SWIG_Scilab_GetFuncName())
  59. }
  60. %fragment("SWIG_SciString_AsCharPtr", "header") {
  61. SWIGINTERN int
  62. SWIG_SciString_AsCharPtr(void *pvApiCtx, int iVar, char *pcValue, int iLength, char *fname) {
  63. SciErr sciErr;
  64. int *piAddrVar = NULL;
  65. char* pcTmpValue = NULL;
  66. int iRet;
  67. sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar);
  68. if (sciErr.iErr) {
  69. printError(&sciErr, 0);
  70. return SWIG_ERROR;
  71. }
  72. iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pcTmpValue);
  73. if (iRet) {
  74. return SWIG_ERROR;
  75. }
  76. if (pcValue != NULL) {
  77. strncpy(pcValue, pcTmpValue, iLength);
  78. }
  79. freeAllocatedSingleString(pcTmpValue);
  80. return SWIG_OK;
  81. }
  82. }
  83. %fragment("SWIG_AsCharPtrAndSize", "header", fragment = "SWIG_SciString_AsCharPtrAndSize") {
  84. #define SWIG_AsCharPtrAndSize(scilabValue, charPtrPointer, charPtrLength, allocMemory) SWIG_SciString_AsCharPtrAndSize(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, allocMemory, SWIG_Scilab_GetFuncName())
  85. }
  86. %fragment("SWIG_SciString_AsCharPtrAndSize", "header") {
  87. SWIGINTERN int
  88. SWIG_SciString_AsCharPtrAndSize(void *pvApiCtx, int iVar, char **pcValue, size_t *piLength, int *alloc, char *fname) {
  89. SciErr sciErr;
  90. int *piAddrVar = NULL;
  91. char *pstString = NULL;
  92. int iRows = 0;
  93. int iCols = 0;
  94. int iLen = 0;
  95. sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar);
  96. if (sciErr.iErr) {
  97. printError(&sciErr, 0);
  98. return SWIG_ERROR;
  99. }
  100. if (isScalar(pvApiCtx, piAddrVar) == 0 || isStringType(pvApiCtx, piAddrVar) == 0)
  101. {
  102. Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar);
  103. return SWIG_TypeError;
  104. }
  105. sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, NULL);
  106. if (sciErr.iErr)
  107. {
  108. printError(&sciErr, 0);
  109. return SWIG_ERROR;
  110. }
  111. pstString = %new_array(iLen + 1, char);
  112. sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, &pstString);
  113. if (sciErr.iErr)
  114. {
  115. printError(&sciErr, 0);
  116. return SWIG_ERROR;
  117. }
  118. // TODO: return SWIG_ERROR if pcValue NULL (now returning SWIG_ERROR fails some typechecks)
  119. if (pcValue) {
  120. *pcValue = pstString;
  121. }
  122. if (alloc != NULL) {
  123. *alloc = SWIG_NEWOBJ;
  124. }
  125. if (piLength != NULL) {
  126. *piLength = strlen(pstString);
  127. }
  128. return SWIG_OK;
  129. }
  130. }
  131. %fragment("SWIG_FromCharPtr", "header", fragment = "SWIG_SciString_FromCharPtr") {
  132. #define SWIG_FromCharPtr(charPtr) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr)
  133. }
  134. %fragment("SWIG_SciString_FromCharPtr", "header") {
  135. SWIGINTERN int
  136. SWIG_SciString_FromCharPtr(void *pvApiCtx, int iVarOut, const char *pchValue) {
  137. if (pchValue) {
  138. SciErr sciErr;
  139. const char* pstStrings[1];
  140. pstStrings[0] = pchValue;
  141. sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 1, 1, pstStrings);
  142. if (sciErr.iErr) {
  143. printError(&sciErr, 0);
  144. return SWIG_ERROR;
  145. }
  146. }
  147. else {
  148. int iRet = createEmptyMatrix(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut);
  149. if (iRet) {
  150. return SWIG_ERROR;
  151. }
  152. }
  153. return SWIG_OK;
  154. }
  155. }
  156. /*
  157. * CHAR * ARRAY
  158. */
  159. %fragment("SWIG_SciString_AsCharPtrArrayAndSize", "header") {
  160. SWIGINTERN int
  161. SWIG_SciString_AsCharPtrArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, char ***charPtrArray, char *fname) {
  162. SciErr sciErr;
  163. int i = 0;
  164. int *piAddrVar = NULL;
  165. int* piLength = NULL;
  166. sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar);
  167. if (sciErr.iErr) {
  168. printError(&sciErr, 0);
  169. return SWIG_ERROR;
  170. }
  171. sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, NULL, NULL);
  172. if (sciErr.iErr) {
  173. printError(&sciErr, 0);
  174. return SWIG_ERROR;
  175. }
  176. piLength = (int*) malloc((*iRows) * (*iCols) * sizeof(int));
  177. sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, NULL);
  178. if (sciErr.iErr) {
  179. printError(&sciErr, 0);
  180. return SWIG_ERROR;
  181. }
  182. *charPtrArray = (char**) malloc((*iRows) * (*iCols) * sizeof(char*));
  183. for(i = 0 ; i < (*iRows) * (*iCols); i++) {
  184. (*charPtrArray)[i] = (char*) malloc(sizeof(char) * (piLength[i] + 1));
  185. }
  186. sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, *charPtrArray);
  187. if (sciErr.iErr) {
  188. printError(&sciErr, 0);
  189. return SWIG_ERROR;
  190. }
  191. free(piLength);
  192. return SWIG_OK;
  193. }
  194. }
  195. %fragment("SWIG_SciString_FromCharPtrArrayAndSize", "header") {
  196. SWIGINTERN int
  197. SWIG_SciString_FromCharPtrArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, char **charPtrArray) {
  198. SciErr sciErr;
  199. sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, (const char* const*) charPtrArray);
  200. if (sciErr.iErr) {
  201. printError(&sciErr, 0);
  202. return SWIG_ERROR;
  203. }
  204. return SWIG_OK;
  205. }
  206. }
  207. %fragment("SWIG_FromCharPtrAndSize", "header", fragment = "SWIG_SciString_FromCharPtr") {
  208. #define SWIG_FromCharPtrAndSize(charPtr, charPtrLength) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr)
  209. }
  210. /*
  211. * Char* Scilab variable
  212. */
  213. %fragment(SWIG_CreateScilabVariable_frag(char), "wrapper") {
  214. SWIGINTERN int
  215. SWIG_CreateScilabVariable_dec(char)(void *pvApiCtx, const char* psVariableName, const char cVariableValue) {
  216. SciErr sciErr;
  217. char sValue[2];
  218. const char* psStrings[1];
  219. sValue[0] = cVariableValue;
  220. sValue[1] = '\0';
  221. psStrings[0] = sValue;
  222. sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings);
  223. if (sciErr.iErr) {
  224. printError(&sciErr, 0);
  225. return SWIG_ERROR;
  226. }
  227. return SWIG_OK;
  228. }
  229. }
  230. %fragment(SWIG_CreateScilabVariable_frag(charptr), "wrapper") {
  231. SWIGINTERN int
  232. SWIG_CreateScilabVariable_dec(charptr)(void *pvApiCtx, const char* psVariableName, const char* psVariableValue) {
  233. SciErr sciErr;
  234. const char* psStrings[1];
  235. psStrings[0] = psVariableValue;
  236. sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings);
  237. if (sciErr.iErr) {
  238. printError(&sciErr, 0);
  239. return SWIG_ERROR;
  240. }
  241. return SWIG_OK;
  242. }
  243. }