const char* luaA_struct_next_member_name_typeid(lua_State* L, luaA_Type type, const char* member) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { if( se->num_members == 0) { return NULL; } if(member == NULL && se->num_members > 0) { return se->members[0]->name; } for(int j = 0; j < se->num_members; j++) { if (strcmp(se->members[j]->name, member) == 0) { j++; if(j == se->num_members) return NULL; return se->members[j]->name; } } lua_pushfstring(L, "luaA_struct_to_member_name: Member '%s' not registered for struct '%s'!", member, luaA_type_name(type)); lua_error(L); return NULL; } lua_pushfstring(L, "lua_autostruct: Struct '%s' not registered!", luaA_type_name(type)); lua_error(L); return NULL; }
luaA_Type dt_lua_init_type_typeid(lua_State* L, luaA_Type type_id) { luaL_newmetatable(L,luaA_type_name(type_id)); lua_pushstring(L,luaA_type_name(type_id)); lua_setfield(L,-2,"__luaA_TypeName"); lua_pushnumber(L,type_id); lua_setfield(L,-2,"__luaA_Type"); luaA_conversion_typeid(type_id,dt_lua_autotype_full_pushfunc,dt_lua_autotype_tofunc); lua_pushcfunction(L,dt_lua_autotype_next); lua_setfield(L,-2,"__next"); lua_pushcfunction(L,dt_lua_autotype_pairs); lua_setfield(L,-2,"__pairs"); lua_pushcfunction(L,dt_lua_autotype_index); lua_setfield(L,-2,"__index"); lua_pushcfunction(L,dt_lua_autotype_newindex); lua_setfield(L,-2,"__newindex"); lua_newtable(L); lua_setfield(L,-2,"__get"); lua_newtable(L); lua_setfield(L,-2,"__set"); // remove the metatable lua_pop(L,1); return type_id; }
void luaA_struct_member_typeid(lua_State* L, luaA_Type type, const char* member, luaA_Type member_type, size_t offset) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { if (se->num_members >= se->num_reserved_members) { se->num_reserved_members += 32; se->members = realloc(se->members, sizeof(struct_member_entry*) * se->num_reserved_members); } struct_member_entry* sme = malloc(sizeof(struct_member_entry)); sme->type = member_type; sme->offset = offset; sme->name = malloc(strlen(member) + 1); strcpy(sme->name, member); se->members[se->num_members] = sme; se->num_members++; return; } lua_pushfstring(L, "lua_autostruct: Struct '%s' not registered!", luaA_type_name(type)); lua_error(L); }
bool luaA_struct_has_member_name_typeid(lua_State* L, luaA_Type type, const char* member) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { for(int j = 0; j < se->num_members; j++) { if (strcmp(se->members[j]->name, member) == 0) { return true; } } return false; } lua_pushfstring(L, "lua_autostruct: Struct '%s' not registered!", luaA_type_name(type)); lua_error(L); return false; }
void dt_lua_register_type_callback_typeid(lua_State* L,luaA_Type type_id,lua_CFunction index, lua_CFunction newindex,...) { luaL_getmetatable(L,luaA_type_name(type_id)); // gets the metatable since it's supposed to exist luaL_getsubtable(L,-1,"__get"); luaL_getsubtable(L,-2,"__set"); va_list key_list; va_start(key_list,newindex); const char* key = va_arg(key_list,const char*); while(key) { lua_pushcfunction(L,index); lua_setfield(L,-3,key); if(newindex) { lua_pushcfunction(L,newindex); } else { lua_pushnil(L); } lua_setfield(L,-2,key); key = va_arg(key_list,const char*); } va_end(key_list); lua_pop(L,3); }
void dt_lua_register_type_callback_type_typeid(lua_State* L,luaA_Type type_id,lua_CFunction index, lua_CFunction newindex,luaA_Type struct_type_id) { luaL_getmetatable(L,luaA_type_name(type_id)); // gets the metatable since it's supposed to exist luaL_getsubtable(L,-1,"__get"); luaL_getsubtable(L,-2,"__set"); if(!index && !newindex) { index = lautoc_struct_index; newindex = lautoc_struct_newindex; } const char* member = luaA_struct_next_member_name_typeid(L,struct_type_id,LUAA_INVALID_MEMBER_NAME); while(member != LUAA_INVALID_MEMBER_NAME) { lua_pushnumber(L,struct_type_id); lua_pushcclosure(L,index,1); lua_setfield(L,-3,member); if(newindex) { lua_pushnumber(L,struct_type_id); lua_pushcclosure(L,newindex,1); lua_setfield(L,-2,member); } member = luaA_struct_next_member_name_typeid(L,struct_type_id,member); } lua_pop(L,3); }
void luaA_struct_to_typeid(lua_State* L, luaA_Type type, void* c_out, int index) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { for(int j = 0; j < se->num_members; j++) { struct_member_entry* sme = se->members[j]; lua_getfield(L, index, sme->name); luaA_struct_to_member_name_typeid(L, type, c_out, sme->name, index); } return; } lua_pushfstring(L, "lua_autostruct: Struct '%s' not registered!", luaA_type_name(type)); lua_error(L); }
int dt_lua_autotype_full_pushfunc(lua_State *L, luaA_Type type_id, const void *cin) { size_t type_size= luaA_type_size(type_id); void* udata = lua_newuserdata(L,type_size); memcpy(udata,cin,type_size); luaL_setmetatable(L,luaA_type_name(type_id)); return 1; }
luaA_Type luaA_struct_typeof_member_name_typeid(lua_State* L, luaA_Type type, const char* member) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { for(int j = 0; j < se->num_members; j++) { if (strcmp(se->members[j]->name, member) == 0) { struct_member_entry* sme = se->members[j]; return sme->type; } } lua_pushfstring(L, "luaA_struct_typeof_member_name: Member '%s' not registered for struct '%s'!", member, luaA_type_name(type)); return lua_error(L); } lua_pushfstring(L, "luaA_struct_typeof_member_name: Struct '%s' not registered!", luaA_type_name(type)); return lua_error(L); }
void dt_lua_register_type_callback_stack_typeid(lua_State* L,luaA_Type type_id,const char* name) { luaL_getmetatable(L,luaA_type_name(type_id)); // gets the metatable since it's supposed to exist luaL_getsubtable(L,-1,"__get"); luaL_getsubtable(L,-2,"__set"); lua_pushvalue(L,-4); lua_pushcclosure(L,type_const_index,1); lua_setfield(L,-3,name); lua_pop(L,4); }
int luaA_struct_push_typeid(lua_State* L, luaA_Type type,const void* c_in) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { lua_newtable(L); for(int j = 0; j < se->num_members; j++) { struct_member_entry* sme = se->members[j]; luaA_struct_push_member_name_typeid(L, type, c_in, sme->name); lua_setfield(L, -2, sme->name); } return 1; } lua_pushfstring(L, "lua_autostruct: Struct '%s' not registered!", luaA_type_name(type)); lua_error(L); return 0; }
void luaA_struct_to_member_offset_typeid(lua_State* L, luaA_Type type, void* cstruct, size_t offset, int index) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se != NULL) { for(int j = 0; j < se->num_members; j++) { if (se->members[j]->offset == offset) { struct_member_entry* sme = se->members[j]; return luaA_to_typeid(L, sme->type, cstruct+sme->offset, index); } } lua_pushfstring(L, "luaA_struct_to_member: Member offset '%i' not registered for struct '%s'!", offset, luaA_type_name(type)); lua_error(L); } lua_pushfstring(L, "luaA_struct_to_member: Struct '%s' not registered!", luaA_type_name(type)); lua_error(L); }
void luaA_struct_typeid(lua_State* L, luaA_Type type) { struct_entry* se = malloc(sizeof(struct_entry)); se->type_id = type; se->num_members = 0; se->num_reserved_members = 32; se->members = malloc(sizeof(struct_member_entry*) * se->num_reserved_members); luaA_hashtable_set(struct_table, luaA_type_name(type), se); }
void dt_lua_register_type_callback_default_typeid(lua_State* L,luaA_Type type_id,lua_CFunction index, lua_CFunction newindex,lua_CFunction next) { luaL_getmetatable(L,luaA_type_name(type_id)); // gets the metatable since it's supposed to exist lua_pushcfunction(L,index); lua_setfield(L,-2,"__default_index"); lua_pushcfunction(L,newindex); lua_setfield(L,-2,"__default_newindex"); if(next) { lua_pushcfunction(L,next); lua_setfield(L,-2,"__default_next"); } }
void dt_lua_register_storage_typeid(lua_State* L, dt_imageio_module_storage_t* module, luaA_Type type_id) { dt_lua_register_type_callback_list_typeid(L,type_id,storage_index,NULL,storage_fields_name); luaL_getmetatable(L,luaA_type_name(type_id)); lua_pushlightuserdata(L,module); lua_setfield(L,-2,"__associated_object"); lua_pushstring(L,"storage"); lua_setfield(L,-2,"__module_type"); lua_pop(L,1); // pop the metatable // add to the table dt_lua_push_darktable_lib(L); dt_lua_goto_subtable(L,"modules"); dt_lua_goto_subtable(L,"storage"); lua_getmetatable(L,-1); lua_getfield(L,-1,"__luaA_Type"); luaA_Type storage_table_type = luaL_checkint(L,-1); dt_lua_register_type_callback_typeid(L,storage_table_type,get_storage_params,NULL,module->plugin_name,NULL); lua_pop(L,3); };
void dt_lua_register_type_callback_number_typeid(lua_State* L,luaA_Type type_id,lua_CFunction index, lua_CFunction newindex,lua_CFunction length) { luaL_getmetatable(L,luaA_type_name(type_id)); // gets the metatable since it's supposed to exist lua_pushcfunction(L,index); lua_setfield(L,-2,"__number_index"); lua_pushcfunction(L,newindex); lua_setfield(L,-2,"__number_newindex"); if(length) { lua_pushcfunction(L,length); lua_setfield(L,-2,"__len"); lua_pushcfunction(L,dt_lua_autotype_ipairs); lua_setfield(L,-2,"__ipairs"); lua_pushcfunction(L,dt_lua_autotype_inext); lua_setfield(L,-2,"__inext"); } lua_pop(L,1); }
void dt_lua_register_type_callback_list_typeid(lua_State* L,luaA_Type type_id,lua_CFunction index, lua_CFunction newindex,const char**list) { luaL_getmetatable(L,luaA_type_name(type_id)); // gets the metatable since it's supposed to exist luaL_getsubtable(L,-1,"__get"); luaL_getsubtable(L,-2,"__set"); const char** key = list; while(*key) { lua_pushcfunction(L,index); lua_setfield(L,-3,*key); if(newindex) { lua_pushcfunction(L,newindex); } else { lua_pushnil(L); } lua_setfield(L,-2,*key); key ++; } lua_pop(L,3); }
void dt_lua_autotype_tofunc(lua_State*L, luaA_Type type_id, void* cout, int index) { void * udata = luaL_checkudata(L,index,luaA_type_name(type_id)); memcpy(cout,udata,luaA_type_size(type_id)); }
bool luaA_struct_registered_typeid(lua_State* L, luaA_Type type) { struct_entry* se = luaA_hashtable_get(struct_table, luaA_type_name(type)); if (se == NULL) { return false; } else { return true; } }