2 * Lua module wrapping librados::bufferlist
9 #include "include/types.h"
10 #include "include/buffer.h"
11 #include "objclass/objclass.h"
12 #include "cls/lua/cls_lua.h"
14 #define LUA_BUFFERLIST "ClsLua.Bufferlist"
16 struct bufferlist_wrap {
18 int gc; /* do garbage collect? */
21 static inline struct bufferlist_wrap *to_blwrap(lua_State *L, int pos = 1)
23 return (bufferlist_wrap *)luaL_checkudata(L, pos, LUA_BUFFERLIST);
26 bufferlist *clslua_checkbufferlist(lua_State *L, int pos)
28 struct bufferlist_wrap *blw = to_blwrap(L, pos);
33 * Pushes a new bufferlist userdata object onto the stack. If @set is non-null
34 * it is assumed to be a bufferlist that should not be garbage collected.
36 bufferlist *clslua_pushbufferlist(lua_State *L, bufferlist *set)
38 bufferlist_wrap *blw = static_cast<bufferlist_wrap *>(lua_newuserdata(L, sizeof(*blw)));
39 blw->bl = set ? set : new bufferlist();
40 blw->gc = set ? 0 : 1;
41 luaL_getmetatable(L, LUA_BUFFERLIST);
42 lua_setmetatable(L, -2);
47 * Create a new bufferlist
49 static int bl_new(lua_State *L)
51 clslua_pushbufferlist(L, NULL);
56 * Convert bufferlist to Lua string
58 static int bl_str(lua_State *L)
60 bufferlist *bl = clslua_checkbufferlist(L);
61 lua_pushlstring(L, bl->c_str(), bl->length());
66 * Append a Lua string to bufferlist
68 static int bl_append(lua_State *L)
70 bufferlist *bl = clslua_checkbufferlist(L);
71 luaL_checktype(L, 2, LUA_TSTRING);
74 const char *data = lua_tolstring(L, 2, &len);
75 bl->append(data, len);
81 * Return the length in bytes of bufferlist
83 static int bl_len(lua_State *L)
85 bufferlist *bl = clslua_checkbufferlist(L);
86 lua_pushinteger(L, bl->length());
91 * Perform byte-for-byte bufferlist equality test
93 static int bl_eq(lua_State *L)
95 bufferlist *bl1 = clslua_checkbufferlist(L, 1);
96 bufferlist *bl2 = clslua_checkbufferlist(L, 2);
97 lua_pushboolean(L, *bl1 == *bl2 ? 1 : 0);
102 * Bufferlist < operator
104 static int bl_lt(lua_State *L)
106 bufferlist *bl1 = clslua_checkbufferlist(L, 1);
107 bufferlist *bl2 = clslua_checkbufferlist(L, 2);
108 lua_pushboolean(L, *bl1 < *bl2 ? 1 : 0);
113 * Bufferlist <= operator
115 static int bl_le(lua_State *L)
117 bufferlist *bl1 = clslua_checkbufferlist(L, 1);
118 bufferlist *bl2 = clslua_checkbufferlist(L, 2);
119 lua_pushboolean(L, *bl1 <= *bl2 ? 1 : 0);
124 * Bufferlist concatentation
126 static int bl_concat(lua_State *L)
128 bufferlist *bl1 = clslua_checkbufferlist(L, 1);
129 bufferlist *bl2 = clslua_checkbufferlist(L, 2);
130 bufferlist *ret = clslua_pushbufferlist(L, NULL);
131 ret->append(bl1->c_str(), bl1->length());
132 ret->append(bl2->c_str(), bl2->length());
137 * Garbage collect bufferlist
139 static int bl_gc(lua_State *L)
141 struct bufferlist_wrap *blw = to_blwrap(L);
149 static const struct luaL_Reg bufferlist_methods[] = {
151 {"append", bl_append},
152 {"__concat", bl_concat},
161 static const struct luaL_Reg bllib_f[] = {
166 LUALIB_API int luaopen_bufferlist(lua_State *L)
168 /* Setup bufferlist user-data type */
169 luaL_newmetatable(L, LUA_BUFFERLIST);
170 lua_pushvalue(L, -1);
171 lua_setfield(L, -2, "__index");
173 luaL_setfuncs(L, bufferlist_methods, 0);
177 luaL_setfuncs(L, bllib_f, 0);