1 /* ----------------------------------------------------------------------------- 2 * std_string.i 3 * 4 * std::string typemaps for LUA 5 * ----------------------------------------------------------------------------- */ 6 7 %{ 8 #include <string> 9 %} 10 11 /* 12 Only std::string and const std::string& are typemapped 13 they are converted to the Lua strings automatically 14 15 std::string& and std::string* are not 16 they must be explicitly managed (see below) 17 18 eg. 19 20 std::string test_value(std::string x) { 21 return x; 22 } 23 24 can be used as 25 26 s="hello world" 27 s2=test_value(s) 28 assert(s==s2) 29 */ 30 31 namespace std { 32 33 %naturalvar string; 34 35 /* 36 Bug report #1526022: 37 Lua strings and std::string can contain embedded zero bytes 38 Therefore a standard out typemap should not be: 39 lua_pushstring(L,$1.c_str()); 40 but 41 lua_pushlstring(L,$1.data(),$1.size()); 42 43 Similarly for getting the string 44 $1 = (char*)lua_tostring(L, $input); 45 becomes 46 $1.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); 47 48 Not using: lua_tolstring() as this is only found in Lua 5.1 & not 5.0.2 49 */ 50 51 %typemap(in,checkfn="lua_isstring") string 52 %{$1.assign(lua_tostring(L,$input),lua_rawlen(L,$input));%} 53 54 %typemap(out) string 55 %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_arg++;%} 56 57 %typemap(in,checkfn="lua_isstring") const string& ($*1_ltype temp) 58 %{temp.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); $1=&temp;%} 59 60 %typemap(out) const string& 61 %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} 62 63 // for throwing of any kind of string, string ref's and string pointers 64 // we convert all to lua strings 65 %typemap(throws) string, string&, const string& 66 %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_fail;%} 67 68 %typemap(throws) string*, const string* 69 %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_fail;%} 70 71 %typecheck(SWIG_TYPECHECK_STRING) string, const string& { 72 $1 = lua_isstring(L,$input); 73 } 74 75 /* 76 std::string& can be wrapped, but you must inform SWIG if it is in or out 77 78 eg: 79 void fn(std::string& str); 80 Is this an in/out/inout value? 81 82 Therefore you need the usual 83 %apply (std::string& INOUT) {std::string& str}; 84 or 85 %apply std::string& INOUT {std::string& str}; 86 typemaps to tell SWIG what to do. 87 */ 88 89 %typemap(in) string &INPUT=const string &; 90 %typemap(in, numinputs=0) string &OUTPUT ($*1_ltype temp) 91 %{ $1 = &temp; %} 92 %typemap(argout) string &OUTPUT 93 %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} 94 %typemap(in) string &INOUT =const string &; 95 %typemap(argout) string &INOUT = string &OUTPUT; 96 97 /* 98 A really cut down version of the string class 99 100 This provides basic mapping of lua strings <-> std::string 101 and little else 102 (the std::string has a lot of unneeded functions anyway) 103 104 note: no fn's taking the const string& 105 as this is overloaded by the const char* version 106 */ 107 108 class string { 109 public: 110 string(); 111 string(const char*); 112 //string(const string&); 113 unsigned int size() const; 114 unsigned int length() const; 115 bool empty() const; 116 // no support for operator[] 117 const char* c_str()const; 118 const char* data()const; 119 // assign does not return a copy of this object 120 // (no point in a scripting language) 121 void assign(const char*); 122 //void assign(const string&); 123 // no support for all the other features 124 // it's probably better to do it in lua 125 }; 126 } 127 128