Commit e750a488 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Simplify Win32 command line parsing

parent ca12c6bb
...@@ -35,140 +35,54 @@ ...@@ -35,140 +35,54 @@
#include <stdlib.h> #include <stdlib.h>
#include <windows.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 == '\\' ) char quote = 0;
{
**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 ) /* Skips white spaces */
{ while (strchr ("\t ", *line))
/* End */ line++;
return; if (!*line)
} break;
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; /* Starts a new parameter */
} argv = realloc (argv, (argc + 2) * sizeof (char *));
else if (*line == '"')
{ {
/* A regular character */ quote = '"';
**ppsz_parser = **s; line++;
(*ppsz_parser)++; (*s)++;
i_bcount = 0;
} }
} argv[argc++] = line;
}
/*************************************************************************
* 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;
psz_orig = strdup( psz_cmdline );
psz_arg = psz_parser = s = psz_orig;
while( *s ) more:
{ while (*line && !strchr ("\t ", *line))
if( *s == '\t' || *s == ' ' ) line++;
{
/* We have a complete argument */
*psz_parser = 0;
argv = realloc( argv, (argc + 1) * sizeof (char *) );
argv[argc] = psz_arg;
/* Skip trailing spaces/tabs */
do{ s++; } while( *s == '\t' || *s == ' ' );
/* New argument */ if (line > argv[argc - 1] && line[-1] == quote)
psz_arg = psz_parser = s; /* End of quoted parameter */
i_bcount = 0; line[-1] = 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 else
if (*line && quote)
{ {
/* Preceeded by an odd number of '\', this is half that /* Space within a quote */
* number of '\' followed by a '"' */ line++;
psz_parser = psz_parser - i_bcount/2 - 1; goto more;
*psz_parser++ = '"';
s++;
}
i_bcount = 0;
} }
else else
{ /* End of unquoted parameter */
/* A regular character */ if (*line)
*psz_parser++ = *s++; *line++ = 0;
i_bcount = 0;
}
} }
argv[argc] = NULL;
/* Take care of the last arg */ *argvp = argv;
if( *psz_arg ) return argc;
{
*psz_parser = '\0';
argv = realloc( argv, (argc + 1) * sizeof (char *) );
argv[argc] = psz_arg;
}
*i_args = argc;
return argv;
} }
#ifdef UNDER_CE #ifdef UNDER_CE
# define wWinMain WinMain # define wWinMain WinMain
#endif #endif
...@@ -183,12 +97,11 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, ...@@ -183,12 +97,11 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
int argc, ret; int argc, ret;
(void)hInstance; (void)hPrevInstance; (void)nCmdShow; (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, WideCharToMultiByte( CP_UTF8, 0, lpCmdLine, -1,
psz_cmdline, sizeof (psz_cmdline), NULL, NULL ); psz_cmdline, sizeof (psz_cmdline), NULL, NULL );
argv = vlc_parse_cmdline( psz_cmdline, &argc );
argc = parse_cmdline (psz_cmdline, &argv);
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init (&ex); libvlc_exception_init (&ex);
...@@ -201,6 +114,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, ...@@ -201,6 +114,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
libvlc_wait (vlc); libvlc_wait (vlc);
libvlc_release (vlc); libvlc_release (vlc);
} }
free (argv);
ret = libvlc_exception_raised (&ex); ret = libvlc_exception_raised (&ex);
libvlc_exception_clear (&ex); libvlc_exception_clear (&ex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment