lua: push characters as unformatted 1-character strings

Since Lua 5.3 the "%c" format character in lua_pushfstring will produce
the string "<\XXX>" (XXX being a decimal code sequence) when
given unprintable characters.

Use lua_pushlstring instead to reproduce the old behavior.
This commit is contained in:
Nils Gladitz 2015-07-01 12:24:12 +02:00
commit ca208cfe35
6 changed files with 37 additions and 4 deletions

View file

@ -0,0 +1,15 @@
%module chartest
%inline %{
char printable_global_char = 'a';
char unprintable_global_char = 0x7F;
char GetPrintableChar() {
return 'a';
}
char GetUnprintableChar() {
return 0x7F;
}
%}

View file

@ -138,6 +138,7 @@ CPP_TEST_CASES += \
casts \
char_binary \
char_strings \
chartest \
class_forward \
class_ignore \
class_scope_weird \

View file

@ -0,0 +1,14 @@
require("import") -- the import fn
import("chartest") -- import code
function char_assert(char, code)
assert(type(char) == 'string')
assert(char:len() == 1)
assert(char:byte() == code)
end
char_assert(chartest.GetPrintableChar(), 0x61)
char_assert(chartest.GetUnprintableChar(), 0x7F)
char_assert(chartest.printable_global_char, 0x61)
char_assert(chartest.unprintable_global_char, 0x7F)

View file

@ -185,7 +185,7 @@ use %include <std_except.i> instead
// char is changed to a string
%typemap(throws) char
%{lua_pushfstring(L,"%c",$1);SWIG_fail;%}
%{lua_pushlstring(L,&$1,1);SWIG_fail;%}
/*
Throwing object is a serious problem:

View file

@ -1841,7 +1841,10 @@ SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]) {
break;
case SWIG_LUA_CHAR:
lua_pushstring(L,constants[i].name);
lua_pushfstring(L,"%c",(char)constants[i].lvalue);
{
char c = constants[i].lvalue;
lua_pushlstring(L,&c,1);
}
lua_rawset(L,-3);
break;
case SWIG_LUA_STRING:

View file

@ -122,14 +122,14 @@ SWIGINTERN int SWIG_lua_isnilstring(lua_State *L, int idx) {
%{$1 = (lua_tostring(L, $input))[0];%}
%typemap(out) char
%{ lua_pushfstring(L,"%c",$1); SWIG_arg++;%}
%{ lua_pushlstring(L, &$1, 1); SWIG_arg++;%}
// by const ref
%typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char& (char temp)
%{temp = (lua_tostring(L, $input))[0]; $1=&temp;%}
%typemap(out) const char&
%{ lua_pushfstring(L,"%c",*$1); SWIG_arg++;%}
%{ lua_pushlstring(L, $1, 1); SWIG_arg++;%}
// pointers and references
// under SWIG rules, it is ok, to have a pass in a lua nil,