summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2007-06-26 16:04:31 +0000
committerLars Hjemli <hjemli@gmail.com>2007-06-26 16:04:39 +0000
commit382805ee83b6e6f165159312a9fe20e3971897b6 (patch)
tree8bcf24b888ba95c91a575640be9ae87e949a99ea
parent42e459bb1f209df8278f4f4f0ee3f4bcfae80da8 (diff)
downloadcgit-382805ee83b6e6f165159312a9fe20e3971897b6.tar
cgit-382805ee83b6e6f165159312a9fe20e3971897b6.tar.gz
cgit-382805ee83b6e6f165159312a9fe20e3971897b6.zip
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>
-rw-r--r--cgit.h1
-rw-r--r--parsing.c2
-rw-r--r--shared.c24
3 files changed, 25 insertions, 2 deletions
diff --git a/cgit.h b/cgit.h
index 81c819d..ddb2fff 100644
--- a/cgit.h
+++ b/cgit.h
@@ -159,6 +159,7 @@ extern int chk_zero(int result, char *msg);
extern int chk_positive(int result, char *msg);
extern int hextoint(char c);
+extern char *trim_end(const char *str, char c);
extern void *cgit_free_commitinfo(struct commitinfo *info);
diff --git a/parsing.c b/parsing.c
index 74a2484..2c05c09 100644
--- a/parsing.c
+++ b/parsing.c
@@ -168,7 +168,7 @@ void cgit_parse_url(const char *url)
if (p) {
p[0] = '\0';
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_query_page = xstrdup(cmd + 1);
diff --git a/shared.c b/shared.c
index ab00bc9..45db735 100644
--- a/shared.c
+++ b/shared.c
@@ -228,7 +228,7 @@ void cgit_querystring_cb(const char *name, const char *value)
} else if (!strcmp(name, "ofs")) {
cgit_query_ofs = atoi(value);
} else if (!strcmp(name, "path")) {
- cgit_query_path = xstrdup(value);
+ cgit_query_path = trim_end(value, '/');
} else if (!strcmp(name, "name")) {
cgit_query_name = xstrdup(value);
}
@@ -257,6 +257,28 @@ int hextoint(char c)
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,
struct diff_options *options, void *data)
{