WordPress 4.4
[autoinstalls/wordpress.git] / wp-includes / random_compat / byte_safe_strings.php
1 <?php
2 /**
3  * Random_* Compatibility Library
4  * for using the new PHP 7 random_* API in PHP 5 projects
5  *
6  * The MIT License (MIT)
7  *
8  * Copyright (c) 2015 Paragon Initiative Enterprises
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a copy
11  * of this software and associated documentation files (the "Software"), to deal
12  * in the Software without restriction, including without limitation the rights
13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14  * copies of the Software, and to permit persons to whom the Software is
15  * furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included in
18  * all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26  * SOFTWARE.
27  */
28
29 if (!function_exists('RandomCompat_strlen')) {
30     if (
31         defined('MB_OVERLOAD_STRING') &&
32         ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
33     ) {
34         /**
35          * strlen() implementation that isn't brittle to mbstring.func_overload
36          *
37          * This version uses mb_strlen() in '8bit' mode to treat strings as raw
38          * binary rather than UTF-8, ISO-8859-1, etc
39          *
40          * @param string $binary_string
41          *
42          * @throws TypeError
43          *
44          * @return int
45          */
46         function RandomCompat_strlen($binary_string)
47         {
48             if (!is_string($binary_string)) {
49                 throw new TypeError(
50                     'RandomCompat_strlen() expects a string'
51                 );
52             }
53             return mb_strlen($binary_string, '8bit');
54         }
55     } else {
56         /**
57          * strlen() implementation that isn't brittle to mbstring.func_overload
58          *
59          * This version just used the default strlen()
60          *
61          * @param string $binary_string
62          *
63          * @throws TypeError
64          *
65          * @return int
66          */
67         function RandomCompat_strlen($binary_string)
68         {
69             if (!is_string($binary_string)) {
70                 throw new TypeError(
71                     'RandomCompat_strlen() expects a string'
72                 );
73             }
74             return strlen($binary_string);
75         }
76     }
77 }
78
79 if (!function_exists('RandomCompat_substr')) {
80     if (
81         defined('MB_OVERLOAD_STRING') &&
82         ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
83     ) {
84         /**
85          * substr() implementation that isn't brittle to mbstring.func_overload
86          *
87          * This version uses mb_substr() in '8bit' mode to treat strings as raw
88          * binary rather than UTF-8, ISO-8859-1, etc
89          *
90          * @param string $binary_string
91          * @param int $start
92          * @param int $length (optional)
93          *
94          * @throws TypeError
95          *
96          * @return string
97          */
98         function RandomCompat_substr($binary_string, $start, $length = null)
99         {
100             if (!is_string($binary_string)) {
101                 throw new TypeError(
102                     'RandomCompat_substr(): First argument should be a string'
103                 );
104             }
105             if (!is_int($start)) {
106                 throw new TypeError(
107                     'RandomCompat_substr(): Second argument should be an integer'
108                 );
109             }
110             if ($length === null) {
111                 /**
112                  * mb_substr($str, 0, NULL, '8bit') returns an empty string on
113                  * PHP 5.3, so we have to find the length ourselves.
114                  */
115                 $length = RandomCompat_strlen($length) - $start;
116             } elseif (!is_int($length)) {
117                 throw new TypeError(
118                     'RandomCompat_substr(): Third argument should be an integer, or omitted'
119                 );
120             }
121             return mb_substr($binary_string, $start, $length, '8bit');
122         }
123     } else {
124         /**
125          * substr() implementation that isn't brittle to mbstring.func_overload
126          *
127          * This version just uses the default substr()
128          *
129          * @param string $binary_string
130          * @param int $start
131          * @param int $length (optional)
132          *
133          * @throws TypeError
134          *
135          * @return string
136          */
137         function RandomCompat_substr($binary_string, $start, $length = null)
138         {
139             if (!is_string($binary_string)) {
140                 throw new TypeError(
141                     'RandomCompat_substr(): First argument should be a string'
142                 );
143             }
144             if (!is_int($start)) {
145                 throw new TypeError(
146                     'RandomCompat_substr(): Second argument should be an integer'
147                 );
148             }
149             if ($length !== null) {
150                 if (!is_int($length)) {
151                     throw new TypeError(
152                         'RandomCompat_substr(): Third argument should be an integer, or omitted'
153                     );
154                 }
155                 return substr($binary_string, $start, $length);
156             }
157             return substr($binary_string, $start);
158         }
159     }
160 }