Commit a277345e by Russell Belfer

Create internal strcmp variants for function ptrs

Using the builtin strcmp and strcasecmp as function pointers is
problematic on win32.  This adds internal implementations and
divorces us from the platform linkage.
parent 513e794e
...@@ -551,15 +551,15 @@ static int diff_list_init_from_iterators( ...@@ -551,15 +551,15 @@ static int diff_list_init_from_iterators(
if (!old_iter->ignore_case && !new_iter->ignore_case) { if (!old_iter->ignore_case && !new_iter->ignore_case) {
diff->opts.flags &= ~GIT_DIFF_DELTAS_ARE_ICASE; diff->opts.flags &= ~GIT_DIFF_DELTAS_ARE_ICASE;
diff->strcomp = strcmp; diff->strcomp = git__strcmp;
diff->strncomp = strncmp; diff->strncomp = git__strncmp;
diff->pfxcomp = git__prefixcmp; diff->pfxcomp = git__prefixcmp;
diff->entrycomp = git_index_entry__cmp; diff->entrycomp = git_index_entry__cmp;
} else { } else {
diff->opts.flags |= GIT_DIFF_DELTAS_ARE_ICASE; diff->opts.flags |= GIT_DIFF_DELTAS_ARE_ICASE;
diff->strcomp = strcasecmp; diff->strcomp = git__strcasecmp;
diff->strncomp = strncasecmp; diff->strncomp = git__strncasecmp;
diff->pfxcomp = git__prefixcmp_icase; diff->pfxcomp = git__prefixcmp_icase;
diff->entrycomp = git_index_entry__cmp_icase; diff->entrycomp = git_index_entry__cmp_icase;
} }
......
...@@ -122,11 +122,11 @@ bool git_pathspec_match_path( ...@@ -122,11 +122,11 @@ bool git_pathspec_match_path(
fnmatch_flags = FNM_CASEFOLD; fnmatch_flags = FNM_CASEFOLD;
if (casefold) { if (casefold) {
use_strcmp = strcasecmp; use_strcmp = git__strcasecmp;
use_strncmp = strncasecmp; use_strncmp = git__strncasecmp;
} else { } else {
use_strcmp = strcmp; use_strcmp = git__strcmp;
use_strncmp = strncmp; use_strncmp = git__strncmp;
} }
git_vector_foreach(vspec, i, match) { git_vector_foreach(vspec, i, match) {
......
...@@ -174,6 +174,36 @@ int git__strtol32(int32_t *result, const char *nptr, const char **endptr, int ba ...@@ -174,6 +174,36 @@ int git__strtol32(int32_t *result, const char *nptr, const char **endptr, int ba
return error; return error;
} }
int git__strcmp(const char *a, const char *b)
{
while (*a && *b && *a == *b)
++a, ++b;
return (int)(*(const unsigned char *)a) - (int)(*(const unsigned char *)b);
}
int git__strcasecmp(const char *a, const char *b)
{
while (*a && *b && tolower(*a) == tolower(*b))
++a, ++b;
return (tolower(*a) - tolower(*b));
}
int git__strncmp(const char *a, const char *b, size_t sz)
{
while (sz && *a && *b && *a == *b)
--sz, ++a, ++b;
if (!sz)
return 0;
return (int)(*(const unsigned char *)a) - (int)(*(const unsigned char *)b);
}
int git__strncasecmp(const char *a, const char *b, size_t sz)
{
while (sz && *a && *b && tolower(*a) == tolower(*b))
--sz, ++a, ++b;
return !sz ? 0 : (tolower(*a) - tolower(*b));
}
void git__strntolower(char *str, size_t len) void git__strntolower(char *str, size_t len)
{ {
size_t i; size_t i;
......
...@@ -134,6 +134,11 @@ extern int git__bsearch( ...@@ -134,6 +134,11 @@ extern int git__bsearch(
extern int git__strcmp_cb(const void *a, const void *b); extern int git__strcmp_cb(const void *a, const void *b);
extern int git__strcmp(const char *a, const char *b);
extern int git__strcasecmp(const char *a, const char *b);
extern int git__strncmp(const char *a, const char *b, size_t sz);
extern int git__strncasecmp(const char *a, const char *b, size_t sz);
typedef struct { typedef struct {
short refcount; short refcount;
void *owner; void *owner;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment