]> git.sesse.net Git - vlc/commitdiff
Separate and refactor the win32 main code
authorRémi Denis-Courmont <rem@videolan.org>
Fri, 23 May 2008 15:42:11 +0000 (18:42 +0300)
committerRémi Denis-Courmont <rem@videolan.org>
Fri, 23 May 2008 15:42:19 +0000 (18:42 +0300)
It has almost nothing in common with the Unix main code anyway.

include/vlc_common.h
src/Makefile.am
src/extras/libc.c
src/libvlccore.sym
src/winvlc.c [new file with mode: 0644]

index f153040465b2acd2102bc1eb976ea7555d876999..e10a96dd2b813dfa24e54af9c0c5aab625ff64bc 100644 (file)
@@ -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
index b9386416e53af0f4f161b99bfec9fc0f60e9192e..7baf8ea691a1c221bc064613c1ed9398d0a7280d 100644 (file)
@@ -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`
index 38c930cafe7cc86074271c44437786e73e8fe3ab..99c59db6775a078055e5d9e037394b495be0b256 100644 (file)
@@ -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
index 3499307393c39230a17ae0b03a376469a986d3da..b24feb379ab0c577ddd9350a1f3a5fb9053dca24 100644 (file)
@@ -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 (file)
index 0000000..20011cd
--- /dev/null
@@ -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;
+}