[PATCH 03/21] refactor find_ref_by_name() to accept const list
- From
Jay Soffian <jaysoffian@gmail.com>
- Date
- Feb 25, 2009, 08:32 UTC
- Message-ID
- <6e9d6d590b6f7f7c2457a474f161573d56ea4ae5.1235546707.git.jaysoffian@gmail.com>
- In-Reply-To
- <cover.1235546707.git.jaysoffian@gmail.com>
From: Jeff King <peff@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> Signed-off-by: Jay Soffian <jaysoffian@gmail.com> --- cache.h | 2 +- refs.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/cache.h b/cache.h index 189151d..609380d 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.rc1.291.g83eb