1899
|
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
|