[PATCH 3/5] refactor find_refs_by_name to accept const list
- From
Jeff King <peff@peff.net>
- Date
- Feb 15, 2009, 06:12 UTC
- Message-ID
- <20090215061239.GC30414@coredump.intra.peff.net>
- In-Reply-To
- <20090215060815.GA7473@coredump.intra.peff.net>
Since it doesn't actually touch its argument, this makes sense.
However, we still want to return a non-const version (which requires a cast) so that this:
struct ref *a, *b; a = find_ref_by_name(b);
works. Unfortunately, you can also silently strip the const from a variable:
struct ref *a; const struct ref *b; a = find_ref_by_name(b);
This is a classic C const problem because there is no way to say "return the type with the same constness that was passed to us"; we provide the same semantics as standard library functions like strchr.
Signed-off-by: Jeff King <peff@peff.net> --- cache.h | 2 +- refs.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/cache.h b/cache.h index 7f1a6e8..ba6c070 100644 --- a/cache.h +++ b/cache.h @@ -801,7 +801,7 @@ struct ref { #define REF_HEADS (1u << 1) #define REF_TAGS (1u << 2) -extern struct ref *find_ref_by_name(struct ref *list, const char *name); +extern struct ref *find_ref_by_name(const struct ref *list, const char *name); #define CONNECT_VERBOSE (1u << 0) extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags); diff --git a/refs.c b/refs.c index 6eb5f53..b2a37e1 100644 --- a/refs.c +++ b/refs.c @@ -1628,10 +1628,10 @@ int update_ref(const char *action, const char *refname, return 0; } -struct ref *find_ref_by_name(struct ref *list, const char *name) +struct ref *find_ref_by_name(const struct ref *list, const char *name) { for ( ; list; list = list->next) if (!strcmp(list->name, name)) - return list; + return (struct ref *)list; return NULL; }
-- 1.6.2.rc0.256.gf004c.dirty