Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
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
Commits
d0100c33
Commit
d0100c33
authored
Apr 06, 2006
by
Christophe Massiot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/control/http/util.c: Simplify MRLParse, and fix parsing of quotes.
parent
e00360d9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
55 additions
and
168 deletions
+55
-168
modules/control/http/util.c
modules/control/http/util.c
+55
-168
No files found.
modules/control/http/util.c
View file @
d0100c33
...
...
@@ -812,208 +812,95 @@ char *E_(FirstWord)( char *psz, char *new )
else
return
NULL
;
}
/**********************************************************************
* Find_end_MRL: Find the end of the sentence :
* this function parses the string psz and find the end of the item
* and/or option with detecting the " and ' problems.
* returns NULL if an error is detected, otherwise, returns a pointer
* of the end of the sentence (after the last character)
**********************************************************************/
static
char
*
Find_end_MRL
(
char
*
psz
)
{
char
*
s_sent
=
psz
;
switch
(
*
s_sent
)
{
case
'\"'
:
{
s_sent
++
;
/**********************************************************************
* MRLParse: parse the MRL, find the MRL string and the options,
* create an item with all information in it, and return the item.
* return NULL if there is an error.
**********************************************************************/
while
(
(
*
s_sent
!=
'\"'
)
&&
(
*
s_sent
!=
'\0'
)
)
{
if
(
*
s_sent
==
'\''
)
{
s_sent
=
Find_end_MRL
(
s_sent
)
;
/* Function analog to FirstWord except that it relies on colon instead
* of space to delimit option boundaries. */
static
char
*
FirstOption
(
char
*
psz
,
char
*
new
)
{
vlc_bool_t
b_end
,
b_start
=
VLC_TRUE
;
if
(
s_sent
==
NULL
)
{
return
NULL
;
}
}
else
{
s_sent
++
;
}
}
while
(
*
psz
==
' '
)
psz
++
;
if
(
*
s_sent
==
'\"'
)
{
s_sent
++
;
return
s_sent
;
}
else
/* *s_sent == '\0' , which means the number of " is incorrect */
{
return
NULL
;
}
break
;
}
case
'\''
:
while
(
*
psz
!=
'\0'
&&
(
*
psz
!=
' '
||
psz
[
1
]
!=
':'
)
)
{
if
(
*
psz
==
'\''
)
{
s_sent
++
;
while
(
(
*
s_sent
!=
'\''
)
&&
(
*
s_sent
!=
'\0'
)
)
{
if
(
*
s_sent
==
'\"'
)
{
s_sent
=
Find_end_MRL
(
s_sent
);
if
(
s_sent
==
NULL
)
{
return
NULL
;
}
}
else
{
s_sent
++
;
}
}
if
(
*
s_sent
==
'\''
)
{
s_sent
++
;
return
s_sent
;
}
else
/* *s_sent == '\0' , which means the number of ' is incorrect */
char
c
=
*
psz
++
;
while
(
*
psz
!=
'\0'
&&
*
psz
!=
c
)
{
return
NULL
;
if
(
*
psz
==
'\\'
&&
psz
[
1
]
!=
'\0'
)
psz
++
;
*
new
++
=
*
psz
++
;
b_start
=
VLC_FALSE
;
}
break
;
if
(
*
psz
==
c
)
psz
++
;
}
default:
/* now we can look for spaces */
else
{
while
(
(
*
s_sent
!=
' '
)
&&
(
*
s_sent
!=
'\0'
)
)
{
if
(
(
*
s_sent
==
'\''
)
||
(
*
s_sent
==
'\"'
)
)
{
s_sent
=
Find_end_MRL
(
s_sent
);
}
else
{
s_sent
++
;
}
}
return
s_sent
;
if
(
*
psz
==
'\\'
&&
psz
[
1
]
!=
'\0'
)
psz
++
;
*
new
++
=
*
psz
++
;
b_start
=
VLC_FALSE
;
}
}
b_end
=
!*
psz
;
if
(
!
b_start
)
while
(
new
[
-
1
]
==
' '
)
new
--
;
*
new
++
=
'\0'
;
if
(
!
b_end
)
return
psz
+
1
;
else
return
NULL
;
}
/**********************************************************************
* parse_MRL: parse the MRL, find the mrl string and the options,
* create an item with all information in it, and return the item.
* return NULL if there is an error.
**********************************************************************/
playlist_item_t
*
E_
(
MRLParse
)(
intf_thread_t
*
p_intf
,
char
*
psz
,
char
*
psz_name
)
playlist_item_t
*
E_
(
MRLParse
)(
intf_thread_t
*
p_intf
,
char
*
_psz
,
char
*
psz_name
)
{
char
**
ppsz_options
=
NULL
;
char
*
mrl
;
char
*
psz
=
strdup
(
_psz
);
char
*
s_mrl
=
psz
;
int
i_error
=
0
;
char
*
s_temp
;
int
i
=
0
;
int
i_options
=
0
;
playlist_item_t
*
p_item
=
NULL
;
/* In case there is spaces before the mrl */
while
(
*
s_mrl
==
' '
)
s_mrl
++
;
/* extract the mrl */
s_temp
=
strstr
(
s_mrl
,
" :"
);
s_temp
=
FirstOption
(
s_mrl
,
s_mrl
);
if
(
s_temp
==
NULL
)
{
s_temp
=
s_mrl
+
strlen
(
s_mrl
);
}
else
{
while
(
(
*
s_temp
==
' '
)
&&
(
s_temp
!=
s_mrl
)
)
{
s_temp
--
;
}
s_temp
++
;
}
/* if the mrl is between " or ', we must remove them */
if
(
(
*
s_mrl
==
'\''
)
||
(
*
s_mrl
==
'\"'
)
)
{
mrl
=
(
char
*
)
malloc
(
(
s_temp
-
s_mrl
-
1
)
*
sizeof
(
char
)
);
strncpy
(
mrl
,
(
s_mrl
+
1
)
,
s_temp
-
s_mrl
-
2
);
mrl
[
s_temp
-
s_mrl
-
2
]
=
'\0'
;
}
else
{
mrl
=
(
char
*
)
malloc
(
(
s_temp
-
s_mrl
+
1
)
*
sizeof
(
char
)
);
strncpy
(
mrl
,
s_mrl
,
s_temp
-
s_mrl
);
mrl
[
s_temp
-
s_mrl
]
=
'\0'
;
}
p_item
=
playlist_ItemNew
(
p_intf
,
s_mrl
,
psz_name
);
s_mrl
=
s_temp
;
/* now we can take care of the options */
while
(
(
*
s_mrl
!=
'\0'
)
&&
(
i_error
==
0
)
)
while
(
*
s_mrl
!=
'\0'
)
{
switch
(
*
s_mrl
)
{
case
' '
:
{
s_mrl
++
;
break
;
}
case
':'
:
/* an option */
{
s_temp
=
Find_end_MRL
(
s_mrl
);
if
(
s_temp
==
NULL
)
{
i_error
=
1
;
}
else
{
i_options
++
;
ppsz_options
=
realloc
(
ppsz_options
,
i_options
*
sizeof
(
char
*
)
);
ppsz_options
[
i_options
-
1
]
=
malloc
(
(
s_temp
-
s_mrl
+
1
)
*
sizeof
(
char
)
);
strncpy
(
ppsz_options
[
i_options
-
1
]
,
s_mrl
,
s_temp
-
s_mrl
);
/* don't forget to finish the string with a '\0' */
(
ppsz_options
[
i_options
-
1
])[
s_temp
-
s_mrl
]
=
'\0'
;
s_mrl
=
s_temp
;
}
break
;
}
default:
{
i_error
=
1
;
break
;
}
}
}
if
(
i_error
!=
0
)
{
free
(
mrl
);
}
else
{
/* now create an item */
p_item
=
playlist_ItemNew
(
p_intf
,
mrl
,
psz_name
);
for
(
i
=
0
;
i
<
i_options
;
i
++
)
s_temp
=
FirstOption
(
s_mrl
,
s_mrl
);
if
(
s_mrl
==
'\0'
)
break
;
if
(
s_temp
==
NULL
)
{
playlist_ItemAddOption
(
p_item
,
ppsz_options
[
i
]
);
s_temp
=
s_mrl
+
strlen
(
s_mrl
);
}
playlist_ItemAddOption
(
p_item
,
s_mrl
);
s_mrl
=
s_temp
;
}
for
(
i
=
0
;
i
<
i_options
;
i
++
)
free
(
ppsz_options
[
i
]
);
if
(
i_options
)
free
(
ppsz_options
);
free
(
psz
);
return
p_item
;
}
/**********************************************************************
* RealPath: parse ../, ~ and path stuff
**********************************************************************/
...
...
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