diff options
| author | Carlos Martín Nieto <cmn@elego.de> | 2011-03-29 17:44:10 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <cmn@elego.de> | 2011-03-29 18:13:47 +0200 |
| commit | 9a3c5e55fd7894b8732a8010c94d034d674adbf7 (patch) | |
| tree | 8fb90a8a97327b8c127e21ef730cfb537996c5cd /src/config.c | |
| parent | 26faa3668fedf1ffc95ef747b28f08b7131870f4 (diff) | |
| download | libgit2-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.c | 133 |
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; |
