示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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);
}
示例#4
0
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;
}
示例#5
0
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);
}
示例#6
0
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);
}
示例#7
0
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);

}
示例#8
0
文件: types.c 项目: rikles/darktable
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;
}
示例#9
0
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);
}
示例#10
0
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);
}
示例#11
0
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;
}
示例#12
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);
}
示例#13
0
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);

}
示例#14
0
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");
  }
}
示例#15
0
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);

};
示例#16
0
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);

}
示例#17
0
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);
}
示例#18
0
文件: types.c 项目: rikles/darktable
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));
}
示例#19
0
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; }

}