From: RĂ©mi Denis-Courmont Date: Fri, 23 May 2008 15:42:11 +0000 (+0300) Subject: Separate and refactor the win32 main code X-Git-Tag: 0.9.0-test0~794 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=ab67a5346fe9ce156eb4fe1e79861e261fde0a0f;p=vlc Separate and refactor the win32 main code It has almost nothing in common with the Unix main code anyway. --- diff --git a/include/vlc_common.h b/include/vlc_common.h index f153040465..e10a96dd2b 100644 --- a/include/vlc_common.h +++ b/include/vlc_common.h @@ -839,7 +839,6 @@ VLC_EXPORT( char *, vlc_strcasestr, ( const char *s1, const char *s2 ) ); #endif VLC_EXPORT( bool, vlc_ureduce, ( unsigned *, unsigned *, uint64_t, uint64_t, uint64_t ) ); -VLC_EXPORT( char **, vlc_parse_cmdline, ( const char *, int * ) ); /* vlc_wraptext (defined in src/extras/libc.c) */ #define wraptext vlc_wraptext diff --git a/src/Makefile.am b/src/Makefile.am index b9386416e5..7baf8ea691 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -435,7 +435,12 @@ if BUILD_VLC bin_PROGRAMS = vlc endif +if !HAVE_WIN32 vlc_SOURCES = vlc.c +else +vlc_SOURCES = winvlc.c +endif + vlc_DEPENDENCIES = $(DATA_win32_rc) libvlc.la vlc_CFLAGS = `$(VLC_CONFIG) --cflags vlc` diff --git a/src/extras/libc.c b/src/extras/libc.c index 38c930cafe..99c59db677 100644 --- a/src/extras/libc.c +++ b/src/extras/libc.c @@ -800,140 +800,6 @@ bool vlc_ureduce( unsigned *pi_dst_nom, unsigned *pi_dst_den, return b_exact; } -/************************************************************************* - * 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 void find_end_quote( char **s, char **ppsz_parser, int i_quote ) -{ - int i_bcount = 0; - - while( **s ) - { - 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; - } - } -} - -char **vlc_parse_cmdline( const char *psz_cmdline, int *i_args ) -{ - int argc = 0; - char **argv = 0; - char *s, *psz_parser, *psz_arg, *psz_orig; - int i_bcount = 0; - - if( !psz_cmdline ) return 0; - psz_orig = strdup( psz_cmdline ); - psz_arg = psz_parser = s = psz_orig; - - while( *s ) - { - if( *s == '\t' || *s == ' ' ) - { - /* We have a complete argument */ - *psz_parser = 0; - TAB_APPEND( argc, argv, strdup(psz_arg) ); - - /* Skip trailing spaces/tabs */ - do{ s++; } while( *s == '\t' || *s == ' ' ); - - /* 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; - } - else - { - /* A regular character */ - *psz_parser++ = *s++; - i_bcount = 0; - } - } - - /* Take care of the last arg */ - if( *psz_arg ) - { - *psz_parser = '\0'; - TAB_APPEND( argc, argv, strdup(psz_arg) ); - } - - if( i_args ) *i_args = argc; - free( psz_orig ); - return argv; -} - /************************************************************************* * vlc_execve: Execute an external program with a given environment, * wait until it finishes and return its standard output diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 3499307393..b24feb379a 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -438,7 +438,6 @@ __vlc_object_wait __vlc_object_waitpipe __vlc_object_yield vlc_opendir -vlc_parse_cmdline vlc_pthread_fatal vlc_rand_bytes vlc_readdir diff --git a/src/winvlc.c b/src/winvlc.c new file mode 100644 index 0000000000..20011cd58e --- /dev/null +++ b/src/winvlc.c @@ -0,0 +1,207 @@ +/***************************************************************************** + * winvlc.c: the Windows VLC player + ***************************************************************************** + * Copyright (C) 1998-2008 the VideoLAN team + * + * Authors: Vincent Seguin + * Samuel Hocevar + * Gildas Bazin + * Derk-Jan Hartman + * Lots of other people, see the libvlc AUTHORS file + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define UNICODE +#include +#include +#include +#include +#include + +static void find_end_quote( char **s, char **ppsz_parser, int i_quote ) +{ + int i_bcount = 0; + + while( **s ) + { + 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; + + psz_orig = strdup( psz_cmdline ); + psz_arg = psz_parser = s = psz_orig; + + while( *s ) + { + if( *s == '\t' || *s == ' ' ) + { + /* 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 */ + 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; + } + else + { + /* A regular character */ + *psz_parser++ = *s++; + i_bcount = 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; +} + + +#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 ) +{ + char **argv, psz_cmdline[wcslen(lpCmdLine) * 4]; + 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, MAX_PATH, NULL, NULL ); + argv = vlc_parse_cmdline( psz_cmdline, &argc ); + + libvlc_exception_t ex; + libvlc_exception_init (&ex); + + /* Initialize libvlc */ + libvlc_instance_t *vlc = libvlc_new (argc, (const char **)argv, &ex); + if (vlc != NULL) + { + libvlc_run_interface (vlc, NULL, &ex); + libvlc_release (vlc); + } + + ret = libvlc_exception_raised (&ex); + libvlc_exception_clear (&ex); + return ret; +}