url.c: simplify is_url()
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>
This commit is contained in:
parent
7ed863a85a
commit
b33a1b9fe7
32
url.c
32
url.c
@ -17,35 +17,15 @@ int is_urlschemechar(int first_flag, int ch)
|
|||||||
|
|
||||||
int is_url(const char *url)
|
int is_url(const char *url)
|
||||||
{
|
{
|
||||||
const char *url2, *first_slash;
|
/* Is "scheme" part reasonable? */
|
||||||
|
if (!url || !is_urlschemechar(1, *url++))
|
||||||
if (!url)
|
|
||||||
return 0;
|
return 0;
|
||||||
url2 = url;
|
while (*url && *url != ':') {
|
||||||
first_slash = strchr(url, '/');
|
if (!is_urlschemechar(0, *url++))
|
||||||
|
|
||||||
/* Input with no slash at all or slash first can't be URL. */
|
|
||||||
if (!first_slash || first_slash == url)
|
|
||||||
return 0;
|
return 0;
|
||||||
/* Character before must be : and next must be /. */
|
|
||||||
if (first_slash[-1] != ':' || first_slash[1] != '/')
|
|
||||||
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))
|
|
||||||
return 0;
|
|
||||||
url2++;
|
|
||||||
}
|
}
|
||||||
|
/* We've seen "scheme"; we want colon-slash-slash */
|
||||||
/* Valid enough. */
|
return (url[0] == ':' && url[1] == '/' && url[2] == '/');
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int url_decode_char(const char *q)
|
static int url_decode_char(const char *q)
|
||||||
|
Loading…
Reference in New Issue
Block a user