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
ddf6a273
Commit
ddf6a273
authored
Nov 12, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* src/extras/libc.c: vlc_parse_cmdline() common facility.
parent
bec61e65
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
135 additions
and
0 deletions
+135
-0
include/vlc_common.h
include/vlc_common.h
+1
-0
src/extras/libc.c
src/extras/libc.c
+134
-0
No files found.
include/vlc_common.h
View file @
ddf6a273
...
...
@@ -951,6 +951,7 @@ typedef __int64 off_t;
#endif
VLC_EXPORT
(
vlc_bool_t
,
vlc_reduce
,
(
int
*
,
int
*
,
int64_t
,
int64_t
,
int64_t
)
);
VLC_EXPORT
(
char
**
,
vlc_parse_cmdline
,
(
const
char
*
,
int
*
)
);
/* vlc_wraptext (defined in src/extras/libc.c) */
#define wraptext vlc_wraptext
...
...
src/extras/libc.c
View file @
ddf6a273
...
...
@@ -555,3 +555,137 @@ vlc_bool_t vlc_reduce( int *pi_dst_nom, int *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
;
int
i_bcount
=
0
;
if
(
!
psz_cmdline
)
return
0
;
psz_cmdline
=
strdup
(
psz_cmdline
);
psz_arg
=
psz_parser
=
s
=
psz_cmdline
;
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_cmdline
);
return
argv
;
}
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