Subversion-Projekte lars-tiefland.ci

Revision

Revision 1257 | Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
68 lars 1
<?php
2
/**
3
 * CodeIgniter
4
 *
5
 * An open source application development framework for PHP
6
 *
7
 * This content is released under the MIT License (MIT)
8
 *
9
 * Copyright (c) 2014 - 2016, British Columbia Institute of Technology
10
 *
11
 * Permission is hereby granted, free of charge, to any person obtaining a copy
12
 * of this software and associated documentation files (the "Software"), to deal
13
 * in the Software without restriction, including without limitation the rights
14
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
 * copies of the Software, and to permit persons to whom the Software is
16
 * furnished to do so, subject to the following conditions:
17
 *
18
 * The above copyright notice and this permission notice shall be included in
19
 * all copies or substantial portions of the Software.
20
 *
21
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
 * THE SOFTWARE.
28
 *
29
 * @package	CodeIgniter
30
 * @author	EllisLab Dev Team
31
 * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
32
 * @copyright	Copyright (c) 2014 - 2016, British Columbia Institute of Technology (http://bcit.ca/)
33
 * @license	http://opensource.org/licenses/MIT	MIT License
34
 * @link	https://codeigniter.com
35
 * @since	Version 3.0.0
36
 * @filesource
37
 */
38
defined('BASEPATH') OR exit('No direct script access allowed');
39
 
40
/**
41
 * PHP ext/standard compatibility package
42
 *
43
 * @package		CodeIgniter
44
 * @subpackage	CodeIgniter
45
 * @category	Compatibility
46
 * @author		Andrey Andreev
47
 * @link		https://codeigniter.com/user_guide/
48
 */
49
 
50
// ------------------------------------------------------------------------
51
 
52
if (is_php('5.5'))
53
{
54
	return;
55
}
56
 
57
// ------------------------------------------------------------------------
58
 
59
if ( ! function_exists('array_column'))
60
{
61
	/**
62
	 * array_column()
63
	 *
64
	 * @link	http://php.net/array_column
65
	 * @param	array	$array
66
	 * @param	mixed	$column_key
67
	 * @param	mixed	$index_key
68
	 * @return	array
69
	 */
70
	function array_column(array $array, $column_key, $index_key = NULL)
71
	{
72
		if ( ! in_array($type = gettype($column_key), array('integer', 'string', 'NULL'), TRUE))
73
		{
74
			if ($type === 'double')
75
			{
76
				$column_key = (int) $column_key;
77
			}
78
			elseif ($type === 'object' && method_exists($column_key, '__toString'))
79
			{
80
				$column_key = (string) $column_key;
81
			}
82
			else
83
			{
84
				trigger_error('array_column(): The column key should be either a string or an integer', E_USER_WARNING);
85
				return FALSE;
86
			}
87
		}
88
 
89
		if ( ! in_array($type = gettype($index_key), array('integer', 'string', 'NULL'), TRUE))
90
		{
91
			if ($type === 'double')
92
			{
93
				$index_key = (int) $index_key;
94
			}
95
			elseif ($type === 'object' && method_exists($index_key, '__toString'))
96
			{
97
				$index_key = (string) $index_key;
98
			}
99
			else
100
			{
101
				trigger_error('array_column(): The index key should be either a string or an integer', E_USER_WARNING);
102
				return FALSE;
103
			}
104
		}
105
 
106
		$result = array();
107
		foreach ($array as &$a)
108
		{
109
			if ($column_key === NULL)
110
			{
111
				$value = $a;
112
			}
113
			elseif (is_array($a) && array_key_exists($column_key, $a))
114
			{
115
				$value = $a[$column_key];
116
			}
117
			else
118
			{
119
				continue;
120
			}
121
 
122
			if ($index_key === NULL OR ! array_key_exists($index_key, $a))
123
			{
124
				$result[] = $value;
125
			}
126
			else
127
			{
128
				$result[$a[$index_key]] = $value;
129
			}
130
		}
131
 
132
		return $result;
133
	}
134
}
135
 
136
// ------------------------------------------------------------------------
137
 
138
if (is_php('5.4'))
139
{
140
	return;
141
}
142
 
143
// ------------------------------------------------------------------------
144
 
