Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
e750a488
Commit
e750a488
authored
Jun 01, 2008
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Simplify Win32 command line parsing
parent
ca12c6bb
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
37 additions
and
123 deletions
+37
-123
src/winvlc.c
src/winvlc.c
+37
-123
No files found.
src/winvlc.c
View file @
e750a488
...
...
@@ -35,140 +35,54 @@
#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
...
...
@@ -183,12 +97,11 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
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
);
argc
=
parse_cmdline
(
psz_cmdline
,
&
argv
);
libvlc_exception_t
ex
;
libvlc_exception_init
(
&
ex
);
...
...
@@ -201,6 +114,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
libvlc_wait
(
vlc
);
libvlc_release
(
vlc
);
}
free
(
argv
);
ret
=
libvlc_exception_raised
(
&
ex
);
libvlc_exception_clear
(
&
ex
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment