]> git.sesse.net Git - vlc/blobdiff - src/winvlc.c
Fix xosd memleaks.
[vlc] / src / winvlc.c
index 20011cd58e6a7232a19b96c1cedfaf2600db3699..18c1b13b1234e3989db029fc72b63df17ed5ba22 100644 (file)
 #include <stdlib.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 == '\\' )
-        {
-            **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,31 +91,46 @@ 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, MAX_PATH, NULL, NULL );
-    argv = vlc_parse_cmdline( psz_cmdline, &argc );
+                         psz_cmdline, sizeof (psz_cmdline), NULL, NULL );
 
-    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;
 }
+
+#ifndef IF_MINGW_SUPPORTED_UNICODE
+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) + 1) * 3];
+    MultiByteToWideChar (CP_ACP, 0, args, -1, lpCmdLine, sizeof (lpCmdLine));
+    return wWinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow);
+}
+#endif