[vlc-devel] commit: make_path: make a local file path from an URI ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sat Jan 30 17:38:27 CET 2010
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Jan 30 18:18:04 2010 +0200| [f7aa8a5308253dc1a29d59ff1069d929eb18cb1a] | committer: Rémi Denis-Courmont
make_path: make a local file path from an URI
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f7aa8a5308253dc1a29d59ff1069d929eb18cb1a
---
include/vlc_url.h | 1 +
src/libvlccore.sym | 1 +
src/text/strings.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 92 insertions(+), 0 deletions(-)
diff --git a/include/vlc_url.h b/include/vlc_url.h
index 714a3f2..35bea92 100644
--- a/include/vlc_url.h
+++ b/include/vlc_url.h
@@ -49,6 +49,7 @@ VLC_EXPORT( char *, decode_URI_duplicate, ( const char *psz ) );
VLC_EXPORT( char *, decode_URI, ( char *psz ) );
VLC_EXPORT( char *, encode_URI_component, ( const char *psz ) );
VLC_EXPORT( char *, make_URI, ( const char *path ) );
+VLC_EXPORT( char *, make_path, ( const char *url ) );
/*****************************************************************************
* vlc_UrlParse:
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 8ce0034..ab7e21e 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -227,6 +227,7 @@ libvlc_InternalWait
libvlc_Quit
LocaleFree
make_URI
+make_path
mdate
module_config_free
module_config_get
diff --git a/src/text/strings.c b/src/text/strings.c
index f136a59..a37fe16 100644
--- a/src/text/strings.c
+++ b/src/text/strings.c
@@ -1146,3 +1146,93 @@ char *make_URI (const char *path)
return buf;
}
}
+
+/**
+ * Tries to convert an URI to a local (UTF-8-encoded) file path.
+ * @param url URI to convert
+ * @return NULL on error, a nul-terminated string otherwise
+ * (use free() to release it)
+ */
+char *make_path (const char *url)
+{
+ char *ret = NULL;
+ char *end;
+
+ char *path = strstr (url, "://");
+ if (path == NULL)
+ return NULL; /* unsupported scheme or invalid syntax */
+
+ end = memchr (url, '/', path - url);
+ size_t schemelen = ((end != NULL) ? end : path) - url;
+ path += 3; /* skip "://" */
+
+ /* Remove HTML anchor if present */
+ end = strchr (path, '#');
+ if (end)
+ path = strndup (path, end - path);
+ else
+ path = strdup (path);
+ if (unlikely(path == NULL))
+ return NULL; /* boom! */
+
+ /* Decode path */
+ decode_URI (path);
+
+ if (schemelen == 4 && !strncasecmp (url, "file", 4))
+ {
+#if (DIR_SEP_CHAR != '/')
+ for (char *p = strchr (path, '/'); p; p = strchr (p, '/'))
+ *p == DIR_SEP_CHAR;
+#endif
+ if (*path == DIR_SEP_CHAR)
+ return path;
+
+ /* Local path disguised as a remote one (MacOS X) */
+ if (!strncasecmp (path, "localhost"DIR_SEP, 10))
+ {
+ memmove (path, path + 9, strlen (path + 9) + 1);
+ return path;
+ }
+
+#ifdef WIN32
+ if (*path && asprintf (&ret, "\\\\%s", path) == -1)
+ ret = NULL;
+#endif
+ /* non-local path :-( */
+ }
+ else
+ if (schemelen == 2 && !strncasecmp (url, "fd", 2))
+ {
+ int fd = strtol (path, &end, 0);
+
+ if (*end)
+ goto out;
+
+#ifndef WIN32
+ switch (fd)
+ {
+ case 0:
+ ret = strdup ("/dev/stdin");
+ break;
+ case 1:
+ ret = strdup ("/dev/stdout");
+ break;
+ case 2:
+ ret = strdup ("/dev/strerr");
+ break;
+ default:
+ if (asprintf (&ret, "/dev/fd/%d", fd) == -1)
+ ret = NULL;
+ }
+#else
+ if (fd < 2)
+ ret = strdup ("CON");
+ else
+ ret = NULL;
+#endif
+ }
+
+out:
+ free (path);
+ return ret; /* unknown scheme */
+}
More information about the vlc-devel
mailing list