From: Junio C Hamano Date: Thu, 24 Jul 2014 18:41:43 GMT Subject: Re: [PATCH v12 1/2] add `config_set` API for caching config-like files Message-ID: In-Reply-To: <53D120FE.8000809@gmail.com> Tanay Abhra writes: > +int git_configset_get_string_const(struct config_set *cs, const char *key, const char **dest) > +{ > + const char *value; > + if (!git_configset_get_value(cs, key, &value)) > + return git_config_string(dest, key, value); > + else > + return 1; > +} > + > +int git_configset_get_string(struct config_set *cs, const char *key, char **dest) > +{ > + const char *value; > + if (!git_configset_get_value(cs, key, &value)) { > + if (!value) > + return config_error_nonbool(key); > + *dest = xstrdup(value); > + return 0; > + } > + else > + return 1; > +} Hmm, do we really need duplicate and an almost identical implementations? I would have expected either one of these two (expecting the latter more than the former from the discussion): 1. Because git_configset_get_string_const() returns a const string not to be touched by the caller, it does not even xstrdup(), while git_configset_get_string() does. 2. These behave identically, and the only reason we have two is because some callers want to receive the string in "char *" while others want to use "const char *". If you were going route #1, then you would need duplicate but subtly different implementations; get_string_const() variant would not be calling git_config_string() because it does xstrdup() the value and give the caller a new string the caller has to free. If you were going route #2, the I would have expected there is only one implementation, _get_string(), and _get_string_const() would call it while casting the dest parameter it receives.