145
if ( ! function_exists('hex2bin'))
146
{
147
	/**
148
	 * hex2bin()
149
	 *
150
	 * @link	http://php.net/hex2bin
151
	 * @param	string	$data
152
	 * @return	string
153
	 */
154
	function hex2bin($data)
155
	{
156
		if (in_array($type = gettype($data), array('array', 'double', 'object'), TRUE))
157
		{
158
			if ($type === 'object' && method_exists($data, '__toString'))
159
			{
160
				$data = (string) $data;
161
			}
162
			else
163
			{
164
				trigger_error('hex2bin() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING);
165
				return NULL;
166
			}
167
		}
168
 
169
		if (strlen($data) % 2 !== 0)
170
		{
171
			trigger_error('Hexadecimal input string must have an even length', E_USER_WARNING);
172
			return FALSE;
173
		}
174
		elseif ( ! preg_match('/^[0-9a-f]*$/i', $data))
175
		{
176
			trigger_error('Input string must be hexadecimal string', E_USER_WARNING);
177
			return FALSE;
178
		}
179
 
180
		return pack('H*', $data);
181
	}
182
}
183
 
184
// ------------------------------------------------------------------------
185
 
186
if (is_php('5.3'))
187
{
188
	return;
189
}
190
 
191
// ------------------------------------------------------------------------
192
 
193
if ( ! function_exists('array_replace'))
194
{
195
	/**
196
	 * array_replace()
197
	 *
198
	 * @link	http://php.net/array_replace
199
	 * @return	array
200
	 */
201
	function array_replace()
202
	{
203
		$arrays = func_get_args();
204
 
205
		if (($c = count($arrays)) === 0)
206
		{
207
			trigger_error('array_replace() expects at least 1 parameter, 0 given', E_USER_WARNING);
208
			return NULL;
209
		}
210
		elseif ($c === 1)
211
		{
212
			if ( ! is_array($arrays[0]))
213
			{
214
				trigger_error('array_replace(): Argument #1 is not an array', E_USER_WARNING);
215
				return NULL;
216
			}
217
 
218
			return $arrays[0];
219
		}
220
 
221
		$array = array_shift($arrays);
222
		$c--;
223
 
224
		for ($i = 0; $i < $c; $i++)
225
		{
226
			if ( ! is_array($arrays[$i]))
227
			{
228
				trigger_error('array_replace(): Argument #'.($i + 2).' is not an array', E_USER_WARNING);
229
				return NULL;
230
			}
231
			elseif (empty($arrays[$i]))
232
			{
233
				continue;
234
			}
235
 
236
			foreach (array_keys($arrays[$i]) as $key)
237
			{
238
				$array[$key] = $arrays[$i][$key];
239
			}
240
		}
241
 
242
		return $array;
243
	}
244
}
245
 
246
// ------------------------------------------------------------------------
247
 
248
if ( ! function_exists('array_replace_recursive'))
249
{
250
	/**
251
	 * array_replace_recursive()
252
	 *
253
	 * @link	http://php.net/array_replace_recursive
254
	 * @return	array
255
	 */
256
	function array_replace_recursive()
257
	{
258
		$arrays = func_get_args();
259
 
260
		if (($c = count($arrays)) === 0)
261
		{
262
			trigger_error('array_replace_recursive() expects at least 1 parameter, 0 given', E_USER_WARNING);
263
			return NULL;
264
		}
265
		elseif ($c === 1)
266
		{
267
			if ( ! is_array($arrays[0]))
268
			{
269
				trigger_error('array_replace_recursive(): Argument #1 is not an array', E_USER_WARNING);
270
				return NULL;
271
			}
272
 
273
			return $arrays[0];
274
		}
275
 
276
		$array = array_shift($arrays);
277
		$c--;
278
 
279
		for ($i = 0; $i < $c; $i++)
280
		{
281
			if ( ! is_array($arrays[$i]))
282
			{
283
				trigger_error('array_replace_recursive(): Argument #'.($i + 2).' is not an array', E_USER_WARNING);
284
				return NULL;
285
			}
286
			elseif (empty($arrays[$i]))
287
			{
288
				continue;
289
			}
290
 
291
			foreach (array_keys($arrays[$i]) as $key)
292
			{
293
				$array[$key] = (is_array($arrays[$i][$key]) && isset($array[$key]) && is_array($array[$key]))
294
					? array_replace_recursive($array[$key], $arrays[$i][$key])
295
					: $arrays[$i][$key];
296
			}
297
		}
298
 
299
		return $array;
300
	}
301
}
302
 
303
// ------------------------------------------------------------------------
304
 
305
if ( ! function_exists('quoted_printable_encode'))
306
{
307
	/**
308
	 * quoted_printable_encode()
309
	 *
310
	 * @link	http://php.net/quoted_printable_encode
311
	 * @param	string	$str
312
	 * @return	string
313
	 */
314
	function quoted_printable_encode($str)
315
	{
316
		if (strlen($str) === 0)
317
		{
318
			return '';
319
		}
320
		elseif (in_array($type = gettype($str), array('array', 'object'), TRUE))
321
		{
322
			if ($type === 'object' && method_exists($str, '__toString'))
323
			{
324
				$str = (string) $str;
325
			}
326
			else
327
			{
328
				trigger_error('quoted_printable_encode() expects parameter 1 to be string, '.$type.' given', E_USER_WARNING);
329
				return NULL;
330
			}
331
		}
332
 
333
		if (function_exists('imap_8bit'))
334
		{
335
			return imap_8bit($str);
336
		}
337
 
338
		$i = $lp = 0;
339
		$output = '';
340
		$hex = '0123456789ABCDEF';
341
		$length = (extension_loaded('mbstring') && ini_get('mbstring.func_overload'))
342
			? mb_strlen($str, '8bit')
343
			: strlen($str);
344
 
345
		while ($length--)
346
		{
347
			if ((($c = $str[$i++]) === "\015") && isset($str[$i]) && ($str[$i] === "\012") && $length > 0)
348
			{
349
				$output .= "\015".$str[$i++];
350
				$length--;
351
				$lp = 0;
352
				continue;
353
			}
354
 
355
			if (
356
				ctype_cntrl($c)
357
				OR (ord($c) === 0x7f)
358
				OR (ord($c) & 0x80)
359
				OR ($c === '=')
360
				OR ($c === ' ' && isset($str[$i]) && $str[$i] === "\015")
361
			)
362
			{
363
				if (
364
					(($lp += 3) > 75 && ord($c) <= 0x7f)
365
					OR (ord($c) > 0x7f && ord($c) <= 0xdf && ($lp + 3) > 75)
366
					OR (ord($c) > 0xdf && ord($c) <= 0xef && ($lp + 6) > 75)
367
					OR (ord($c) > 0xef && ord($c) <= 0xf4 && ($lp + 9) > 75)
368
				)
369
				{
370
					$output .= "=\015\012";
371
					$lp = 3;
372
				}
373
 
374
				$output .= '='.$hex[ord($c) >> 4].$hex[ord($c) & 0xf];
375
				continue;
376
			}
377
 
378
			if ((++$lp) > 75)
379
			{
380
				$output .= "=\015\012";
381
				$lp = 1;
382
			}
383
 
384
			$output .= $c;
385
		}
386
 
387
		return $output;
388
	}
389
}