summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 7ed863a)
raw | patch | inline | side by side (parent: 7ed863a)
author | Junio C Hamano <gitster@pobox.com> | |
Mon, 3 Oct 2011 17:56:42 +0000 (10:56 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 3 Oct 2011 17:56:42 +0000 (10:56 -0700) |
The function was implemented in an overly complicated way.
Rewrite it to check from left to right in a single pass.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Rewrite it to check from left to right in a single pass.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
url.c | patch | blob | history |
index 6a5495960f03ded65f0f5f8b8bd5c7cd98c0b05e..8d64d902ec5048c7d65ddf5eaa7e99ec3b3a76b7 100644 (file)
--- a/url.c
+++ b/url.c
int is_url(const char *url)
{
- const char *url2, *first_slash;
-
- if (!url)
- return 0;
- url2 = url;
- first_slash = strchr(url, '/');
-
- /* Input with no slash at all or slash first can't be URL. */
- if (!first_slash || first_slash == url)
- return 0;
- /* Character before must be : and next must be /. */
- if (first_slash[-1] != ':' || first_slash[1] != '/')
+ /* Is "scheme" part reasonable? */
+ if (!url || !is_urlschemechar(1, *url++))
return 0;
- /* There must be something before the :// */
- if (first_slash == url + 1)
- return 0;
- /*
- * Check all characters up to first slash - 1. Only alphanum
- * is allowed.
- */
- url2 = url;
- while (url2 < first_slash - 1) {
- if (!is_urlschemechar(url2 == url, (unsigned char)*url2))
+ while (*url && *url != ':') {
+ if (!is_urlschemechar(0, *url++))
return 0;
- url2++;
}
-
- /* Valid enough. */
- return 1;
+ /* We've seen "scheme"; we want colon-slash-slash */
+ return (url[0] == ':' && url[1] == '/' && url[2] == '/');
}
static int url_decode_char(const char *q)