Merge branch 'jk/ref-filter-lrstrip-optim' into jch

Code clean-up.

* jk/ref-filter-lrstrip-optim:
  ref-filter: clarify lstrip/rstrip component counting
  ref-filter: avoid strrchr() in rstrip_ref_components()
  ref-filter: simplify rstrip_ref_components() memory handling
  ref-filter: simplify lstrip_ref_components() memory handling
  ref-filter: factor out refname component counting
This commit is contained in:
Junio C Hamano
2026-02-23 14:25:44 -08:00

View File

@@ -2173,32 +2173,34 @@ static inline char *copy_advance(char *dst, const char *src)
return dst;
}
static const char *lstrip_ref_components(const char *refname, int len)
static int normalize_component_count(const char *refname, int len)
{
long remaining = len;
const char *start = xstrdup(refname);
const char *to_free = start;
if (len < 0) {
int i;
const char *p = refname;
int slashes = 0;
for (const char *p = refname; *p; p++) {
if (*p == '/')
slashes++;
}
/* Find total no of '/' separated path-components */
for (i = 0; p[i]; p[i] == '/' ? i++ : *p++)
;
/*
* The number of components we need to strip is now
* the total minus the components to be left (Plus one
* because we count the number of '/', but the number
* of components is one more than the no of '/').
*/
remaining = i + len + 1;
len = slashes + len + 1;
}
return len;
}
static const char *lstrip_ref_components(const char *refname, int len)
{
int remaining = normalize_component_count(refname, len);
while (remaining > 0) {
switch (*start++) {
switch (*refname++) {
case '\0':
free((char *)to_free);
return xstrdup("");
case '/':
remaining--;
@@ -2206,42 +2208,21 @@ static const char *lstrip_ref_components(const char *refname, int len)
}
}
start = xstrdup(start);
free((char *)to_free);
return start;
return xstrdup(refname);
}
static const char *rstrip_ref_components(const char *refname, int len)
{
long remaining = len;
const char *start = xstrdup(refname);
const char *to_free = start;
int remaining = normalize_component_count(refname, len);
const char *end = refname + strlen(refname);
if (len < 0) {
int i;
const char *p = refname;
/* Find total no of '/' separated path-components */
for (i = 0; p[i]; p[i] == '/' ? i++ : *p++)
;
/*
* The number of components we need to strip is now
* the total minus the components to be left (Plus one
* because we count the number of '/', but the number
* of components is one more than the no of '/').
*/
remaining = i + len + 1;
}
while (remaining-- > 0) {
char *p = strrchr(start, '/');
if (!p) {
free((char *)to_free);
while (remaining > 0) {
if (end == refname)
return xstrdup("");
} else
p[0] = '\0';
if (*--end == '/')
remaining--;
}
return start;
return xmemdupz(refname, end - refname);
}
static const char *show_ref(struct refname_atom *atom, const char *refname)