1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
-- tolua: basic utility functions
-- Written by Waldemar Celes
-- TeCGraf/PUC-Rio
-- Jul 1998
-- $Id: basic.lua,v 1.2 2001/11/26 23:00:23 darkgod Exp $
-- This code is free software; you can redistribute it and/or modify it.
-- The software provided hereunder is on an "as is" basis, and
-- the author has no obligation to provide maintenance, support, updates,
-- enhancements, or modifications.
-- Basic C types and their corresponding Lua types
-- All occurrences of "char*" will be replaced by "_cstring",
-- and all occurrences of "void*" will be replaced by "_userdata"
_basic = {
['void'] = '',
['char'] = 'number',
['int'] = 'number',
['short'] = 'number',
['long'] = 'number',
['_cstring'] = 'string',
['_userdata'] = 'userdata',
['char*'] = 'string',
['void*'] = 'userdata',
['bool'] = 'bool',
['LUA_VALUE'] = 'value',
['byte'] = 'number',
['s16b'] = 'number',
['u16b'] = 'number',
['s32b'] = 'number',
['u32b'] = 'number',
}
_basic_tag = {
['void'] = '',
['char'] = 'LUA_TNUMBER',
['int'] = 'LUA_TNUMBER',
['short'] = 'LUA_TNUMBER',
['long'] = 'LUA_TNUMBER',
['_cstring'] = 'LUA_TSTRING',
['_userdata'] = 'LUA_TUSERDATA',
['char*'] = 'LUA_TSTRING',
['void*'] = 'LUA_TUSERDATA',
['bool'] = 'tolua_tag(tolua_S,"bool")',
['byte'] = 'LUA_TNUMBER',
['s16b'] = 'LUA_TNUMBER',
['u16b'] = 'LUA_TNUMBER',
['s32b'] = 'LUA_TNUMBER',
['u32b'] = 'LUA_TNUMBER',
}
_basic_ctype = {
number = "long",
string = "const char*",
userdata = "void*",
bool = "int",
}
-- List of user defined types
-- Each type corresponds to a variable name that stores its tag value.
_usertype = {}
-- Tag method to provide inheritance
function tolua_index (t,f)
if f == '_base' then -- to avoid loop
return tolua_old_index(t,f)
else
return t._base[f]
end
end
tolua_tag = newtag()
tolua_old_index = settagmethod(tolua_tag,"index",tolua_index)
-- Error handler
function tolua_error (s)
local out = _OUTPUT
_OUTPUT = _STDERR
if strsub(s,1,1) == '#' then
write("\n** tolua: "..strsub(s,2)..".\n\n")
else
write("\n** tolua internal error: "..s..".\n\n")
return
end
if _curr_code then
local _,_,s = strfind(_curr_code,"^%s*(.-\n)") -- extract first line
if s==nil then s = _curr_code end
s = gsub(s,"_userdata","void*") -- return with 'void*'
s = gsub(s,"_cstring","char*") -- return with 'char*'
write("Code being processed:\n"..s.."\n")
end
_OUTPUT = out
end
_ERRORMESSAGE = tolua_error
-- register an user defined type
function regtype (t)
if not istype(t) then
_usertype[t] = t
end
return t
end
-- return tag name
function tagvar(type,const)
if type == '' or type == 'void' then
return type,0
else
local m,t = findtypedef(type)
if isbasic(t) then
return t, _basic_tag[t]
end
if strfind(m,'const') then const = 'const' end
regtype(t)
if const and const ~= '' then
t = 'const '..t
end
return t,'tolua_tag(tolua_S,"'..t..'")'
end
end
-- check if basic type
function isbasic (type)
local m,t = findtypedef(type)
local b = _basic[t]
if b then
return b,_basic_ctype[b]
end
return nil
end
-- check if type
function istype (t)
return _basic[t] or _usertype[t] or istypedef(t)
end
-- split string using a token
function split (s,t)
local l = {n=0}
local f = function (s)
%l.n = %l.n + 1
%l[%l.n] = s
end
local p = "%s*(.-)%s*"..t.."%s*"
s = gsub(s,"^%s+","")
s = gsub(s,"%s+$","")
s = gsub(s,p,f)
l.n = l.n + 1
l[l.n] = gsub(s,"(%s%s*)$","")
return l
end
-- concatenate strings of a table
function concat (t,f,l)
local s = ''
local i=f
while i<=l do
s = s..t[i]
i = i+1
if i <= l then s = s..' ' end
end
return s
end
-- output line
function output (...)
local i=1
while i<=arg.n do
if _cont and not strfind(_cont,'[%(,"]') and
strfind(arg[i],"^[%a_~]") then
write(' ')
end
write(arg[i])
if arg[i] ~= '' then
_cont = strsub(arg[i],-1,-1)
end
i = i+1
end
if strfind(arg[arg.n],"[%/%)%;%{%}]$") then
_cont=nil write('\n')
end
end
|