summaryrefslogtreecommitdiff
path: root/libs/honeysuckle/src/hs_create_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/honeysuckle/src/hs_create_table.c')
-rw-r--r--libs/honeysuckle/src/hs_create_table.c123
1 files changed, 0 insertions, 123 deletions
diff --git a/libs/honeysuckle/src/hs_create_table.c b/libs/honeysuckle/src/hs_create_table.c
deleted file mode 100644
index 422a480..0000000
--- a/libs/honeysuckle/src/hs_create_table.c
+++ /dev/null
@@ -1,123 +0,0 @@
-#include <stdlib.h>
-
-#include "honeysuckle.h"
-
-static void push_value(lua_State *L, hs_type type, hs_value value)
-{
- switch (type) {
- case HS_BOOL:
- lua_pushboolean(L, value.boolean);
- break;
-
- case HS_INT:
- lua_pushinteger(L, value.integer);
- break;
-
- case HS_NUM:
- lua_pushnumber(L, value.number);
- break;
-
- case HS_STR:
- lua_pushstring(L, value.string);
- break;
-
- case HS_TBL:
- lua_pushvalue(L, value.stack_index);
- break;
-
- case HS_FUNC:
- lua_pushvalue(L, value.stack_index);
- break;
-
- case HS_CFUNC:
- lua_pushcfunction(L, value.function);
- break;
-
- case HS_USER:
- lua_pushvalue(L, value.stack_index);
- break;
-
- case HS_LIGHT:
- lua_pushlightuserdata(L, value.userdata);
- break;
-
- default:
- hs_throw_error(L, "attempted to push data of invalid type %d", type);
- break;
- }
-}
-
-
-static inline bool poppable(hs_type type)
-{
- if (type == HS_TBL ||
- type == HS_FUNC ||
- type == HS_USER) {
- return true;
- }
- return false;
-}
-
-
-static void print_stack(lua_State *L)
-{
- printf("stack: %d [", lua_gettop(L));
- for (int i=0; i<lua_gettop(L); i++) {
- printf(" %s, ", lua_typename(L, lua_type(L, i+1)));
- }
- printf("]\n");
-}
-
-
-int descending(const void *a, const void *b)
-{
- return (*(int*)b - *(int*)a);
-}
-
-int hs_create_table_(lua_State *L,
- int n_elements,
- struct hs_tbl_entry *elements)
-{
- // printf("start\n");
-
- // print_stack(L);
- lua_createtable(L, 0, n_elements);
- int index = lua_gettop(L);
- // print_stack(L);
-
- for (int i=0; i<n_elements; i++) {
- // printf("pushing element %d...\n", i);
- struct hs_tbl_entry *e = elements + i;
- push_value(L, e->key_type, e->key);
- // print_stack(L);
- push_value(L, e->value_type, e->value);
- // print_stack(L);
- lua_rawset(L, index);
- // print_stack(L);
- }
-
- int n_poppable = 0;
- int pop_indices[n_elements];
-
- for (int i=0; i<n_elements; i++) {
- struct hs_tbl_entry *e = elements + i;
- if (poppable(e->key_type))
- pop_indices[n_poppable++] = e->key.stack_index;
- if (poppable(e->value_type))
- pop_indices[n_poppable++] = e->value.stack_index;
- }
-
- // printf("cleaning up\n");
-
- qsort(pop_indices, n_poppable, sizeof(int), descending);
- for (int i=0; i<n_poppable; i++) {
- lua_remove(L, pop_indices[i]);
- index -= 1;
- // print_stack(L);
- }
-
-
- // printf("exit\n");
-
- return index;
-}