Use the usual C rule for NUL-terminated strings instead of discarding all the trailing NUL characters. This was unexpected (as buffers in C code are not necessarily always padded with NULs to their full length) and also inconsistent among languages as this was only done for those of them using typemaps/strings.swg but not for C# or Java, for example, which terminated the string at the first NUL even before this change. Notice that this patch couldn't use strlen() or wcslen() with possibly not NUL-terminated strings, so we had to add [our own equivalents of] strnlen() and wcsnlen() and use them instead. This required adding yet another parameter to string typemap macros, so update the example using them accordingly too.
35 lines
766 B
Text
35 lines
766 B
Text
%ensure_fragment(SWIG_AsCharPtrAndSize)
|
|
%ensure_fragment(SWIG_FromCharPtrAndSize)
|
|
|
|
%types(char *);
|
|
|
|
%fragment("SWIG_pchar_descriptor","header") {
|
|
SWIGINTERN swig_type_info*
|
|
SWIG_pchar_descriptor(void)
|
|
{
|
|
static int init = 0;
|
|
static swig_type_info* info = 0;
|
|
if (!init) {
|
|
info = SWIG_TypeQuery("_p_char");
|
|
init = 1;
|
|
}
|
|
return info;
|
|
}
|
|
}
|
|
|
|
%fragment("SWIG_strnlen","header",fragment="SWIG_FromCharPtrAndSize") {
|
|
size_t
|
|
SWIG_strnlen(const char* s, size_t maxlen)
|
|
{
|
|
const char *p;
|
|
for (p = s; maxlen-- && *p; p++)
|
|
;
|
|
return p - s;
|
|
}
|
|
}
|
|
|
|
%include <typemaps/strings.swg>
|
|
%typemaps_string(%checkcode(STRING), %checkcode(CHAR),
|
|
char, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize,
|
|
strlen, SWIG_strnlen,
|
|
"<limits.h>", CHAR_MIN, CHAR_MAX)
|