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:
parent
8208d12aa5
commit
ca208cfe35
6 changed files with 37 additions and 4 deletions
15
Examples/test-suite/chartest.i
Normal file
15
Examples/test-suite/chartest.i
Normal 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;
|
||||
}
|
||||
|
||||
%}
|
||||
|
|
@ -138,6 +138,7 @@ CPP_TEST_CASES += \
|
|||
casts \
|
||||
char_binary \
|
||||
char_strings \
|
||||
chartest \
|
||||
class_forward \
|
||||
class_ignore \
|
||||
class_scope_weird \
|
||||
|
|
|
|||
14
Examples/test-suite/lua/chartest_runme.lua
Normal file
14
Examples/test-suite/lua/chartest_runme.lua
Normal 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)
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue