break;
}
- case '+': /* This is HTTP forms, not URI decoding... */
- *out++ = ' ';
- break;
-
default:
/* Inserting non-ASCII or non-printable characters is unsafe,
* and no sane browser will send these unencoded */
assert (0);
}
+static void format_duration (char *buf, size_t len, int64_t duration)
+{
+ lldiv_t d;
+ int sec;
+
+ duration /= CLOCK_FREQ;
+ d = lldiv (duration, 60);
+ sec = d.rem;
+ d = lldiv (d.quot, 60);
+ snprintf (buf, len, "%02lld:%02d:%02d", d.quot, (int)d.rem, sec);
+}
+
#define INSERT_STRING( string ) \
if( string != NULL ) \
{ \
if( p_item && p_item->p_stats )
{
vlc_mutex_lock( &p_item->p_stats->lock );
- snprintf( buf, 10, "%d",
+ snprintf( buf, 10, "%"PRIi64,
p_item->p_stats->i_displayed_pictures );
vlc_mutex_unlock( &p_item->p_stats->lock );
}
else
- {
- sprintf( buf, b_empty_if_na ? "" : "-" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "-" );
INSERT_STRING_NO_FREE( buf );
break;
case 'g':
case 'B':
if( p_input )
{
- snprintf( buf, 10, "%d",
+ snprintf( buf, 10, "%"PRId64,
var_GetInteger( p_input, "bit-rate" )/1000 );
}
else
- {
- sprintf( buf, b_empty_if_na ? "" : "-" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "-" );
INSERT_STRING_NO_FREE( buf );
break;
case 'C':
if( p_input )
{
- snprintf( buf, 10, "%d",
+ snprintf( buf, 10, "%"PRId64,
var_GetInteger( p_input, "chapter" ) );
}
else
- {
- sprintf( buf, b_empty_if_na ? "" : "-" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "-" );
INSERT_STRING_NO_FREE( buf );
break;
case 'D':
if( p_item )
{
mtime_t i_duration = input_item_GetDuration( p_item );
- snprintf( buf, 10, "%02d:%02d:%02d",
- (int)(i_duration/(3600000000)),
- (int)((i_duration/(60000000))%60),
- (int)((i_duration/1000000)%60) );
+ format_duration (buf, sizeof (buf), i_duration);
}
else
- {
- snprintf( buf, 10, b_empty_if_na ? "" : "--:--:--" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "--:--:--" );
INSERT_STRING_NO_FREE( buf );
break;
case 'F':
case 'I':
if( p_input )
{
- snprintf( buf, 10, "%d",
+ snprintf( buf, 10, "%"PRId64,
var_GetInteger( p_input, "title" ) );
}
else
- {
- sprintf( buf, b_empty_if_na ? "" : "-" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "-" );
INSERT_STRING_NO_FREE( buf );
break;
case 'L':
{
mtime_t i_duration = input_item_GetDuration( p_item );
int64_t i_time = var_GetTime( p_input, "time" );
- snprintf( buf, 10, "%02d:%02d:%02d",
- (int)( ( i_duration - i_time ) / 3600000000 ),
- (int)( ( ( i_duration - i_time ) / 60000000 ) % 60 ),
- (int)( ( ( i_duration - i_time ) / 1000000 ) % 60 ) );
+ format_duration( buf, sizeof(buf),
+ i_duration - i_time );
}
else
- {
- snprintf( buf, 10, b_empty_if_na ? "" : "--:--:--" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "--:--:--" );
INSERT_STRING_NO_FREE( buf );
break;
case 'N':
snprintf( buf, 10, "%.3f", f );
}
else
- {
- sprintf( buf, b_empty_if_na ? "" : "-" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "-" );
INSERT_STRING_NO_FREE( buf );
break;
case 'S':
snprintf( buf, 10, "%d.%d", r/1000, (r/100)%10 );
}
else
- {
- sprintf( buf, b_empty_if_na ? "" : "-" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "-" );
INSERT_STRING_NO_FREE( buf );
break;
case 'T':
if( p_input )
{
int64_t i_time = var_GetTime( p_input, "time" );
- snprintf( buf, 10, "%02d:%02d:%02d",
- (int)( i_time / ( 3600000000 ) ),
- (int)( ( i_time / ( 60000000 ) ) % 60 ),
- (int)( ( i_time / 1000000 ) % 60 ) );
+ format_duration( buf, sizeof(buf), i_time );
}
else
- {
- snprintf( buf, 10, b_empty_if_na ? "" : "--:--:--" );
- }
+ strcpy( buf, b_empty_if_na ? "" : "--:--:--" );
INSERT_STRING_NO_FREE( buf );
break;
case 'U':
}
#include <vlc_url.h>
+#ifdef WIN32
+# include <io.h>
+#endif
/**
* Convert a file path to an URI.
* If already an URI, return a copy of the string.
- * @path path path to convert (or URI to copy)
+ * @param path path to convert (or URI to copy)
+ * @param scheme URI scheme to use (default is auto: "file", "fd" or "smb")
* @return a nul-terminated URI string (use free() to release it),
* or NULL in case of error
*/
-char *make_URI (const char *path)
+char *make_URI (const char *path, const char *scheme)
{
if (path == NULL)
return NULL;
- if (!strcmp (path, "-"))
+ if (scheme == NULL && !strcmp (path, "-"))
return strdup ("fd://0"); // standard input
if (strstr (path, "://") != NULL)
return strdup (path); /* Already an URI */
char *buf;
#ifdef WIN32
+ /* Drive letter */
if (isalpha (path[0]) && (path[1] == ':'))
{
- if (asprintf (&buf, "file:///%c:", path[0]) == -1)
+ if (asprintf (&buf, "%s:///%c:", scheme ? scheme : "file",
+ path[0]) == -1)
buf = NULL;
path += 2;
+# warning Drive letter-relative path not implemented!
+ if (path[0] != DIR_SEP_CHAR)
+ return NULL;
}
else
#endif
if (!strncmp (path, "\\\\", 2))
{ /* Windows UNC paths */
#ifndef WIN32
+ if (scheme != NULL)
+ return NULL; /* remote files not supported */
+
/* \\host\share\path -> smb://host/share/path */
if (strchr (path + 2, '\\') != NULL)
{ /* Convert backslashes to slashes */
if (dup[i] == '\\')
dup[i] = DIR_SEP_CHAR;
- char *ret = make_URI (dup);
+ char *ret = make_URI (dup, scheme);
free (dup);
return ret;
}
snprintf (buf, sizeof (SMB_SCHEME) + 3 + hostlen,
SMB_SCHEME"://%s", path + 2);
path += 2 + hostlen;
+
+ if (path[0] == '\0')
+ return buf; /* Hostname without path */
}
else
if (path[0] != DIR_SEP_CHAR)
return NULL;
if (asprintf (&buf, "%s/%s", cwd, path) == -1)
return NULL;
- char *ret = make_URI (buf);
+ char *ret = make_URI (buf, scheme);
free (buf);
return ret;
}
else
- buf = strdup ("file://");
+ if (asprintf (&buf, "%s://", scheme ? scheme : "file") == -1)
+ buf = NULL;
if (buf == NULL)
return NULL;