John Keeping <john@xxxxxxxxxxxxx> writes: > On Thu, Sep 12, 2013 at 11:36:56AM +0200, Sebastian Schuberth wrote: >> > Just wondering if that is the root of the problem, or if maybe there is >> > something else subtle going on. Also, does __CRT_INLINE just turn into >> > "inline", or is there perhaps some other pre-processor magic going on? >> >> This is the function definition from string.h after preprocessing: >> >> extern __inline__ int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) >> strncasecmp (const char * __sz1, const char * __sz2, size_t __sizeMaxCompare) >> {return _strnicmp (__sz1, __sz2, __sizeMaxCompare);} > > I wonder if GCC has changed it's behaviour to more closely match C99. > Clang as a compatibility article about this sort of issue: > > http://clang.llvm.org/compatibility.html#inline Interesting. The ways the page suggests as fixes are - change it to a "statis inline"; - remove "inline" from the definition; - provide an external (non-inline) def somewhere else; - compile with gnu899 dialect. But the first two are non-starter, and the third one to force everybody to define an equivalent implementation is nonsense, for a definition in the standard header file. I agree with an earlier conclusion that defining our own wrapper (with an explanation why such a redundant wrapper exists) is the best course of action at this point, until the system header is fixed. mailmap.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/mailmap.c b/mailmap.c index a7969c4..d36d424 100644 --- a/mailmap.c +++ b/mailmap.c @@ -52,6 +52,19 @@ static void free_mailmap_entry(void *p, const char *s) string_list_clear_func(&me->namemap, free_mailmap_info); } +/* + * On some systems, string.h has _only_ inline definition of strcasecmp + * without supplying a non-inline implementation anywhere, which is, eh, + * "unusual"; we cannot take an address of such a function to store it in + * namemap.cmp. This is here as a workaround---do not assign strcasecmp + * directly to namemap.cmp until we know no systems that matter have such + * an "unusual" string.h. + */ +static int namemap_cmp(const char *a, const char *b) +{ + return strcasecmp(a, b); +} + static void add_mapping(struct string_list *map, char *new_name, char *new_email, char *old_name, char *old_email) @@ -75,7 +88,7 @@ static void add_mapping(struct string_list *map, item = string_list_insert_at_index(map, index, old_email); me = xcalloc(1, sizeof(struct mailmap_entry)); me->namemap.strdup_strings = 1; - me->namemap.cmp = strcasecmp; + me->namemap.cmp = namemap_cmp; item->util = me; } @@ -237,7 +250,7 @@ int read_mailmap(struct string_list *map, char **repo_abbrev) int err = 0; map->strdup_strings = 1; - map->cmp = strcasecmp; + map->cmp = namemap_cmp; if (!git_mailmap_blob && is_bare_repository()) git_mailmap_blob = "HEAD:.mailmap"; -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html