#include <stdlib.h>
#include <windows.h>
-static void find_end_quote( char **s, char **ppsz_parser, int i_quote )
+static int parse_cmdline (char *line, char ***argvp)
{
- int i_bcount = 0;
+ char **argv = malloc (sizeof (char *));
+ int argc = 0;
- while( **s )
+ while (*line != '\0')
{
- if( **s == '\\' )
- {
- **ppsz_parser = **s;
- (*ppsz_parser)++; (*s)++;
- i_bcount++;
- }
- else if( **s == '"' || **s == '\'' )
- {
- /* Preceeded by a number of '\' which we erase. */
- *ppsz_parser -= i_bcount / 2;
- if( i_bcount & 1 )
- {
- /* '\\' followed by a '"' or '\'' */
- *ppsz_parser -= 1;
- **ppsz_parser = **s;
- (*ppsz_parser)++; (*s)++;
- i_bcount = 0;
- continue;
- }
-
- if( **s == i_quote )
- {
- /* End */
- return;
- }
- else
- {
- /* Different quoting */
- int i_quote = **s;
- **ppsz_parser = **s;
- (*ppsz_parser)++; (*s)++;
- find_end_quote( s, ppsz_parser, i_quote );
- **ppsz_parser = **s;
- (*ppsz_parser)++; (*s)++;
- }
-
- i_bcount = 0;
- }
- else
- {
- /* A regular character */
- **ppsz_parser = **s;
- (*ppsz_parser)++; (*s)++;
- i_bcount = 0;
- }
- }
-}
-
-/*************************************************************************
- * vlc_parse_cmdline: Command line parsing into elements.
- *
- * The command line is composed of space/tab separated arguments.
- * Quotes can be used as argument delimiters and a backslash can be used to
- * escape a quote.
- *************************************************************************/
-static char **vlc_parse_cmdline( const char *psz_cmdline, int *i_args )
-{
- char **argv = NULL;
- char *s, *psz_parser, *psz_arg, *psz_orig;
- int i_bcount = 0, argc = 0;
+ char quote = 0;
- psz_orig = strdup( psz_cmdline );
- psz_arg = psz_parser = s = psz_orig;
+ /* Skips white spaces */
+ while (strchr ("\t ", *line))
+ line++;
+ if (!*line)
+ break;
- while( *s )
- {
- if( *s == '\t' || *s == ' ' )
+ /* Starts a new parameter */
+ argv = realloc (argv, (argc + 2) * sizeof (char *));
+ if (*line == '"')
{
- /* We have a complete argument */
- *psz_parser = 0;
- argv = realloc( argv, (argc + 1) * sizeof (char *) );
- argv[argc] = psz_arg;
+ quote = '"';
+ line++;
+ }
+ argv[argc++] = line;
- /* Skip trailing spaces/tabs */
- do{ s++; } while( *s == '\t' || *s == ' ' );
+ more:
+ while (*line && !strchr ("\t ", *line))
+ line++;
- /* New argument */
- psz_arg = psz_parser = s;
- i_bcount = 0;
- }
- else if( *s == '\\' )
- {
- *psz_parser++ = *s++;
- i_bcount++;
- }
- else if( *s == '"' || *s == '\'' )
- {
- if( ( i_bcount & 1 ) == 0 )
- {
- /* Preceeded by an even number of '\', this is half that
- * number of '\', plus a quote which we erase. */
- int i_quote = *s;
- psz_parser -= i_bcount / 2;
- s++;
- find_end_quote( &s, &psz_parser, i_quote );
- s++;
- }
- else
- {
- /* Preceeded by an odd number of '\', this is half that
- * number of '\' followed by a '"' */
- psz_parser = psz_parser - i_bcount/2 - 1;
- *psz_parser++ = '"';
- s++;
- }
- i_bcount = 0;
- }
+ if (line > argv[argc - 1] && line[-1] == quote)
+ /* End of quoted parameter */
+ line[-1] = 0;
else
+ if (*line && quote)
{
- /* A regular character */
- *psz_parser++ = *s++;
- i_bcount = 0;
+ /* Space within a quote */
+ line++;
+ goto more;
}
+ else
+ /* End of unquoted parameter */
+ if (*line)
+ *line++ = 0;
}
-
- /* Take care of the last arg */
- if( *psz_arg )
- {
- *psz_parser = '\0';
- argv = realloc( argv, (argc + 1) * sizeof (char *) );
- argv[argc] = psz_arg;
- }
-
- *i_args = argc;
- return argv;
+ argv[argc] = NULL;
+ *argvp = argv;
+ return argc;
}
-
#ifdef UNDER_CE
# define wWinMain WinMain
#endif
* wWinMain: parse command line, start interface and spawn threads.
*****************************************************************************/
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
- LPWSTR lpCmdLine, int nCmdShow )
+ LPWSTR lpCmdLine, int nCmdShow )
{
- char **argv, psz_cmdline[wcslen(lpCmdLine) * 4];
+ char **argv, psz_cmdline[wcslen(lpCmdLine) * 4 + 1];
int argc, ret;
(void)hInstance; (void)hPrevInstance; (void)nCmdShow;
- /* This clutters OSX GUI error logs */
- fprintf( stderr, "VLC media player %s\n", libvlc_get_version() );
WideCharToMultiByte( CP_UTF8, 0, lpCmdLine, -1,
psz_cmdline, sizeof (psz_cmdline), NULL, NULL );
- argv = vlc_parse_cmdline( psz_cmdline, &argc );
- libvlc_exception_t ex;
+ argc = parse_cmdline (psz_cmdline, &argv);
+
+ libvlc_exception_t ex, dummy;
libvlc_exception_init (&ex);
+ libvlc_exception_init (&dummy);
/* Initialize libvlc */
libvlc_instance_t *vlc = libvlc_new (argc, (const char **)argv, &ex);
if (vlc != NULL)
{
libvlc_add_intf (vlc, NULL, &ex);
+ libvlc_playlist_play (vlc, -1, 0, NULL, &dummy);
libvlc_wait (vlc);
libvlc_release (vlc);
}
+ free (argv);
ret = libvlc_exception_raised (&ex);
libvlc_exception_clear (&ex);
+ libvlc_exception_clear (&dummy);
return ret;
}
LPSTR args, int nCmdShow)
{
/* This makes little sense, but at least it links properly */
- wchar_t lpCmdLine[strlen(args) * 3];
- MultiByteToWideChar( CP_ACP, 0, args, -1, lpCmdLine, sizeof(lpCmdLine) );
+ wchar_t lpCmdLine[(strlen (args) + 1) * 3];
+ MultiByteToWideChar (CP_ACP, 0, args, -1, lpCmdLine, sizeof (lpCmdLine));
return wWinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
#endif