stream_extractor: add vlc_stream_extractor_CreateMRL
[vlc.git] / src / input / mrl_helpers.h
1 /*****************************************************************************
2  * mrl_helpers.h
3  *****************************************************************************
4  * Copyright (C) 2016 VLC authors and VideoLAN
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19  *****************************************************************************/
20
21 #ifndef INPUT_MRL_HELPERS_H
22 #define INPUT_MRL_HELPERS_H
23
24 #include <string.h>
25 #include <stdlib.h>
26
27 #include <vlc_common.h>
28 #include <vlc_memstream.h>
29 #include <vlc_arrays.h>
30
31 /**
32  * \defgroup mrl_helpers MRL helpers
33  * \ingroup mrl
34  *
35  * Helper functions related to parsing, as well as generating, data
36  * related to the \link MRL-specification\endlink.
37  *
38  * @{
39  * \file
40  **/
41
42 /**
43  * Escape a fragment identifier for use within an MRL
44  *
45  * The function will generate a string that follows the \link mrl
46  * MRL-specification\endlink regarding \em fragment-identifiers.
47  *
48  * See the \link mrl MRL-specification\endlink for a detailed
49  * explanation of how `payload` will be escaped.
50  *
51  * \param[out] out `*out` will refer to the created string on success,
52  *                  and an unspecified value on error.
53  * \param[in] payload the data to escape.
54  * \return VLC_SUCCESS on success, an error-code on failure.
55  **/
56 static inline int
57 mrl_EscapeFragmentIdentifier( char** out, char const* payload )
58 {
59     struct vlc_memstream mstream;
60
61 #define RFC3986_SUBDELIMS  "!" "$" "&" "'" "(" ")" \
62                            "*" "+" "," ";" "="
63 #define RFC3986_ALPHA      "abcdefghijklmnopqrstuvwxyz" \
64                            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
65 #define RFC3986_DIGIT      "0123456789"
66 #define RFC3986_UNRESERVED RFC3986_ALPHA RFC3986_DIGIT "-" "." "_" "~"
67 #define RFC3986_PCHAR      RFC3986_UNRESERVED RFC3986_SUBDELIMS ":" "@"
68 #define RFC3986_FRAGMENT   RFC3986_PCHAR "/" "?"
69
70     if( vlc_memstream_open( &mstream ) )
71         return VLC_EGENERIC;
72
73     for( char const* p = payload; *p; ++p )
74     {
75         vlc_memstream_printf( &mstream,
76             ( strchr( "!?", *p ) == NULL &&
77               strchr( RFC3986_FRAGMENT, *p ) ? "%c" : "%%%02hhx"), *p );
78     }
79
80 #undef RFC3986_FRAGMENT
81 #undef RFC3986_PCHAR
82 #undef RFC3986_UNRESERVEd
83 #undef RFC3986_DIGIT
84 #undef RFC3986_ALPHA
85 #undef RFC3986_SUBDELIMS
86
87     if( vlc_memstream_close( &mstream ) )
88         return VLC_EGENERIC;
89
90     *out = mstream.ptr;
91     return VLC_SUCCESS;
92 }
93
94 /*
95  * @}
96  **/
97
98 #endif /* include-guard */