]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - extlib/ParagonIE/ConstantTime/Binary.php
Update PEAR to v1.10.9 and patch it so it works quietly
[quix0rs-gnu-social.git] / extlib / ParagonIE / ConstantTime / Binary.php
1 <?php
2 namespace ParagonIE\ConstantTime;
3
4 /**
5  *  Copyright (c) 2016 Paragon Initiative Enterprises.
6  *  Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
7  *
8  *  Permission is hereby granted, free of charge, to any person obtaining a copy
9  *  of this software and associated documentation files (the "Software"), to deal
10  *  in the Software without restriction, including without limitation the rights
11  *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  *  copies of the Software, and to permit persons to whom the Software is
13  *  furnished to do so, subject to the following conditions:
14  *
15  *  The above copyright notice and this permission notice shall be included in all
16  *  copies or substantial portions of the Software.
17  *
18  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24  *  SOFTWARE.
25  */
26
27 /**
28  * Class Binary
29  *
30  * Binary string operators that don't choke on
31  * mbstring.func_overload
32  *
33  * @package ParagonIE\ConstantTime
34  */
35 abstract class Binary
36 {
37     /**
38      * Safe string length
39      *
40      * @ref mbstring.func_overload
41      *
42      * @param string $str
43      * @return int
44      */
45     public static function safeStrlen($str)
46     {
47         if (\function_exists('mb_strlen')) {
48             return \mb_strlen($str, '8bit');
49         } else {
50             return \strlen($str);
51         }
52     }
53
54     /**
55      * Safe substring
56      *
57      * @ref mbstring.func_overload
58      *
59      * @staticvar boolean $exists
60      * @param string $str
61      * @param int $start
62      * @param int $length
63      * @return string
64      * @throws \TypeError
65      */
66     public static function safeSubstr(
67         $str,
68         $start = 0,
69         $length = null
70     ) {
71         if (\function_exists('mb_substr')) {
72             // mb_substr($str, 0, NULL, '8bit') returns an empty string on PHP
73             // 5.3, so we have to find the length ourselves.
74             if ($length === null) {
75                 if ($start >= 0) {
76                     $length = self::safeStrlen($str) - $start;
77                 } else {
78                     $length = -$start;
79                 }
80             }
81             // $length calculation above might result in a 0-length string
82             if ($length === 0) {
83                 return '';
84             }
85             return \mb_substr($str, $start, $length, '8bit');
86         }
87         if ($length === 0) {
88             return '';
89         }
90         // Unlike mb_substr(), substr() doesn't accept NULL for length
91         if ($length !== null) {
92             return \substr($str, $start, $length);
93         } else {
94             return \substr($str, $start);
95         }
96     }
97 }