summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2018-06-22 18:28:44 +0900
committerGitHub <noreply@github.com>2018-06-22 18:28:44 +0900
commitb121b7ac972156cdc67b25be075fd62450b57f29 (patch)
tree089a219064df980b9b061b55f90e2e289e0d860a
parente212011b9872c52f6205d3a30b10f753c3108918 (diff)
parente1e90dccb252dc92490ad620d98c581636df0adf (diff)
downloadlibgit2-b121b7ac972156cdc67b25be075fd62450b57f29.tar.gz
Merge pull request #4411 from pks-t/pks/config-parse-cleanups
Config parser cleanups
-rw-r--r--src/config_file.c30
-rw-r--r--src/config_parse.c48
-rw-r--r--src/config_parse.h4
3 files changed, 41 insertions, 41 deletions
diff --git a/src/config_file.c b/src/config_file.c
index 90255c929..ea72648aa 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -876,10 +876,8 @@ static char *escape_value(const char *ptr)
ptr++;
}
- if (git_buf_oom(&buf)) {
- git_buf_dispose(&buf);
+ if (git_buf_oom(&buf))
return NULL;
- }
return git_buf_detach(&buf);
}
@@ -1022,8 +1020,8 @@ static int parse_conditional_include(git_config_parser *reader,
static int read_on_variable(
git_config_parser *reader,
const char *current_section,
- char *var_name,
- char *var_value,
+ const char *var_name,
+ const char *var_value,
const char *line,
size_t line_len,
void *data)
@@ -1031,24 +1029,24 @@ static int read_on_variable(
diskfile_parse_state *parse_data = (diskfile_parse_state *)data;
git_buf buf = GIT_BUF_INIT;
git_config_entry *entry;
+ const char *c;
int result = 0;
GIT_UNUSED(line);
GIT_UNUSED(line_len);
- git__strtolower(var_name);
- git_buf_printf(&buf, "%s.%s", current_section, var_name);
- git__free(var_name);
+ git_buf_puts(&buf, current_section);
+ git_buf_putc(&buf, '.');
+ for (c = var_name; *c; c++)
+ git_buf_putc(&buf, git__tolower(*c));
- if (git_buf_oom(&buf)) {
- git__free(var_value);
+ if (git_buf_oom(&buf))
return -1;
- }
entry = git__calloc(1, sizeof(git_config_entry));
GITERR_CHECK_ALLOC(entry);
entry->name = git_buf_detach(&buf);
- entry->value = var_value;
+ entry->value = var_value ? git__strdup(var_value) : NULL;
entry->level = parse_data->level;
entry->include_depth = parse_data->depth;
@@ -1065,7 +1063,6 @@ static int read_on_variable(
result = parse_conditional_include(reader, parse_data,
entry->name, entry->value);
-
return result;
}
@@ -1249,8 +1246,8 @@ static int write_on_section(
static int write_on_variable(
git_config_parser *reader,
const char *current_section,
- char *var_name,
- char *var_value,
+ const char *var_name,
+ const char *var_value,
const char *line,
size_t line_len,
void *data)
@@ -1279,9 +1276,6 @@ static int write_on_variable(
if (has_matched && write_data->preg != NULL)
has_matched = (regexec(write_data->preg, var_value, 0, NULL, 0) == 0);
- git__free(var_name);
- git__free(var_value);
-
/* If this isn't the name/value we're looking for, simply dump the
* existing data back out and continue on.
*/
diff --git a/src/config_parse.c b/src/config_parse.c
index 66ac43237..52832c2c8 100644
--- a/src/config_parse.c
+++ b/src/config_parse.c
@@ -404,22 +404,21 @@ static int parse_name(
static int parse_variable(git_config_parser *reader, char **var_name, char **var_value)
{
const char *value_start = NULL;
- char *line;
- int quote_count;
+ char *line = NULL, *name = NULL, *value = NULL;
+ int quote_count, error;
bool multiline;
+ *var_name = NULL;
+ *var_value = NULL;
+
git_parse_advance_ws(&reader->ctx);
line = git__strndup(reader->ctx.line, reader->ctx.line_len);
- if (line == NULL)
- return -1;
+ GITERR_CHECK_ALLOC(line);
quote_count = strip_comments(line, 0);
- /* If there is no value, boolean true is assumed */
- *var_value = NULL;
-
- if (parse_name(var_name, &value_start, reader, line) < 0)
- goto on_error;
+ if ((error = parse_name(&name, &value_start, reader, line)) < 0)
+ goto out;
/*
* Now, let's try to parse the value
@@ -428,30 +427,34 @@ static int parse_variable(git_config_parser *reader, char **var_name, char **var
while (git__isspace(value_start[0]))
value_start++;
- if (unescape_line(var_value, &multiline, value_start, 0) < 0)
- goto on_error;
+ if ((error = unescape_line(&value, &multiline, value_start, 0)) < 0)
+ goto out;
if (multiline) {
git_buf multi_value = GIT_BUF_INIT;
- git_buf_attach(&multi_value, *var_value, 0);
+ git_buf_attach(&multi_value, value, 0);
if (parse_multiline_variable(reader, &multi_value, quote_count) < 0 ||
- git_buf_oom(&multi_value)) {
+ git_buf_oom(&multi_value)) {
+ error = -1;
git_buf_dispose(&multi_value);
- goto on_error;
+ goto out;
}
- *var_value = git_buf_detach(&multi_value);
+ value = git_buf_detach(&multi_value);
}
}
- git__free(line);
- return 0;
+ *var_name = name;
+ *var_value = value;
+ name = NULL;
+ value = NULL;
-on_error:
- git__free(*var_name);
+out:
+ git__free(name);
+ git__free(value);
git__free(line);
- return -1;
+ return error;
}
int git_config_parse(
@@ -463,7 +466,7 @@ int git_config_parse(
void *data)
{
git_parse_ctx *ctx;
- char *current_section = NULL, *var_name, *var_value;
+ char *current_section = NULL, *var_name = NULL, *var_value = NULL;
int result = 0;
ctx = &parser->ctx;
@@ -508,7 +511,10 @@ int git_config_parse(
default: /* assume variable declaration */
if ((result = parse_variable(parser, &var_name, &var_value)) == 0 && on_variable) {
result = on_variable(parser, current_section, var_name, var_value, line_start, line_len, data);
+ git__free(var_name);
+ git__free(var_value);
}
+
break;
}
diff --git a/src/config_parse.h b/src/config_parse.h
index d14a8e60c..6650b87f3 100644
--- a/src/config_parse.h
+++ b/src/config_parse.h
@@ -36,8 +36,8 @@ typedef int (*git_config_parser_section_cb)(
typedef int (*git_config_parser_variable_cb)(
git_config_parser *parser,
const char *current_section,
- char *var_name,
- char *var_value,
+ const char *var_name,
+ const char *var_value,
const char *line,
size_t line_len,
void *data);