summaryrefslogtreecommitdiff
path: root/src/lua/basic.lua
blob: 2bac463f48bbb6ca78ddc119f9c241539cb2cef3 (plain)
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