mirror of https://code.videolan.org/videolan/vlc
Separate and refactor the win32 main code
It has almost nothing in common with the Unix main code anyway.
This commit is contained in:
parent
311b28dea5
commit
ab67a5346f
|
@ -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
|
||||
|
|
|
@ -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`
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,207 @@
|
|||
/*****************************************************************************
|
||||
* winvlc.c: the Windows VLC player
|
||||
*****************************************************************************
|
||||
* Copyright (C) 1998-2008 the VideoLAN team
|
||||
*
|
||||
* Authors: Vincent Seguin <seguin@via.ecp.fr>
|
||||
* Samuel Hocevar <sam@zoy.org>
|
||||
* Gildas Bazin <gbazin@videolan.org>
|
||||
* Derk-Jan Hartman <hartman at videolan dot org>
|
||||
* 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 <vlc/vlc.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue