|
@@ -0,0 +1,114 @@
|
|
|
+#include "lua_lsup.h"
|
|
|
+
|
|
|
+#define check_triple(L) \
|
|
|
+ *(LSUP_Triple **)luaL_checkudata(L, 1, "LSUP.Triple")
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Factory methods.
|
|
|
+ */
|
|
|
+
|
|
|
+static int new (lua_State *L)
|
|
|
+{
|
|
|
+ LSUP_Triple **trp_p = lua_newuserdatauv (L, sizeof (*trp_p), 1);
|
|
|
+ luaL_getmetatable (L, "LSUP.Triple");
|
|
|
+ LSUP_Term
|
|
|
+ *s = *(LSUP_Term **)luaL_checkudata(L, 2, "LSUP.Term"),
|
|
|
+ *p = *(LSUP_Term **)luaL_checkudata(L, 3, "LSUP.Term"),
|
|
|
+ *o = *(LSUP_Term **)luaL_checkudata(L, 4, "LSUP.Term");
|
|
|
+
|
|
|
+ lua_setmetatable (L, -4);
|
|
|
+
|
|
|
+ *trp_p = LSUP_triple_new (s, p, o);
|
|
|
+ if (!*trp_p) luaL_error (L, "Error while creating a triple!");
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Class methods.
|
|
|
+ */
|
|
|
+
|
|
|
+static int gc (lua_State *L)
|
|
|
+{
|
|
|
+ LSUP_Triple *trp = check_triple (L);
|
|
|
+ if (trp) LSUP_triple_free (trp);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int get_term (lua_State *L)
|
|
|
+{
|
|
|
+ const LSUP_Triple *trp = check_triple (L);
|
|
|
+ const int pos = luaL_checkinteger (L, 2);
|
|
|
+ if (pos < TRP_POS_S || pos > TRP_POS_O)
|
|
|
+ luaL_error(L, "Out of range position: %d.", pos);
|
|
|
+
|
|
|
+ lua_pushlightuserdata (L, LSUP_triple_pos (trp, (LSUP_TriplePos)pos));
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int set_term (lua_State *L)
|
|
|
+{
|
|
|
+ LSUP_Triple *trp = check_triple (L);
|
|
|
+ const int pos = luaL_checkinteger (L, 2);
|
|
|
+ const LSUP_Term *t = *(LSUP_Term **)luaL_checkudata(L, 3, "LSUP.Term");
|
|
|
+
|
|
|
+ LSUP_Term *new_t = LSUP_term_copy (t);
|
|
|
+
|
|
|
+ if (pos == TRP_POS_S) {
|
|
|
+ LSUP_term_free (trp->s);
|
|
|
+ trp->s = new_t;
|
|
|
+ } else if (pos == TRP_POS_P) {
|
|
|
+ LSUP_term_free (trp->p);
|
|
|
+ trp->p = new_t;
|
|
|
+ } else if (pos == TRP_POS_O) {
|
|
|
+ LSUP_term_free (trp->o);
|
|
|
+ trp->o = new_t;
|
|
|
+ } else return luaL_error(L, "Out of range position: %d.", pos);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Library setup.
|
|
|
+ */
|
|
|
+
|
|
|
+static const struct luaL_Reg triple_lib_fn [] = {
|
|
|
+ {"new", new},
|
|
|
+ {NULL}
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+static const struct luaL_Reg triple_lib_meth [] = {
|
|
|
+ {"__gc", gc},
|
|
|
+
|
|
|
+ {NULL}
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+int luaopen_triple (lua_State *L)
|
|
|
+{
|
|
|
+ luaL_newmetatable (L, "LSUP.Triple");
|
|
|
+ lua_pushvalue (L, -1);
|
|
|
+ lua_setfield (L, -2, "__index");
|
|
|
+ luaL_setfuncs (L, triple_lib_meth, 0);
|
|
|
+
|
|
|
+ // Enums
|
|
|
+ lua_pushvalue (L, TRP_POS_S);
|
|
|
+ lua_setfield (L, -1, "TRP_POS_S");
|
|
|
+ lua_pushvalue (L, TRP_POS_P);
|
|
|
+ lua_setfield (L, -1, "TRP_POS_P");
|
|
|
+ lua_pushvalue (L, TRP_POS_O);
|
|
|
+ lua_setfield (L, -1, "TRP_POS_O");
|
|
|
+
|
|
|
+ luaL_newlib (L, triple_lib_fn);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|