Add trim_end() and use it to remove trailing slashes from repo paths

The new function removes all trailing instances of an arbitrary character
from a copy of the supplied char array. This is then used to remove any
trailing slashes from cgit_query_path.

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2007-06-26 18:04:31 +02:00
parent 42e459bb1f
commit 382805ee83
3 changed files with 25 additions and 2 deletions

1
cgit.h
View File

@ -159,6 +159,7 @@ extern int chk_zero(int result, char *msg);
extern int chk_positive(int result, char *msg); extern int chk_positive(int result, char *msg);
extern int hextoint(char c); extern int hextoint(char c);
extern char *trim_end(const char *str, char c);
extern void *cgit_free_commitinfo(struct commitinfo *info); extern void *cgit_free_commitinfo(struct commitinfo *info);

View File

@ -168,7 +168,7 @@ void cgit_parse_url(const char *url)
if (p) { if (p) {
p[0] = '\0'; p[0] = '\0';
if (p[1]) if (p[1])
cgit_query_path = xstrdup(p + 1); cgit_query_path = trim_end(p + 1, '/');
} }
cgit_cmd = cgit_get_cmd_index(cmd + 1); cgit_cmd = cgit_get_cmd_index(cmd + 1);
cgit_query_page = xstrdup(cmd + 1); cgit_query_page = xstrdup(cmd + 1);

View File

@ -228,7 +228,7 @@ void cgit_querystring_cb(const char *name, const char *value)
} else if (!strcmp(name, "ofs")) { } else if (!strcmp(name, "ofs")) {
cgit_query_ofs = atoi(value); cgit_query_ofs = atoi(value);
} else if (!strcmp(name, "path")) { } else if (!strcmp(name, "path")) {
cgit_query_path = xstrdup(value); cgit_query_path = trim_end(value, '/');
} else if (!strcmp(name, "name")) { } else if (!strcmp(name, "name")) {
cgit_query_name = xstrdup(value); cgit_query_name = xstrdup(value);
} }
@ -257,6 +257,28 @@ int hextoint(char c)
return -1; return -1;
} }
char *trim_end(const char *str, char c)
{
int len;
char *s, *t;
if (str == NULL)
return NULL;
t = (char *)str;
len = strlen(t);
while(len > 0 && t[len - 1] == c)
len--;
if (len == 0)
return NULL;
c = t[len];
t[len] = '\0';
s = xstrdup(t);
t[len] = c;
return s;
}
void cgit_diff_tree_cb(struct diff_queue_struct *q, void cgit_diff_tree_cb(struct diff_queue_struct *q,
struct diff_options *options, void *data) struct diff_options *options, void *data)
{ {