X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fwinvlc.c;h=18c1b13b1234e3989db029fc72b63df17ed5ba22;hb=7ca4e3eb624251feb1f97cfc25104cce473e04a0;hp=810a67aade90809ec9a56048bb506c55352b3726;hpb=cbcdf0dcb952af84ea98ef25038c105b04fc8ca2;p=vlc diff --git a/src/winvlc.c b/src/winvlc.c index 810a67aade..18c1b13b12 100644 --- a/src/winvlc.c +++ b/src/winvlc.c @@ -35,140 +35,54 @@ #include #include -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 @@ -177,32 +91,36 @@ static char **vlc_parse_cmdline( const char *psz_cmdline, int *i_args ) * 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_run_interface (vlc, NULL, &ex); + 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; } @@ -211,8 +129,8 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 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