diff --git a/Examples/test-suite/matlab/li_std_string_extra_runme.m b/Examples/test-suite/matlab/li_std_string_extra_runme.m index 37f07dc325a..3b8785277c5 100644 --- a/Examples/test-suite/matlab/li_std_string_extra_runme.m +++ b/Examples/test-suite/matlab/li_std_string_extra_runme.m @@ -158,3 +158,10 @@ %if (li_std_string_extra.c_null() ~= None) % error %end + +% Long strings +s = repmat('hello',1,100); +sout = li_std_string_extra.test_reference_inout(s); +if (s ~= sout) + error +end diff --git a/Lib/matlab/matlabprimtypes.swg b/Lib/matlab/matlabprimtypes.swg index 73d5cce3782..b73ecb5a05a 100644 --- a/Lib/matlab/matlabprimtypes.swg +++ b/Lib/matlab/matlabprimtypes.swg @@ -231,18 +231,24 @@ SWIGINTERN int SWIG_AsCharPtrAndSize(mxArray* pm, char** cptr, size_t* psize, int *alloc) { if(!mxIsChar(pm) || (mxGetNumberOfElements(pm) != 0 && mxGetM(pm)!=1)) return SWIG_TypeError; - size_t len=mxGetN(pm); - static char buf[256]; - int flag = mxGetString(pm,buf,(mwSize)sizeof(buf)); - if(flag) return SWIG_TypeError; + size_t len=mxGetM(pm) * mxGetN(pm) + 1; + char* buf = (char*)malloc(sizeof(char) * len); + int flag = mxGetString(pm,buf,len); + if(flag) { + free(buf); + return SWIG_TypeError; + } if (alloc) { - *cptr = %new_copy_array(buf, len + 1, char); + *cptr = %new_copy_array(buf, len, char); *alloc = SWIG_NEWOBJ; - } else if (cptr) + free(buf); + } else if (cptr) { *cptr = buf; + } else + free(buf); if (psize) - *psize = len + 1; + *psize = len; return SWIG_OK; } }