return ret;
}
+#define URL_SCHEME_CHARS \
+ "abcdefghijklmnopqrstuvwxyz" \
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+ "0123456789+-."
+
int url_alloc(URLContext **puc, const char *filename, int flags)
{
URLProtocol *up;
- const char *p;
- char proto_str[128], *q;
-
- p = filename;
- q = proto_str;
- while (*p != '\0' && *p != ':') {
- /* protocols can only contain alphabetic chars */
- if (!isalpha(*p))
- goto file_proto;
- if ((q - proto_str) < sizeof(proto_str) - 1)
- *q++ = *p;
- p++;
- }
- /* if the protocol has length 1, we consider it is a dos drive */
- if (*p == '\0' || is_dos_path(filename)) {
- file_proto:
+ char proto_str[128];
+ size_t proto_len = strspn(filename, URL_SCHEME_CHARS);
+
+ if (filename[proto_len] != ':' || is_dos_path(filename))
strcpy(proto_str, "file");
- } else {
- *q = '\0';
- }
+ else
+ av_strlcpy(proto_str, filename, FFMIN(proto_len+1, sizeof(proto_str)));
up = first_protocol;
while (up != NULL) {