lauxlib.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package lua
  2. //#include "golua.h"
  3. import "C"
  4. import "unsafe"
  5. type LuaError struct {
  6. code int
  7. message string
  8. stackTrace []LuaStackEntry
  9. }
  10. func (err *LuaError) Error() string {
  11. return err.message
  12. }
  13. func (err *LuaError) Code() int {
  14. return err.code
  15. }
  16. func (err *LuaError) StackTrace() []LuaStackEntry {
  17. return err.stackTrace
  18. }
  19. // luaL_argcheck
  20. // WARNING: before b30b2c62c6712c6683a9d22ff0abfa54c8267863 the function ArgCheck had the opposite behaviour
  21. func (L *State) Argcheck(cond bool, narg int, extramsg string) {
  22. if !cond {
  23. Cextramsg := C.CString(extramsg)
  24. defer C.free(unsafe.Pointer(Cextramsg))
  25. C.luaL_argerror(L.s, C.int(narg), Cextramsg)
  26. }
  27. }
  28. // luaL_argerror
  29. func (L *State) ArgError(narg int, extramsg string) int {
  30. Cextramsg := C.CString(extramsg)
  31. defer C.free(unsafe.Pointer(Cextramsg))
  32. return int(C.luaL_argerror(L.s, C.int(narg), Cextramsg))
  33. }
  34. // luaL_callmeta
  35. func (L *State) CallMeta(obj int, e string) int {
  36. Ce := C.CString(e)
  37. defer C.free(unsafe.Pointer(Ce))
  38. return int(C.luaL_callmeta(L.s, C.int(obj), Ce))
  39. }
  40. // luaL_checkany
  41. func (L *State) CheckAny(narg int) {
  42. C.luaL_checkany(L.s, C.int(narg))
  43. }
  44. // luaL_checkinteger
  45. func (L *State) CheckInteger(narg int) int {
  46. return int(C.luaL_checkinteger(L.s, C.int(narg)))
  47. }
  48. // luaL_checknumber
  49. func (L *State) CheckNumber(narg int) float64 {
  50. return float64(C.luaL_checknumber(L.s, C.int(narg)))
  51. }
  52. // luaL_checkstring
  53. func (L *State) CheckString(narg int) string {
  54. var length C.size_t
  55. return C.GoString(C.luaL_checklstring(L.s, C.int(narg), &length))
  56. }
  57. // luaL_checkoption
  58. //
  59. // BUG(everyone_involved): not implemented
  60. func (L *State) CheckOption(narg int, def string, lst []string) int {
  61. //TODO: complication: lst conversion to const char* lst[] from string slice
  62. return 0
  63. }
  64. // luaL_checktype
  65. func (L *State) CheckType(narg int, t LuaValType) {
  66. C.luaL_checktype(L.s, C.int(narg), C.int(t))
  67. }
  68. // luaL_checkudata
  69. func (L *State) CheckUdata(narg int, tname string) unsafe.Pointer {
  70. Ctname := C.CString(tname)
  71. defer C.free(unsafe.Pointer(Ctname))
  72. return unsafe.Pointer(C.luaL_checkudata(L.s, C.int(narg), Ctname))
  73. }
  74. // Executes file, returns nil for no errors or the lua error string on failure
  75. func (L *State) DoFile(filename string) error {
  76. if r := L.LoadFile(filename); r != 0 {
  77. return &LuaError{r, L.ToString(-1), L.StackTrace()}
  78. }
  79. return L.Call(0, LUA_MULTRET)
  80. }
  81. // Executes the string, returns nil for no errors or the lua error string on failure
  82. func (L *State) DoString(str string) error {
  83. if r := L.LoadString(str); r != 0 {
  84. return &LuaError{r, L.ToString(-1), L.StackTrace()}
  85. }
  86. return L.Call(0, LUA_MULTRET)
  87. }
  88. // Like DoString but panics on error
  89. func (L *State) MustDoString(str string) {
  90. if err := L.DoString(str); err != nil {
  91. panic(err)
  92. }
  93. }
  94. // luaL_getmetafield
  95. func (L *State) GetMetaField(obj int, e string) bool {
  96. Ce := C.CString(e)
  97. defer C.free(unsafe.Pointer(Ce))
  98. return C.luaL_getmetafield(L.s, C.int(obj), Ce) != 0
  99. }
  100. // luaL_getmetatable
  101. func (L *State) LGetMetaTable(tname string) {
  102. Ctname := C.CString(tname)
  103. defer C.free(unsafe.Pointer(Ctname))
  104. C.lua_getfield(L.s, LUA_REGISTRYINDEX, Ctname)
  105. }
  106. // luaL_gsub
  107. func (L *State) GSub(s string, p string, r string) string {
  108. Cs := C.CString(s)
  109. Cp := C.CString(p)
  110. Cr := C.CString(r)
  111. defer func() {
  112. C.free(unsafe.Pointer(Cs))
  113. C.free(unsafe.Pointer(Cp))
  114. C.free(unsafe.Pointer(Cr))
  115. }()
  116. return C.GoString(C.luaL_gsub(L.s, Cs, Cp, Cr))
  117. }
  118. // luaL_loadfile
  119. func (L *State) LoadFile(filename string) int {
  120. Cfilename := C.CString(filename)
  121. defer C.free(unsafe.Pointer(Cfilename))
  122. return int(lualLoadFile(L.s, Cfilename))
  123. }
  124. // luaL_loadstring
  125. func (L *State) LoadString(s string) int {
  126. Cs := C.CString(s)
  127. defer C.free(unsafe.Pointer(Cs))
  128. return int(C.luaL_loadstring(L.s, Cs))
  129. }
  130. // lua_dump
  131. func (L *State) Dump() int {
  132. ret := int(C.dump_chunk(L.s))
  133. return ret
  134. }
  135. // lua_load
  136. func (L *State) Load(bs []byte, name string) int {
  137. chunk := C.CString(string(bs))
  138. ckname := C.CString(name)
  139. defer C.free(unsafe.Pointer(chunk))
  140. defer C.free(unsafe.Pointer(ckname))
  141. ret := int(C.load_chunk(L.s, chunk, C.int(len(bs)), ckname))
  142. if ret != 0 {
  143. return ret
  144. }
  145. return 0
  146. }
  147. // luaL_newmetatable
  148. func (L *State) NewMetaTable(tname string) bool {
  149. Ctname := C.CString(tname)
  150. defer C.free(unsafe.Pointer(Ctname))
  151. return C.luaL_newmetatable(L.s, Ctname) != 0
  152. }
  153. // luaL_newstate
  154. func NewState() *State {
  155. ls := (C.luaL_newstate())
  156. if ls == nil {
  157. return nil
  158. }
  159. L := newState(ls)
  160. return L
  161. }
  162. // luaL_openlibs
  163. func (L *State) OpenLibs() {
  164. C.luaL_openlibs(L.s)
  165. C.clua_hide_pcall(L.s)
  166. }
  167. // luaL_optinteger
  168. func (L *State) OptInteger(narg int, d int) int {
  169. return int(C.luaL_optinteger(L.s, C.int(narg), C.lua_Integer(d)))
  170. }
  171. // luaL_optnumber
  172. func (L *State) OptNumber(narg int, d float64) float64 {
  173. return float64(C.luaL_optnumber(L.s, C.int(narg), C.lua_Number(d)))
  174. }
  175. // luaL_optstring
  176. func (L *State) OptString(narg int, d string) string {
  177. var length C.size_t
  178. Cd := C.CString(d)
  179. defer C.free(unsafe.Pointer(Cd))
  180. return C.GoString(C.luaL_optlstring(L.s, C.int(narg), Cd, &length))
  181. }
  182. // luaL_ref
  183. func (L *State) Ref(t int) int {
  184. return int(C.luaL_ref(L.s, C.int(t)))
  185. }
  186. // luaL_typename
  187. func (L *State) LTypename(index int) string {
  188. return C.GoString(C.lua_typename(L.s, C.lua_type(L.s, C.int(index))))
  189. }
  190. // luaL_unref
  191. func (L *State) Unref(t int, ref int) {
  192. C.luaL_unref(L.s, C.int(t), C.int(ref))
  193. }
  194. // luaL_where
  195. func (L *State) Where(lvl int) {
  196. C.luaL_where(L.s, C.int(lvl))
  197. }