summaryrefslogtreecommitdiff
path: root/src/config.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@elego.de>2011-03-29 17:44:10 +0200
committerCarlos Martín Nieto <cmn@elego.de>2011-03-29 18:13:47 +0200
commit9a3c5e55fd7894b8732a8010c94d034d674adbf7 (patch)
tree8fb90a8a97327b8c127e21ef730cfb537996c5cd /src/config.c
parent26faa3668fedf1ffc95ef747b28f08b7131870f4 (diff)
downloadlibgit2-9a3c5e55fd7894b8732a8010c94d034d674adbf7.tar.gz
Expose config API for setters, getters and foreach
These functions can be used to query or modify the variables in a given configuration. No sanity checking is done on the variable names. This is mostly meant as an API preview. Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/config.c b/src/config.c
index 5f0c34ab7..f9dbda7e9 100644
--- a/src/config.c
+++ b/src/config.c
@@ -129,6 +129,139 @@ void git_config_free(git_config *cfg)
free(cfg);
}
+/*
+ * Loop over all the variables
+ */
+
+int git_config_foreach(git_config *cfg, int (*fn)(git_cvar *, void *), void *data)
+{
+ int ret = GIT_SUCCESS;
+ git_cvar *var;
+ void *_unused;
+
+ GIT_HASHTABLE_FOREACH(cfg->vars, _unused, var,
+ ret = fn(var, data);
+ if(ret) break;
+ );
+
+ return ret;
+}
+
+/*
+ * Setters
+ */
+
+int git_config_set(git_config *cfg, const char *name,
+ int value, git_cvar_type type)
+{
+ git_cvar *var = NULL;
+ int error = GIT_SUCCESS;
+
+ var = git__malloc(sizeof(git_cvar));
+ if(var == NULL){
+ error = GIT_ENOMEM;
+ goto out;
+ }
+
+ var->name = git__strdup(name);
+ if(var->name == NULL){
+ error = GIT_ENOMEM;
+ free(var);
+ goto out;
+ }
+
+ var->type = type;
+ if(type == GIT_VAR_BOOL)
+ var->value.boolean = value;
+ else
+ var->value.integer = value;
+
+ error = git_hashtable_insert(cfg->vars, var->name, var);
+ if(error < GIT_SUCCESS)
+ cvar_free(var);
+
+ out:
+ return error;
+}
+
+int git_config_set_string(git_config *cfg, const char *name, const char *value)
+{
+ git_cvar *var = NULL;
+ int error = GIT_SUCCESS;
+
+ var = git__malloc(sizeof(git_cvar));
+ if(var == NULL){
+ error = GIT_ENOMEM;
+ goto out;
+ }
+
+ var->name = git__strdup(name);
+ if(var->name == NULL){
+ error = GIT_ENOMEM;
+ free(var);
+ goto out;
+ }
+
+ var->value.string = git__strdup(value);
+ if(var->value.string == NULL){
+ error = GIT_ENOMEM;
+ cvar_free(var);
+ goto out;
+ }
+
+ var->type = GIT_VAR_STR;
+
+ error = git_hashtable_insert(cfg->vars, var->name, var);
+ if(error < GIT_SUCCESS)
+ cvar_free(var);
+
+ out:
+ return error;
+}
+
+
+/*
+ * Get a config variable's data.
+ */
+int git_config_get(git_config *cfg, const char *name,
+ int *out, git_cvar_type type)
+{
+ git_cvar *var;
+ int error = GIT_SUCCESS;
+
+ var = git_hashtable_lookup(cfg->vars, name);
+ if (var == NULL) {
+ error = GIT_ENOTFOUND;
+ } else {
+ if (var->type == type)
+ *out = type == GIT_VAR_INT ?
+ var->value.integer : var->value.boolean;
+ else
+ error = GIT_EINVALIDTYPE;
+ }
+ return error;
+}
+
+int git_config_get_string(git_config *cfg, const char *name, const char **out)
+{
+ git_cvar *var;
+ int error = GIT_SUCCESS;
+
+ var = git_hashtable_lookup(cfg->vars, name);
+ if (var == NULL) {
+ error = GIT_ENOTFOUND;
+ goto out;
+ } else if (var->type != GIT_VAR_STR) {
+ error = GIT_EINVALIDTYPE;
+ goto out;
+ }
+
+ *out = var->value.string;
+
+ out:
+ return error;
+}
+
static int cfg_getchar_raw(git_config *cfg)
{
int c;