2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
4 * Copyright (C) 2009-2011 - DIGITEO - Allan CORNET
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution. The terms
9 * are also available at
10 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12 * Please note that piece of code will be rewrited for the Scilab 6 family
13 * However, the API (profile of the functions in the header files) will be
14 * still available and supported in Scilab 6.
17 /*--------------------------------------------------------------------------*/
18 #include "gatewaystruct.hxx"
21 #include "context.hxx"
28 #include "charEncoding.h"
29 #include "sci_malloc.h"
30 #include "api_scilab.h"
31 #include "api_internal_common.h"
32 #include "call_scilab.h"
33 #include "localization.h"
34 #include "sci_malloc.h"
35 #include "freeArrayOfString.h"
36 #include "os_string.h"
39 using namespace types;
40 /*--------------------------------------------------------------------------*/
42 /*******************************/
43 /* string matrix functions */
44 /*******************************/
46 SciErr getMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piLength, char** _pstStrings)
48 SciErr sciErr = sciErrInit();
53 if (_piAddress == NULL)
55 addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getMatrixOfString");
59 sciErr = getVarType(_pvCtx, _piAddress, &iType);
62 addErrorMessage(&sciErr, API_ERROR_GET_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfString", getRhsFromAddress(_pvCtx, _piAddress));
66 if (iType != sci_strings)
68 addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s expected"), "getMatrixOfString", _("string matrix"));
72 sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols);
75 addErrorMessage(&sciErr, API_ERROR_GET_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfString", getRhsFromAddress(_pvCtx, _piAddress));
79 if (_piLength == NULL)
84 String *pS = ((InternalType*)_piAddress)->getAs<types::String>();
86 //non cummulative length
87 int iSize = pS->getSize();
88 if (_pstStrings == NULL || *_pstStrings == NULL)
90 for (int i = 0 ; i < iSize; i++)
92 char* pstTemp = wide_string_to_UTF8(pS->get(i));
93 _piLength[i] = (int)strlen(pstTemp);
99 for (int i = 0 ; i < iSize; i++)
101 if (_pstStrings[i] == NULL)
103 addErrorMessage(&sciErr, API_ERROR_INVALID_SUBSTRING_POINTER, _("%s: Invalid argument address"), "getMatrixOfString");
107 char* c = wide_string_to_UTF8(pS->get(i));
108 strcpy(_pstStrings[i], c);
115 /*--------------------------------------------------------------------------*/
116 SciErr createMatrixOfString(void* _pvCtx, int _iVar, int _iRows, int _iCols, const char* const * _pstStrings)
118 SciErr sciErr = sciErrInit();
120 int rhs = _iVar - *getNbInputArgument(_pvCtx);
121 GatewayStruct* pStr = (GatewayStruct*)_pvCtx;
122 InternalType** out = pStr->m_pOut;
124 //return empty matrix
125 if (_iRows == 0 && _iCols == 0)
127 Double *pDbl = new Double(_iRows, _iCols);
130 addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix");
138 String* pS = new String(_iRows, _iCols);
141 addErrorMessage(&sciErr, API_ERROR_NO_MORE_MEMORY, _("%s: No more memory to allocated variable"), "createMatrixOfString");
145 for (int i = 0 ; i < pS->getSize() ; i++)
147 wchar_t* pstTemp = to_wide_string(_pstStrings[i]);
156 /*--------------------------------------------------------------------------*/
157 SciErr createNamedMatrixOfString(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, const char* const* _pstStrings)
161 sciErr.iMsgCount = 0;
163 // check variable name
164 if (checkNamedVarFormat(_pvCtx, _pstName) == 0)
166 addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Invalid variable name: %s."), "createNamedMatrixOfString", _pstName);
170 //return empty matrix
171 if (_iRows == 0 && _iCols == 0)
173 if (createNamedEmptyMatrix(_pvCtx, _pstName))
175 addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix");
182 String* pS = new String(_iRows, _iCols);
185 addErrorMessage(&sciErr, API_ERROR_INVALID_NAME, _("%s: Invalid variable name: %s."), "createNamedMatrixOfString", _pstName);
189 for (int i = 0 ; i < pS->getSize() ; i++)
191 wchar_t* pstTemp = to_wide_string(_pstStrings[i]);
196 wchar_t* pwstName = to_wide_string(_pstName);
197 symbol::Context* ctx = symbol::Context::getInstance();
198 symbol::Symbol sym = symbol::Symbol(pwstName);
200 if (ctx->isprotected(sym) == false)
207 addErrorMessage(&sciErr, API_ERROR_REDEFINE_PERMANENT_VAR, _("Redefining permanent variable.\n"));
211 /*--------------------------------------------------------------------------*/
212 SciErr readNamedMatrixOfString(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, int* _piLength, char** _pstStrings)
216 SciErr sciErr = getVarAddressFromName(_pvCtx, _pstName, &piAddr);
219 addErrorMessage(&sciErr, API_ERROR_READ_NAMED_STRING, _("%s: Unable to get variable \"%s\""), "readNamedMatrixOfString", _pstName);
223 sciErr = getMatrixOfString(_pvCtx, piAddr, _piRows, _piCols, _piLength, _pstStrings);
226 addErrorMessage(&sciErr, API_ERROR_READ_NAMED_STRING, _("%s: Unable to get variable \"%s\""), "readNamedMatrixOfString", _pstName);
232 /*--------------------------------------------------------------------------*/
233 SciErr getMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, int* _piwLength, wchar_t** _pwstStrings)
235 SciErr sciErr = sciErrInit();
237 char **pstStrings = NULL;
238 int *piLenStrings = NULL;
241 if (_piAddress == NULL)
243 addErrorMessage(&sciErr, API_ERROR_INVALID_POINTER, _("%s: Invalid argument address"), "getMatrixOfWideString");
247 sciErr = getVarType(_pvCtx, _piAddress, &iType);
250 addErrorMessage(&sciErr, API_ERROR_GET_WIDE_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfWideString", getRhsFromAddress(_pvCtx, _piAddress));
254 if (iType != sci_strings)
256 addErrorMessage(&sciErr, API_ERROR_INVALID_TYPE, _("%s: Invalid argument type, %s expected"), "getMatrixOfWideString", _("string matrix"));
260 sciErr = getVarDimension(_pvCtx, _piAddress, _piRows, _piCols);
263 addErrorMessage(&sciErr, API_ERROR_GET_WIDE_STRING, _("%s: Unable to get argument #%d"), "getMatrixOfWideString", getRhsFromAddress(_pvCtx, _piAddress));
267 if (_piwLength == NULL)
272 String *pS = ((InternalType*)_piAddress)->getAs<types::String>();
274 int iSize = pS->getSize();
275 if (_pwstStrings == NULL || *_pwstStrings == NULL)
277 for (int i = 0 ; i < iSize; i++)
279 _piwLength[i] = (int)wcslen(pS->get(i));
284 for (int i = 0 ; i < pS->getSize() ; i++)
286 if (_pwstStrings[i] == NULL)
288 addErrorMessage(&sciErr, API_ERROR_INVALID_SUBSTRING_POINTER, _("%s: Invalid argument address"), "getMatrixOfString");
292 wcscpy(_pwstStrings[i], pS->get(i));
298 /*--------------------------------------------------------------------------*/
299 SciErr createMatrixOfWideString(void* _pvCtx, int _iVar, int _iRows, int _iCols, const wchar_t* const* _pstwStrings)
301 char **pStrings = NULL;
303 //return empty matrix
304 if (_iRows == 0 && _iCols == 0)
307 SciErr sciErr = createMatrixOfDouble(_pvCtx, _iVar, 0, 0, &dblReal);
310 addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createEmptyMatrix");
315 pStrings = (char**)MALLOC( sizeof(char*) * (_iRows * _iCols) );
317 for (int i = 0; i < (_iRows * _iCols) ; i++)
319 pStrings[i] = wide_string_to_UTF8(_pstwStrings[i]);
322 SciErr sciErr = createMatrixOfString(_pvCtx, _iVar, _iRows, _iCols, pStrings);
325 addErrorMessage(&sciErr, API_ERROR_CREATE_WIDE_STRING, _("%s: Unable to create variable in Scilab memory"), "createMatrixOfWideString");
328 freeArrayOfString(pStrings, _iRows * _iCols);
332 /*--------------------------------------------------------------------------*/
333 SciErr createNamedMatrixOfWideString(void* _pvCtx, const char* _pstName, int _iRows, int _iCols, const wchar_t* const* _pwstStrings)
335 SciErr sciErr = sciErrInit();
336 char **pStrings = NULL;
338 // check variable name
339 if (checkNamedVarFormat(_pvCtx, _pstName) == 0)
341 addErrorMessage(&sciErr, API_ERROR_CREATE_EMPTY_MATRIX, _("%s: Invalid variable name: %s."), "createNamedMatrixOfWideString", _pstName);
345 //return named empty matrix
346 if (_iRows == 0 && _iCols == 0)
349 sciErr = createNamedMatrixOfDouble(_pvCtx, _pstName, 0, 0, &dblReal);
352 addErrorMessage(&sciErr, API_ERROR_CREATE_NAMED_EMPTY_MATRIX, _("%s: Unable to create variable in Scilab memory"), "createNamedEmptyMatrix");
357 String* pS = new String(_iRows, _iCols);
360 addErrorMessage(&sciErr, API_ERROR_INVALID_NAME, _("%s: Invalid variable name: %s."), "createNamedMatrixOfWideString", _pstName);
364 for (int i = 0 ; i < pS->getSize() ; i++)
366 pS->set(i, _pwstStrings[i]);
369 wchar_t* pwstName = to_wide_string(_pstName);
370 symbol::Context* ctx = symbol::Context::getInstance();
371 symbol::Symbol sym = symbol::Symbol(pwstName);
373 if (ctx->isprotected(sym) == false)
380 addErrorMessage(&sciErr, API_ERROR_REDEFINE_PERMANENT_VAR, _("Redefining permanent variable.\n"));
384 /*--------------------------------------------------------------------------*/
385 SciErr readNamedMatrixOfWideString(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, int* _piwLength, wchar_t** _pwstStrings)
389 SciErr sciErr = getVarAddressFromName(_pvCtx, _pstName, &piAddr);
392 addErrorMessage(&sciErr, API_ERROR_READ_NAMED_WIDE_STRING, _("%s: Unable to get variable \"%s\""), "readNamedMatrixOfWideString", _pstName);
396 sciErr = getMatrixOfWideString(_pvCtx, piAddr, _piRows, _piCols, _piwLength, _pwstStrings);
399 addErrorMessage(&sciErr, API_ERROR_READ_NAMED_WIDE_STRING, _("%s: Unable to get variable \"%s\""), "readNamedMatrixOfWideString", _pstName);
406 /*shortcut functions*/
407 /*--------------------------------------------------------------------------*/
408 int isStringType(void* _pvCtx, int* _piAddress)
410 return checkVarType(_pvCtx, _piAddress, sci_strings);
412 /*--------------------------------------------------------------------------*/
413 int isNamedStringType(void* _pvCtx, const char* _pstName)
415 return checkNamedVarType(_pvCtx, _pstName, sci_strings);
417 /*--------------------------------------------------------------------------*/
418 int getAllocatedSingleString(void* _pvCtx, int* _piAddress, char** _pstData)
420 SciErr sciErr = sciErrInit();
425 if (isScalar(_pvCtx, _piAddress) == 0 || isStringType(_pvCtx, _piAddress) == 0)
427 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_STRING, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "getAllocatedSingleString", getRhsFromAddress(_pvCtx, _piAddress));
428 printError(&sciErr, 0);
432 sciErr = getMatrixOfString(_pvCtx, _piAddress, &iRows, &iCols, &iLen, NULL);
435 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleString");
436 printError(&sciErr, 0);
440 *_pstData = (char*)MALLOC(sizeof(char) * (iLen + 1)); //+1 for null termination
442 sciErr = getMatrixOfString(_pvCtx, _piAddress, &iRows, &iCols, &iLen, _pstData);
445 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleString");
446 printError(&sciErr, 0);
453 /*--------------------------------------------------------------------------*/
454 int getAllocatedSingleWideString(void* _pvCtx, int* _piAddress, wchar_t** _pwstData)
456 SciErr sciErr = sciErrInit();
461 if (isScalar(_pvCtx, _piAddress) == 0 || isStringType(_pvCtx, _piAddress) == 0)
463 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Wrong type for input argument #%d: A single string expected.\n"), "getAllocatedSingleWideString", getRhsFromAddress(_pvCtx, _piAddress));
464 printError(&sciErr, 0);
468 sciErr = getMatrixOfWideString(_pvCtx, _piAddress, &iRows, &iCols, &iLen, NULL);
471 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleWideString");
472 printError(&sciErr, 0);
476 *_pwstData = (wchar_t*)MALLOC(sizeof(wchar_t) * (iLen + 1)); //+1 for null termination
478 sciErr = getMatrixOfWideString(_pvCtx, _piAddress, &iRows, &iCols, &iLen, _pwstData);
481 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedSingleWideString");
482 printError(&sciErr, 0);
488 /*--------------------------------------------------------------------------*/
489 int getAllocatedMatrixOfString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, char*** _pstData)
491 SciErr sciErr = getMatrixOfString(_pvCtx, _piAddress, _piRows, _piCols, NULL, NULL);
494 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfString");
495 printError(&sciErr, 0);
499 int* piLen = (int*)MALLOC(sizeof(int) **_piRows **_piCols);
500 *_pstData = (char**)MALLOC(sizeof(char*) **_piRows **_piCols);
502 sciErr = getMatrixOfString(_pvCtx, _piAddress, _piRows, _piCols, piLen, NULL);
505 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfString");
506 printError(&sciErr, 0);
515 for (int i = 0 ; i < *_piRows **_piCols ; i++)
517 (*_pstData)[i] = (char*)MALLOC(sizeof(char) * (piLen[i] + 1));//+1 for null termination
520 sciErr = getMatrixOfString(_pvCtx, _piAddress, _piRows, _piCols, piLen, *_pstData);
528 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfString");
529 printError(&sciErr, 0);
535 /*--------------------------------------------------------------------------*/
536 int getAllocatedMatrixOfWideString(void* _pvCtx, int* _piAddress, int* _piRows, int* _piCols, wchar_t*** _pwstData)
538 SciErr sciErr = getMatrixOfWideString(_pvCtx, _piAddress, _piRows, _piCols, NULL, NULL);
541 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfWideString");
542 printError(&sciErr, 0);
546 int* piLen = (int*)MALLOC(sizeof(int) **_piRows **_piCols);
547 *_pwstData = (wchar_t**)MALLOC(sizeof(wchar_t*) **_piRows **_piCols);
549 sciErr = getMatrixOfWideString(_pvCtx, _piAddress, _piRows, _piCols, piLen, NULL);
552 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfWideString");
563 printError(&sciErr, 0);
567 for (int i = 0 ; i < *_piRows **_piCols ; i++)
569 (*_pwstData)[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (piLen[i] + 1));//+1 for null termination
572 sciErr = getMatrixOfWideString(_pvCtx, _piAddress, _piRows, _piCols, piLen, *_pwstData);
582 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedMatrixOfWideString");
583 printError(&sciErr, 0);
588 /*--------------------------------------------------------------------------*/
589 int getAllocatedNamedSingleString(void* _pvCtx, const char* _pstName, char** _pstData)
591 SciErr sciErr = sciErrInit();
596 if (isNamedScalar(_pvCtx, _pstName) == 0 || isNamedStringType(_pvCtx, _pstName) == 0)
598 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_STRING, _("%s: Wrong type for input argument \"%s\": A single string expected.\n"), "getAllocatedNamedSingleString", _pstName);
599 printError(&sciErr, 0);
603 sciErr = readNamedMatrixOfString(_pvCtx, _pstName, &iRows, &iCols, &iLen, NULL);
606 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_STRING, _("%s: Unable to get argument data"), "getAllocatedNamedSingleString");
607 printError(&sciErr, 0);
611 *_pstData = (char*)MALLOC(sizeof(char) * (iLen + 1)); //+1 for null termination
613 sciErr = readNamedMatrixOfString(_pvCtx, _pstName, &iRows, &iCols, &iLen, _pstData);
616 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_STRING, _("%s: Unable to get argument data"), "getAllocatedNamedSingleString");
617 printError(&sciErr, 0);
623 /*--------------------------------------------------------------------------*/
624 int getAllocatedNamedSingleWideString(void* _pvCtx, const char* _pstName, wchar_t** _pwstData)
626 SciErr sciErr = sciErrInit();
631 if (isNamedScalar(_pvCtx, _pstName) == 0 || isNamedStringType(_pvCtx, _pstName) == 0)
633 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_WIDE_STRING, _("%s: Wrong type for input argument \"%s\": A single string expected.\n"), "getAllocatedNamedSingleWideString", _pstName);
634 printError(&sciErr, 0);
638 sciErr = readNamedMatrixOfWideString(_pvCtx, _pstName, &iRows, &iCols, &iLen, NULL);
641 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedNamedSingleWideString");
642 printError(&sciErr, 0);
646 *_pwstData = (wchar_t*)MALLOC(sizeof(wchar_t) * (iLen + 1)); //+1 for null termination
648 sciErr = readNamedMatrixOfWideString(_pvCtx, _pstName, &iRows, &iCols, &iLen, _pwstData);
651 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "getAllocatedNamedSingleWideString");
652 printError(&sciErr, 0);
658 /*--------------------------------------------------------------------------*/
659 int getAllocatedNamedMatrixOfString(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, char*** _pstData)
661 SciErr sciErr = readNamedMatrixOfString(_pvCtx, _pstName, _piRows, _piCols, NULL, NULL);
664 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfString");
665 printError(&sciErr, 0);
669 int* piLen = (int*)MALLOC(sizeof(int) **_piRows **_piCols);
671 sciErr = readNamedMatrixOfString(_pvCtx, _pstName, _piRows, _piCols, piLen, NULL);
674 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfString");
680 printError(&sciErr, 0);
684 *_pstData = (char**)MALLOC(sizeof(char*) **_piRows **_piCols);
685 for (int i = 0 ; i < *_piRows **_piCols ; i++)
687 (*_pstData)[i] = (char*)MALLOC(sizeof(char) * (piLen[i] + 1));//+1 for null termination
690 sciErr = readNamedMatrixOfString(_pvCtx, _pstName, _piRows, _piCols, piLen, *_pstData);
698 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfString");
699 printError(&sciErr, 0);
705 /*--------------------------------------------------------------------------*/
706 int getAllocatedNamedMatrixOfWideString(void* _pvCtx, const char* _pstName, int* _piRows, int* _piCols, wchar_t*** _pwstData)
712 SciErr sciErr = readNamedMatrixOfWideString(_pvCtx, _pstName, &iRows, &iCols, NULL, NULL);
715 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfWideString");
716 printError(&sciErr, 0);
720 piLen = (int*)MALLOC(sizeof(int) **_piRows **_piCols);
722 sciErr = readNamedMatrixOfWideString(_pvCtx, _pstName, &iRows, &iCols, piLen, NULL);
725 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfWideString");
731 printError(&sciErr, 0);
735 *_pwstData = (wchar_t**)MALLOC(sizeof(wchar_t*) **_piRows **_piCols);
737 for (int i = 0 ; i < *_piRows **_piCols ; i++)
739 *_pwstData[i] = (wchar_t*)MALLOC(sizeof(wchar_t) * (piLen[i] + 1));//+1 for null termination
742 sciErr = readNamedMatrixOfWideString(_pvCtx, _pstName, &iRows, &iCols, piLen, *_pwstData);
750 addErrorMessage(&sciErr, API_ERROR_GET_ALLOC_NAMED_WIDE_STRING_MATRIX, _("%s: Unable to get argument data"), "getAllocatedNamedMatrixOfWideString");
751 printError(&sciErr, 0);
757 /*--------------------------------------------------------------------------*/
758 int createSingleString(void* _pvCtx, int _iVar, const char* _pstStrings)
760 SciErr sciErr = createMatrixOfString(_pvCtx, _iVar, 1, 1, &_pstStrings);
763 addErrorMessage(&sciErr, API_ERROR_CREATE_SINGLE_STRING, _("%s: Unable to get argument data"), "createSingleString");
764 printError(&sciErr, 0);
771 int allocSingleString(void* _pvCtx, int _iVar, int _iLen, const char** _pstStrings)
773 SciErr sciErr = sciErrInit();
775 int iNewPos = Top - Rhs + _iVar;
776 int iAddr = *Lstk(iNewPos);
778 int* piOffset = NULL;
779 char* pstString = NULL;
781 int iFreeSpace = iadr(*Lstk(Bot)) - (iadr(*Lstk(Top)));
783 if (_iLen + 2 > iFreeSpace)
785 addStackSizeError(&sciErr, ((StrCtx*)_pvCtx)->pstName, _iLen + 2);
789 getNewVarAddressFromPosition(_pvCtx, iNewPos, &piAddr);
791 piAddr[0] = sci_strings;
796 piOffset = piAddr + 4;
797 piOffset[0] = 1; //Always 1
798 piOffset[1] = _iLen + 1;
799 pstString = (char*)(piOffset + 2); //2 offsets
804 /*--------------------------------------------------------------------------*/
805 int createSingleWideString(void* _pvCtx, int _iVar, const wchar_t* _pwstStrings)
807 SciErr sciErr = createMatrixOfWideString(_pvCtx, _iVar, 1, 1, &_pwstStrings);
810 addErrorMessage(&sciErr, API_ERROR_CREATE_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "createSingleWideString");
811 printError(&sciErr, 0);
817 /*--------------------------------------------------------------------------*/
818 int createNamedSingleString(void* _pvCtx, const char* _pstName, const char* _pstStrings)
820 SciErr sciErr = createNamedMatrixOfString(_pvCtx, _pstName, 1, 1, &_pstStrings);
823 addErrorMessage(&sciErr, API_ERROR_CREATE_NAMED_SINGLE_STRING, _("%s: Unable to get argument data"), "createSingleString");
824 printError(&sciErr, 0);
830 /*--------------------------------------------------------------------------*/
831 int createNamedSingleWideString(void* _pvCtx, const char* _pstName, const wchar_t* _pwstStrings)
833 SciErr sciErr = createNamedMatrixOfWideString(_pvCtx, _pstName, 1, 1, &_pwstStrings);
836 addErrorMessage(&sciErr, API_ERROR_CREATE_NAMED_SINGLE_WIDE_STRING, _("%s: Unable to get argument data"), "createSingleWideString");
837 printError(&sciErr, 0);
843 /*--------------------------------------------------------------------------*/
844 void freeAllocatedSingleString(char* _pstData)
848 /*--------------------------------------------------------------------------*/
849 void freeAllocatedSingleWideString(wchar_t* _pwstData)
853 /*--------------------------------------------------------------------------*/
854 void freeAllocatedMatrixOfString(int _iRows, int _iCols, char** _pstData)
856 for (int i = 0 ; i < _iRows * _iCols ; i++)
862 /*--------------------------------------------------------------------------*/
863 void freeAllocatedMatrixOfWideString(int _iRows, int _iCols, wchar_t** _pwstData)
865 for (int i = 0 ; i < _iRows * _iCols ; i++)
871 /*--------------------------------------------------------------------------*/