示例#1
0
文件: pc_groups.c 项目: AsaK/rathena
/**
 * Checks if player group can use @/#command
 * @param group_id ID of the group
 * @param command Command name without @/# and params
 * @param type enum AtCommanndType { COMMAND_ATCOMMAND = 1, COMMAND_CHARCOMMAND = 2 }
 */
bool pc_group_can_use_command(int group_id, const char *command, AtCommandType type)
{
	int result = 0;
	config_setting_t *commands = NULL;
	GroupSettings *group = NULL;

	if (pc_group_has_permission(group_id, PC_PERM_USE_ALL_COMMANDS))
		return true;

	if ((group = id2group(group_id)) == NULL)
		return false;

	commands = group->commands;
	if (commands != NULL) {
		config_setting_t *cmd = NULL;
		
		// <commandname> : <bool> (only atcommand)
		if (type == COMMAND_ATCOMMAND && config_setting_lookup_bool(commands, command, &result))
			return (bool)result;

		// <commandname> : [ <bool>, <bool> ] ([ atcommand, charcommand ])
		if ((cmd = config_setting_get_member(commands, command)) != NULL &&
		    config_setting_is_aggregate(cmd) && config_setting_length(cmd) == 2)
			return (bool)config_setting_get_bool_elem(cmd, AtCommandType2idx(type));
	}
	return false;
}
示例#2
0
文件: conf.c 项目: 3298021/Hercules
//
// Functions to copy settings from libconfig/contrib
//
void config_setting_copy_simple(config_setting_t *parent, const config_setting_t *src) {
	if (config_setting_is_aggregate(src)) {
		libconfig->setting_copy_aggregate(parent, src);
	}
	else {
		config_setting_t *set;

		if( libconfig->setting_get_member(parent, config_setting_name(src)) != NULL )
			return;

		if ((set = libconfig->setting_add(parent, config_setting_name(src), config_setting_type(src))) == NULL)
			return;

		if (CONFIG_TYPE_INT == config_setting_type(src)) {
			libconfig->setting_set_int(set, libconfig->setting_get_int(src));
			libconfig->setting_set_format(set, src->format);
		} else if (CONFIG_TYPE_INT64 == config_setting_type(src)) {
			libconfig->setting_set_int64(set, libconfig->setting_get_int64(src));
			libconfig->setting_set_format(set, src->format);
		} else if (CONFIG_TYPE_FLOAT == config_setting_type(src)) {
			libconfig->setting_set_float(set, libconfig->setting_get_float(src));
		} else if (CONFIG_TYPE_STRING == config_setting_type(src)) {
			libconfig->setting_set_string(set, libconfig->setting_get_string(src));
		} else if (CONFIG_TYPE_BOOL == config_setting_type(src)) {
			libconfig->setting_set_bool(set, libconfig->setting_get_bool(src));
		}
	}
}
示例#3
0
文件: conf.c 项目: 3298021/Hercules
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;
}
示例#4
0
文件: conf.c 项目: 3298021/Hercules
void config_setting_copy_elem(config_setting_t *parent, const config_setting_t *src) {
	config_setting_t *set = NULL;

	if (config_setting_is_aggregate(src))
		libconfig->setting_copy_aggregate(parent, src);
	else if (CONFIG_TYPE_INT == config_setting_type(src)) {
		set = libconfig->setting_set_int_elem(parent, -1, libconfig->setting_get_int(src));
		libconfig->setting_set_format(set, src->format);
	} else if (CONFIG_TYPE_INT64 == config_setting_type(src)) {
		set = libconfig->setting_set_int64_elem(parent, -1, libconfig->setting_get_int64(src));
		libconfig->setting_set_format(set, src->format);
	} else if (CONFIG_TYPE_FLOAT == config_setting_type(src)) {
		libconfig->setting_set_float_elem(parent, -1, libconfig->setting_get_float(src));
	} else if (CONFIG_TYPE_STRING == config_setting_type(src)) {
		libconfig->setting_set_string_elem(parent, -1, libconfig->setting_get_string(src));
	} else if (CONFIG_TYPE_BOOL == config_setting_type(src)) {
		libconfig->setting_set_bool_elem(parent, -1, libconfig->setting_get_bool(src));
	}
}
示例#5
0
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;
}
示例#6
0
文件: settings.c 项目: bradfa/gt
int gt_parse_settings(config_t *config)
{
	config_setting_t *node, *root, *elem;
	int i, len, ret;
	struct stat st;
	const char *filename;

	if (stat(GT_USER_SETTING_PATH, &st) == 0)
		filename = GT_USER_SETTING_PATH;
	else
		filename = GT_SETTING_PATH;

	ret = config_read_file(config, filename);
	if (ret == CONFIG_FALSE)
		return -1;

	root = config_root_setting(config);

#define GET_SETTING(name, field) do { \
	node = config_setting_get_member(root, name); \
	if (node) { \
		if (config_setting_type(node) != CONFIG_TYPE_STRING) { \
			fprintf(stderr, "%s:%d: Expected string\n", \
					config_setting_source_file(node), \
					config_setting_source_line(node)); \
			return -1; \
		} \
		gt_settings.field = config_setting_get_string(node); \
	} \
} while (0)

	GET_SETTING("default-udc", default_udc);
	GET_SETTING("configfs-path", configfs_path);
	GET_SETTING("default-template-path", default_template_path);
	GET_SETTING("default-gadget", default_gadget);

	node = config_setting_get_member(root, "lookup-path");
	if (node) {
		if (config_setting_is_aggregate(node) == CONFIG_FALSE) {
			fprintf(stderr, "%s:%d: Expected list\n",
					config_setting_source_file(node),
					config_setting_source_line(node));
			return -1;
		}

		len = config_setting_length(node);
		gt_settings.lookup_path = calloc(len + 1, sizeof(*gt_settings.lookup_path));
		for (i = 0; i < len; ++i) {
			elem = config_setting_get_elem(node, i);
			if (config_setting_type(elem) != CONFIG_TYPE_STRING) {
				fprintf(stderr, "%s:%d: Expected string\n",
					config_setting_source_file(elem),
					config_setting_source_line(elem));
				goto out;
			}
			gt_settings.lookup_path[i] = config_setting_get_string(elem);
		}
	}

#undef GET_SETTING

	return 0;
out:
	free(gt_settings.lookup_path);
	return -1;
}