Read and parse the confguration when openingt the config file Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
diff --git a/src/config.c b/src/config.c
index 656f64e..e615b03 100644
--- a/src/config.c
+++ b/src/config.c
@@ -30,7 +30,11 @@
#include <ctype.h>
-
+/**********************
+ * Forward declarations
+ ***********************/
+static int config_parse(git_config *cfg_file);
+static int parse_variable(git_config *cfg, const char *section_name, const char *line);
uint32_t config_table_hash(const void *key)
{
const char *var_name = (char *)key;
@@ -48,6 +52,7 @@ int config_table_haskey(void *object, const void *key)
int git_config_open(git_config **cfg_out, const char *path)
{
git_config *cfg;
+ int error = GIT_SUCCESS;
assert(cfg_out && path);
@@ -58,15 +63,35 @@ int git_config_open(git_config **cfg_out, const char *path)
memset(cfg, 0x0, sizeof(git_config));
cfg->file_path = git__strdup(path);
- if (cfg->file_path == NULL)
- return GIT_ENOMEM;
+ if (cfg->file_path == NULL){
+ error = GIT_ENOMEM;
+ goto cleanup;
+ }
cfg->vars = git_hashtable_alloc(16, config_table_hash, config_table_haskey);
- if (cfg->vars == NULL)
- return GIT_ENOMEM;
+ if (cfg->vars == NULL){
+ error = GIT_ENOMEM;
+ goto cleanup;
+ }
*cfg_out = cfg;
- return GIT_SUCCESS;
+
+ error = gitfo_read_file(&cfg->reader.buffer, cfg->file_path);
+ if(error < GIT_SUCCESS)
+ goto cleanup;
+
+ /* Initialise the reading position */
+ cfg->reader.read_ptr = cfg->reader.buffer.data;
+ return config_parse(cfg);
+
+ cleanup:
+ if(cfg->vars)
+ git_hashtable_free(cfg->vars);
+ if(cfg->file_path)
+ free(cfg->file_path);
+ free(cfg);
+
+ return error;
}
void git_config_free(git_config *cfg)