Skip to content

Commit 18e836c

Browse files
authored
Merge pull request libgit2#5018 from romkatv/strings
Optimize string comparisons
2 parents 9aa049d + 30a56ba commit 18e836c

File tree

2 files changed

+15
-19
lines changed

2 files changed

+15
-19
lines changed

src/util.c

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,6 @@ int git__strntol32(int32_t *result, const char *nptr, size_t nptr_len, const cha
204204
return error;
205205
}
206206

207-
int git__strcmp(const char *a, const char *b)
208-
{
209-
while (*a && *b && *a == *b)
210-
++a, ++b;
211-
return (int)(*(const unsigned char *)a) - (int)(*(const unsigned char *)b);
212-
}
213-
214207
int git__strcasecmp(const char *a, const char *b)
215208
{
216209
while (*a && *b && git__tolower(*a) == git__tolower(*b))
@@ -240,15 +233,6 @@ int git__strcasesort_cmp(const char *a, const char *b)
240233
return cmp;
241234
}
242235

243-
int git__strncmp(const char *a, const char *b, size_t sz)
244-
{
245-
while (sz && *a && *b && *a == *b)
246-
--sz, ++a, ++b;
247-
if (!sz)
248-
return 0;
249-
return (int)(*(const unsigned char *)a) - (int)(*(const unsigned char *)b);
250-
}
251-
252236
int git__strncasecmp(const char *a, const char *b, size_t sz)
253237
{
254238
int al, bl;
@@ -301,7 +285,18 @@ GIT_INLINE(int) prefixcmp(const char *str, size_t str_n, const char *prefix, boo
301285

302286
int git__prefixcmp(const char *str, const char *prefix)
303287
{
304-
return prefixcmp(str, SIZE_MAX, prefix, false);
288+
unsigned char s, p;
289+
290+
while (1) {
291+
p = *prefix++;
292+
s = *str++;
293+
294+
if (!p)
295+
return 0;
296+
297+
if (s != p)
298+
return s - p;
299+
}
305300
}
306301

307302
int git__prefixncmp(const char *str, size_t str_n, const char *prefix)

src/util.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,13 @@ extern int git__bsearch_r(
150150
void *payload,
151151
size_t *position);
152152

153+
#define git__strcmp strcmp
154+
#define git__strncmp strncmp
155+
153156
extern int git__strcmp_cb(const void *a, const void *b);
154157
extern int git__strcasecmp_cb(const void *a, const void *b);
155158

156-
extern int git__strcmp(const char *a, const char *b);
157159
extern int git__strcasecmp(const char *a, const char *b);
158-
extern int git__strncmp(const char *a, const char *b, size_t sz);
159160
extern int git__strncasecmp(const char *a, const char *b, size_t sz);
160161

161162
extern int git__strcasesort_cmp(const char *a, const char *b);

0 commit comments

Comments
 (0)