static void typecheck_config_ifgrouplist(config_setting_t *list) { assert(config_setting_is_list(list)); for (int i = 0; i < config_setting_length(list); i++) { config_setting_t *ifgroup = config_setting_get_elem(list, i); if (!config_setting_is_group(ifgroup)) die("Interface group lists must only contain groups."); typecheck_config_ifgroup(ifgroup); } }
int config_setting_copy(config_setting_t *parent, const config_setting_t *src) { if (!config_setting_is_group(parent) && !config_setting_is_list(parent)) return CONFIG_FALSE; if (config_setting_is_aggregate(src)) { libconfig->setting_copy_aggregate(parent, src); } else { libconfig->setting_copy_simple(parent, src); } return CONFIG_TRUE; }
/** * @brief Extracts the MAC module's names and loads the modules. * @param configuration The root configuration containing the mac member. The * root configuration has to be a group setting always. * @return The status of the operation */ common_type_error_t pfm_init(config_setting_t* configuration) { config_setting_t *mac; common_type_error_t err; int i; assert(config_setting_is_group(configuration)); // Fetch and check the MAC module configuration sections mac = config_setting_get_member(configuration, PFM_CONFIG_MAC); if (mac == NULL ) { logging_adapter_info("Can't locate the \"%s\" list directive.", PFM_CONFIG_MAC); return COMMON_TYPE_ERR_CONFIG; } if (!config_setting_is_list(mac)) { logging_adapter_info("The \"%s\" directive isn't a list.", PFM_CONFIG_MAC); return COMMON_TYPE_ERR_CONFIG; } // Allocate the mac module vector. pfm_macVectorLength = config_setting_length(mac); assert(pfm_macVectorLength >= 0); pfm_macVector = malloc(pfm_macVectorLength * sizeof(pfm_macVector[0])); if (pfm_macVector == NULL ) { return COMMON_TYPE_ERR; } memset(pfm_macVector, 0, pfm_macVectorLength * sizeof(pfm_macVector[0])); // Load the mac modules for (i = 0; i < pfm_macVectorLength; i++) { err = pfm_installMacModule(config_setting_get_elem(mac, i), i); if (err != COMMON_TYPE_SUCCESS) { return err; } } return COMMON_TYPE_SUCCESS; }
/** * Reads and parses an entry from the quest_db. * * @param cs The config setting containing the entry. * @param n The sequential index of the current config setting. * @param source The source configuration file. * @return The parsed quest entry. * @retval NULL in case of errors. */ struct quest_db *quest_read_db_sub(struct config_setting_t *cs, int n, const char *source) { struct quest_db *entry = NULL; struct config_setting_t *t = NULL; int i32 = 0, quest_id; const char *str = NULL; /* * Id: Quest ID [int] * Name: Quest Name [string] * TimeLimit: Time Limit (seconds) [int, optional] * Targets: ( [array, optional] * { * MobId: Mob ID [int] * Count: [int] * }, * ... (can repeated up to MAX_QUEST_OBJECTIVES times) * ) * Drops: ( * { * ItemId: Item ID to drop [int] * Rate: Drop rate [int] * MobId: Mob ID to match [int, optional] * }, * ... (can be repeated) * ) */ if (!libconfig->setting_lookup_int(cs, "Id", &quest_id)) { ShowWarning("quest_read_db: Missing id in \"%s\", entry #%d, skipping.\n", source, n); return NULL; } if (quest_id < 0 || quest_id >= MAX_QUEST_DB) { ShowWarning("quest_read_db: Invalid quest ID '%d' in \"%s\", entry #%d (min: 0, max: %d), skipping.\n", quest_id, source, n, MAX_QUEST_DB); return NULL; } if (!libconfig->setting_lookup_string(cs, "Name", &str) || !*str) { ShowWarning("quest_read_db_sub: Missing Name in quest %d of \"%s\", skipping.\n", quest_id, source); return NULL; } CREATE(entry, struct quest_db, 1); entry->id = quest_id; //safestrncpy(entry->name, str, sizeof(entry->name)); if (libconfig->setting_lookup_int(cs, "TimeLimit", &i32)) // This is an unsigned value, do not check for >= 0 entry->time = (unsigned int)i32; if ((t=libconfig->setting_get_member(cs, "Targets")) && config_setting_is_list(t)) { int i, len = libconfig->setting_length(t); for (i = 0; i < len && entry->objectives_count < MAX_QUEST_OBJECTIVES; i++) { // Note: We ensure that objectives_count < MAX_QUEST_OBJECTIVES because // quest_log (as well as the client) expect this maximum size. struct config_setting_t *tt = libconfig->setting_get_elem(t, i); int mob_id = 0, count = 0; if (!tt) break; if (!config_setting_is_group(tt)) continue; if (!libconfig->setting_lookup_int(tt, "MobId", &mob_id) || mob_id <= 0) continue; if (!libconfig->setting_lookup_int(tt, "Count", &count) || count <= 0) continue; RECREATE(entry->objectives, struct quest_objective, ++entry->objectives_count); entry->objectives[entry->objectives_count-1].mob = mob_id; entry->objectives[entry->objectives_count-1].count = count; } }
/********************* return RET_NOK on error *********************/ ret_code_t entry_copy_config(config_setting_t * source, config_setting_t * dest) { config_setting_t * new_source; config_setting_t * new_dest; int index = -1; int int_value; long long long_value; double double_value; const char * string; while((new_source=config_setting_get_elem(source,index+1))!= NULL ) { index++; if(config_setting_is_group(new_source)) { if(!entry_copy_aggregate(new_source,dest,CONFIG_TYPE_GROUP)) { return RET_NOK; } } else if(config_setting_is_array(new_source)) { if(!entry_copy_aggregate(new_source,dest,CONFIG_TYPE_ARRAY)) { return RET_NOK; } } else if(config_setting_is_list(new_source)) { if(!entry_copy_aggregate(new_source,dest,CONFIG_TYPE_LIST)) { return RET_NOK; } } else { switch(config_setting_type(new_source)) { case CONFIG_TYPE_INT: int_value = config_setting_get_int(new_source); new_dest = config_setting_add (dest, config_setting_name(new_source),CONFIG_TYPE_INT); config_setting_set_int(new_dest,int_value); continue; case CONFIG_TYPE_INT64: long_value = config_setting_get_int64(new_source); new_dest = config_setting_add (dest, config_setting_name(new_source),CONFIG_TYPE_INT64); config_setting_set_int64(new_dest,long_value); continue; case CONFIG_TYPE_FLOAT: double_value = config_setting_get_float(new_source); new_dest = config_setting_add (dest, config_setting_name(new_source),CONFIG_TYPE_FLOAT); config_setting_set_float(new_dest,double_value); continue; case CONFIG_TYPE_BOOL: int_value = config_setting_get_bool(new_source); new_dest = config_setting_add (dest, config_setting_name(new_source),CONFIG_TYPE_BOOL); config_setting_set_bool(new_dest,int_value); continue; case CONFIG_TYPE_STRING: string = config_setting_get_string(new_source); new_dest = config_setting_add (dest, config_setting_name(new_source),CONFIG_TYPE_STRING); config_setting_set_string(new_dest,string); continue; default: return RET_NOK; } } } return RET_OK; }
static const char *test_libconfig_setting_types(void) { struct config_t config; struct config_setting_t *t; const char *input = "/* Test File */\n" "Setting_Int: 1;\n" "Setting_Int64: 1L;\n" "Setting_Float: 1.0;\n" "Setting_Bool: true;\n" "Setting_String: \"1\";\n" "Setting_Array: [ ];\n" "Setting_Group: { };\n" "Setting_List: ( );\n" "/* End test file */\n"; if (libconfig->read_string(&config, input) == CONFIG_FALSE) { libconfig->destroy(&config); return "Unable to parse configuration."; } if (config_setting_type(config.root) != CONFIG_TYPE_GROUP) { libconfig->destroy(&config); return "CONFIG_TYPE_GROUP failed."; } if ((t = libconfig->lookup(&config, "Setting_Int")) == NULL || config_setting_type(t) != CONFIG_TYPE_INT || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_INT failed."; } if ((t = libconfig->lookup(&config, "Setting_Int64")) == NULL || config_setting_type(t) != CONFIG_TYPE_INT64 || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_INT64 failed."; } if ((t = libconfig->lookup(&config, "Setting_Float")) == NULL || config_setting_type(t) != CONFIG_TYPE_FLOAT || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_FLOAT failed."; } if ((t = libconfig->lookup(&config, "Setting_Bool")) == NULL || config_setting_type(t) != CONFIG_TYPE_BOOL || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_BOOL failed."; } if ((t = libconfig->lookup(&config, "Setting_String")) == NULL || config_setting_type(t) != CONFIG_TYPE_STRING || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_STRING failed."; } if ((t = libconfig->lookup(&config, "Setting_Array")) == NULL || config_setting_type(t) != CONFIG_TYPE_ARRAY || config_setting_is_group(t) || !config_setting_is_array(t) || config_setting_is_list(t) || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_ARRAY failed."; } if ((t = libconfig->lookup(&config, "Setting_Group")) == NULL || config_setting_type(t) != CONFIG_TYPE_GROUP || !config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_GROUP failed."; } if ((t = libconfig->lookup(&config, "Setting_List")) == NULL || config_setting_type(t) != CONFIG_TYPE_LIST || config_setting_is_group(t) || config_setting_is_array(t) || !config_setting_is_list(t) || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_LIST failed."; } libconfig->destroy(&config); return NULL; }
void load_he_item(const char * filename, struct lt_db_t * db) { int i = 0; int cnt = 0; int status = 0; /* error reporting */ int offset = 0; char error[4096]; /* libconfig */ config_t * cfg = calloc(1, sizeof(config_t)); config_setting_t * item_db = NULL; config_setting_t * item_row = NULL; config_setting_t * item_sub = NULL; /* item_db */ he_item_t item; config_init(cfg); /* read item_db.conf */ status = config_read_file(cfg, filename); if(status != CONFIG_TRUE) { offset = sprintf(error, "%s;%d;%s", config_error_file(cfg), config_error_line(cfg), config_error_text(cfg)); error[offset] = '\0'; /*exit_abt(error);*/ } /* retrieve data */ item_db = config_lookup(cfg, "item_db"); if(config_setting_is_list(item_db)) { cnt = config_setting_length(item_db); sqlite3_exec(db->db, "BEGIN IMMEDIATE TRANSACTION;", NULL, NULL, NULL); for(i = 0; i < cnt; i++) { item_row = config_setting_get_elem(item_db, i); memset(&item, 0, sizeof(he_item_t)); config_setting_lookup_int(item_row, "Id", &item.id); config_setting_lookup_string(item_row, "AegisName", &item.aegis); config_setting_lookup_string(item_row, "Name", &item.name); config_setting_lookup_int(item_row, "Type", &item.type); config_setting_lookup_int(item_row, "Buy", &item.buy); config_setting_lookup_int(item_row, "Sell", &item.sell); config_setting_lookup_int(item_row, "Weight", &item.weight); config_setting_lookup_int(item_row, "Atk", &item.atk); config_setting_lookup_int(item_row, "Matk", &item.matk); config_setting_lookup_int(item_row, "Def", &item.def); config_setting_lookup_int(item_row, "Range", &item.range); config_setting_lookup_int(item_row, "Slots", &item.slots); config_setting_lookup_int(item_row, "Job", &item.job); config_setting_lookup_int(item_row, "Upper", &item.upper); config_setting_lookup_int(item_row, "Gender", &item.gender); config_setting_lookup_int(item_row, "Loc", &item.loc); config_setting_lookup_int(item_row, "WeaponLv", &item.weaponlv); item_sub = config_setting_get_member(item_row, "EquipLv"); if(item_sub != NULL && config_setting_is_list(item_sub) == CONFIG_TRUE) { item.equiplv[EQUIP_MIN] = config_setting_get_int_elem(item_sub, EQUIP_MIN); item.equiplv[EQUIP_MAX] = config_setting_get_int_elem(item_sub, EQUIP_MAX); } else if(item_sub != NULL) { config_setting_lookup_int(item_sub, "EquipLv", &item.equiplv[EQUIP_MIN]); item.equiplv[EQUIP_MAX] = item.equiplv[EQUIP_MIN]; } config_setting_lookup_bool(item_row, "Refine", &item.refine); config_setting_lookup_int(item_row, "View", &item.view); config_setting_lookup_bool(item_row, "BindOnEquip", &item.bindonequip); config_setting_lookup_bool(item_row, "BuyingStore", &item.buyingstore); config_setting_lookup_int(item_row, "Delay", &item.delay); item_sub = config_setting_get_member(item_row, "Trade"); if(item_sub != NULL && config_setting_is_group(item_sub) == CONFIG_TRUE) { config_setting_lookup_int(item_row, "override", &item.trade[TRADE_OVERRIDE]); config_setting_lookup_bool(item_row, "nodrop", &item.trade[TRADE_NODROP]); config_setting_lookup_bool(item_row, "notrade", &item.trade[TRADE_NOTRADE]); config_setting_lookup_bool(item_row, "partneroverride", &item.trade[TRADE_PARTNEROVERRIDE]); config_setting_lookup_bool(item_row, "noselltonpc", &item.trade[TRADE_NOSELLTONPC]); config_setting_lookup_bool(item_row, "nocart", &item.trade[TRADE_NOCART]); config_setting_lookup_bool(item_row, "nostorage", &item.trade[TRADE_NOSTORAGE]); config_setting_lookup_bool(item_row, "nogstorage", &item.trade[TRADE_NOGSTORAGE]); config_setting_lookup_bool(item_row, "nomail", &item.trade[TRADE_NOMAIL]); config_setting_lookup_bool(item_row, "noauction", &item.trade[TRADE_NOAUCTION]); } item_sub = config_setting_get_member(item_row, "Nouse"); if(item_sub != NULL && config_setting_is_group(item_sub) == CONFIG_TRUE) { config_setting_lookup_int(item_row, "override", &item.trade[NOUSE_OVERRIDE]); config_setting_lookup_bool(item_row, "sitting", &item.trade[NOUSE_SITTING]); } item_sub = config_setting_get_member(item_row, "Stack"); if(item_sub != NULL && config_setting_is_list(item_sub) == CONFIG_TRUE) { item.equiplv[STACK_AMOUNT] = config_setting_get_int_elem(item_sub, STACK_AMOUNT); item.equiplv[STACK_TYPE] = config_setting_get_int_elem(item_sub, STACK_TYPE); } config_setting_lookup_string(item_row, "Script", &item.script); config_setting_lookup_string(item_row, "OnEquipScript", &item.onequipscript); config_setting_lookup_string(item_row, "OnUnequipScript", &item.onunequipscript); if(item.script == NULL) item.script = ""; if(item.onequipscript == NULL) item.onequipscript = ""; if(item.onunequipscript == NULL) item.onunequipscript = ""; he_item_db_insert(db, &item); } sqlite3_exec(db->db, "COMMIT TRANSACTION;", NULL, NULL, NULL); } else { /*exit_abt("item configuration file root setting.");*/ } config_destroy(cfg); free(cfg); }