From 3ed3f5fe85ac3fa7f94ccaab59408a20db8c7a41 Mon Sep 17 00:00:00 2001 From: Tanay Abhra Date: Fri, 18 Jul 2014 02:18:59 -0700 Subject: [PATCH 1/2] string-list: add string_list initializer helper function The string-list API has STRING_LIST_INIT_* macros to be used to define variables with initializers, but lacks functions to initialize an uninitialized piece of memory to be used as a string-list at the run-time. Introduce `string_list_init()` function for that. Signed-off-by: Tanay Abhra Reviewed-by: Matthieu Moy Signed-off-by: Junio C Hamano --- Documentation/technical/api-string-list.txt | 5 +++++ string-list.c | 6 ++++++ string-list.h | 2 ++ 3 files changed, 13 insertions(+) diff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt index f1add51efe..d51a6579c8 100644 --- a/Documentation/technical/api-string-list.txt +++ b/Documentation/technical/api-string-list.txt @@ -68,6 +68,11 @@ Functions * General ones (works with sorted and unsorted lists as well) +`string_list_init`:: + + Initialize the members of the string_list, set `strdup_strings` + member according to the value of the second parameter. + `filter_string_list`:: Apply a function to each item in a list, retaining only the diff --git a/string-list.c b/string-list.c index aabb25ef4c..db38b62b46 100644 --- a/string-list.c +++ b/string-list.c @@ -1,6 +1,12 @@ #include "cache.h" #include "string-list.h" +void string_list_init(struct string_list *list, int strdup_strings) +{ + memset(list, 0, sizeof(*list)); + list->strdup_strings = strdup_strings; +} + /* if there is no exact match, point to the index where the entry could be * inserted */ static int get_entry_index(const struct string_list *list, const char *string, diff --git a/string-list.h b/string-list.h index dd5e294465..494eb5d95d 100644 --- a/string-list.h +++ b/string-list.h @@ -18,6 +18,8 @@ struct string_list { #define STRING_LIST_INIT_NODUP { NULL, 0, 0, 0, NULL } #define STRING_LIST_INIT_DUP { NULL, 0, 0, 1, NULL } +void string_list_init(struct string_list *list, int strdup_strings); + void print_string_list(const struct string_list *p, const char *text); void string_list_clear(struct string_list *list, int free_util); From f93d7c6fa0548e95ca2795d900671a87c1a88ea3 Mon Sep 17 00:00:00 2001 From: Tanay Abhra Date: Fri, 18 Jul 2014 02:19:00 -0700 Subject: [PATCH 2/2] replace memset with string-list initializers Using memset and then manually setting values of the string-list members is not future proof as the internal representation of string-list may change any time. Use `string_list_init()` or STRING_LIST_INIT_* macros instead of memset. Signed-off-by: Tanay Abhra Reviewed-by: Matthieu Moy Signed-off-by: Junio C Hamano --- builtin/commit.c | 3 +-- merge-recursive.c | 9 +++------ submodule.c | 5 +---- transport.c | 4 +--- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/builtin/commit.c b/builtin/commit.c index 461c3b1cad..023df406f8 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -423,8 +423,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, die(_("cannot do a partial commit during a cherry-pick.")); } - memset(&partial, 0, sizeof(partial)); - partial.strdup_strings = 1; + string_list_init(&partial, 1); if (list_paths(&partial, !current_head ? NULL : "HEAD", prefix, &pathspec)) exit(1); diff --git a/merge-recursive.c b/merge-recursive.c index b5c3c5314f..4b648d9afb 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -2062,12 +2062,9 @@ void init_merge_options(struct merge_options *o) if (o->verbosity >= 5) o->buffer_output = 0; strbuf_init(&o->obuf, 0); - memset(&o->current_file_set, 0, sizeof(struct string_list)); - o->current_file_set.strdup_strings = 1; - memset(&o->current_directory_set, 0, sizeof(struct string_list)); - o->current_directory_set.strdup_strings = 1; - memset(&o->df_conflict_file_set, 0, sizeof(struct string_list)); - o->df_conflict_file_set.strdup_strings = 1; + string_list_init(&o->current_file_set, 1); + string_list_init(&o->current_directory_set, 1); + string_list_init(&o->df_conflict_file_set, 1); } int parse_merge_opt(struct merge_options *o, const char *s) diff --git a/submodule.c b/submodule.c index b80ecacf60..2fe2ad8ee4 100644 --- a/submodule.c +++ b/submodule.c @@ -544,10 +544,7 @@ static int push_submodule(const char *path) int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name) { int i, ret = 1; - struct string_list needs_pushing; - - memset(&needs_pushing, 0, sizeof(struct string_list)); - needs_pushing.strdup_strings = 1; + struct string_list needs_pushing = STRING_LIST_INIT_DUP; if (!find_unpushed_submodules(new_sha1, remotes_name, &needs_pushing)) return 1; diff --git a/transport.c b/transport.c index 59c9727d8d..d32aaf201c 100644 --- a/transport.c +++ b/transport.c @@ -1188,10 +1188,8 @@ int transport_push(struct transport *transport, if ((flags & (TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND | TRANSPORT_RECURSE_SUBMODULES_CHECK)) && !is_bare_repository()) { struct ref *ref = remote_refs; - struct string_list needs_pushing; + struct string_list needs_pushing = STRING_LIST_INIT_DUP; - memset(&needs_pushing, 0, sizeof(struct string_list)); - needs_pushing.strdup_strings = 1; for (; ref; ref = ref->next) if (!is_null_sha1(ref->new_sha1) && find_unpushed_submodules(ref->new_sha1,