web/wp-includes/SimplePie/Misc.php
changeset 204 09a1c134465b
equal deleted inserted replaced
203:f507feede89a 204:09a1c134465b
       
     1 <?php
       
     2 /**
       
     3  * SimplePie
       
     4  *
       
     5  * A PHP-Based RSS and Atom Feed Framework.
       
     6  * Takes the hard work out of managing a complete RSS/Atom solution.
       
     7  *
       
     8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
       
     9  * All rights reserved.
       
    10  *
       
    11  * Redistribution and use in source and binary forms, with or without modification, are
       
    12  * permitted provided that the following conditions are met:
       
    13  *
       
    14  * 	* Redistributions of source code must retain the above copyright notice, this list of
       
    15  * 	  conditions and the following disclaimer.
       
    16  *
       
    17  * 	* Redistributions in binary form must reproduce the above copyright notice, this list
       
    18  * 	  of conditions and the following disclaimer in the documentation and/or other materials
       
    19  * 	  provided with the distribution.
       
    20  *
       
    21  * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
       
    22  * 	  to endorse or promote products derived from this software without specific prior
       
    23  * 	  written permission.
       
    24  *
       
    25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
       
    26  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
       
    27  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
       
    28  * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
       
    29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
       
    30  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
    31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
       
    32  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
       
    33  * POSSIBILITY OF SUCH DAMAGE.
       
    34  *
       
    35  * @package SimplePie
       
    36  * @version 1.3.1
       
    37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
       
    38  * @author Ryan Parman
       
    39  * @author Geoffrey Sneddon
       
    40  * @author Ryan McCue
       
    41  * @link http://simplepie.org/ SimplePie
       
    42  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
       
    43  */
       
    44 
       
    45 /**
       
    46  * Miscellanous utilities
       
    47  *
       
    48  * @package SimplePie
       
    49  */
       
    50 class SimplePie_Misc
       
    51 {
       
    52 	public static function time_hms($seconds)
       
    53 	{
       
    54 		$time = '';
       
    55 
       
    56 		$hours = floor($seconds / 3600);
       
    57 		$remainder = $seconds % 3600;
       
    58 		if ($hours > 0)
       
    59 		{
       
    60 			$time .= $hours.':';
       
    61 		}
       
    62 
       
    63 		$minutes = floor($remainder / 60);
       
    64 		$seconds = $remainder % 60;
       
    65 		if ($minutes < 10 && $hours > 0)
       
    66 		{
       
    67 			$minutes = '0' . $minutes;
       
    68 		}
       
    69 		if ($seconds < 10)
       
    70 		{
       
    71 			$seconds = '0' . $seconds;
       
    72 		}
       
    73 
       
    74 		$time .= $minutes.':';
       
    75 		$time .= $seconds;
       
    76 
       
    77 		return $time;
       
    78 	}
       
    79 
       
    80 	public static function absolutize_url($relative, $base)
       
    81 	{
       
    82 		$iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
       
    83 		if ($iri === false)
       
    84 		{
       
    85 			return false;
       
    86 		}
       
    87 		return $iri->get_uri();
       
    88 	}
       
    89 
       
    90 	/**
       
    91 	 * Get a HTML/XML element from a HTML string
       
    92 	 *
       
    93 	 * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!)
       
    94 	 * @param string $realname Element name (including namespace prefix if applicable)
       
    95 	 * @param string $string HTML document
       
    96 	 * @return array
       
    97 	 */
       
    98 	public static function get_element($realname, $string)
       
    99 	{
       
   100 		$return = array();
       
   101 		$name = preg_quote($realname, '/');
       
   102 		if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
       
   103 		{
       
   104 			for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
       
   105 			{
       
   106 				$return[$i]['tag'] = $realname;
       
   107 				$return[$i]['full'] = $matches[$i][0][0];
       
   108 				$return[$i]['offset'] = $matches[$i][0][1];
       
   109 				if (strlen($matches[$i][3][0]) <= 2)
       
   110 				{
       
   111 					$return[$i]['self_closing'] = true;
       
   112 				}
       
   113 				else
       
   114 				{
       
   115 					$return[$i]['self_closing'] = false;
       
   116 					$return[$i]['content'] = $matches[$i][4][0];
       
   117 				}
       
   118 				$return[$i]['attribs'] = array();
       
   119 				if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
       
   120 				{
       
   121 					for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
       
   122 					{
       
   123 						if (count($attribs[$j]) === 2)
       
   124 						{
       
   125 							$attribs[$j][2] = $attribs[$j][1];
       
   126 						}
       
   127 						$return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
       
   128 					}
       
   129 				}
       
   130 			}
       
   131 		}
       
   132 		return $return;
       
   133 	}
       
   134 
       
   135 	public static function element_implode($element)
       
   136 	{
       
   137 		$full = "<$element[tag]";
       
   138 		foreach ($element['attribs'] as $key => $value)
       
   139 		{
       
   140 			$key = strtolower($key);
       
   141 			$full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
       
   142 		}
       
   143 		if ($element['self_closing'])
       
   144 		{
       
   145 			$full .= ' />';
       
   146 		}
       
   147 		else
       
   148 		{
       
   149 			$full .= ">$element[content]</$element[tag]>";
       
   150 		}
       
   151 		return $full;
       
   152 	}
       
   153 
       
   154 	public static function error($message, $level, $file, $line)
       
   155 	{
       
   156 		if ((ini_get('error_reporting') & $level) > 0)
       
   157 		{
       
   158 			switch ($level)
       
   159 			{
       
   160 				case E_USER_ERROR:
       
   161 					$note = 'PHP Error';
       
   162 					break;
       
   163 				case E_USER_WARNING:
       
   164 					$note = 'PHP Warning';
       
   165 					break;
       
   166 				case E_USER_NOTICE:
       
   167 					$note = 'PHP Notice';
       
   168 					break;
       
   169 				default:
       
   170 					$note = 'Unknown Error';
       
   171 					break;
       
   172 			}
       
   173 
       
   174 			$log_error = true;
       
   175 			if (!function_exists('error_log'))
       
   176 			{
       
   177 				$log_error = false;
       
   178 			}
       
   179 
       
   180 			$log_file = @ini_get('error_log');
       
   181 			if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file))
       
   182 			{
       
   183 				$log_error = false;
       
   184 			}
       
   185 
       
   186 			if ($log_error)
       
   187 			{
       
   188 				@error_log("$note: $message in $file on line $line", 0);
       
   189 			}
       
   190 		}
       
   191 
       
   192 		return $message;
       
   193 	}
       
   194 
       
   195 	public static function fix_protocol($url, $http = 1)
       
   196 	{
       
   197 		$url = SimplePie_Misc::normalize_url($url);
       
   198 		$parsed = SimplePie_Misc::parse_url($url);
       
   199 		if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
       
   200 		{
       
   201 			return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
       
   202 		}
       
   203 
       
   204 		if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
       
   205 		{
       
   206 			return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
       
   207 		}
       
   208 
       
   209 		if ($http === 2 && $parsed['scheme'] !== '')
       
   210 		{
       
   211 			return "feed:$url";
       
   212 		}
       
   213 		elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
       
   214 		{
       
   215 			return substr_replace($url, 'podcast', 0, 4);
       
   216 		}
       
   217 		elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
       
   218 		{
       
   219 			return substr_replace($url, 'itpc', 0, 4);
       
   220 		}
       
   221 		else
       
   222 		{
       
   223 			return $url;
       
   224 		}
       
   225 	}
       
   226 
       
   227 	public static function parse_url($url)
       
   228 	{
       
   229 		$iri = new SimplePie_IRI($url);
       
   230 		return array(
       
   231 			'scheme' => (string) $iri->scheme,
       
   232 			'authority' => (string) $iri->authority,
       
   233 			'path' => (string) $iri->path,
       
   234 			'query' => (string) $iri->query,
       
   235 			'fragment' => (string) $iri->fragment
       
   236 		);
       
   237 	}
       
   238 
       
   239 	public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
       
   240 	{
       
   241 		$iri = new SimplePie_IRI('');
       
   242 		$iri->scheme = $scheme;
       
   243 		$iri->authority = $authority;
       
   244 		$iri->path = $path;
       
   245 		$iri->query = $query;
       
   246 		$iri->fragment = $fragment;
       
   247 		return $iri->get_uri();
       
   248 	}
       
   249 
       
   250 	public static function normalize_url($url)
       
   251 	{
       
   252 		$iri = new SimplePie_IRI($url);
       
   253 		return $iri->get_uri();
       
   254 	}
       
   255 
       
   256 	public static function percent_encoding_normalization($match)
       
   257 	{
       
   258 		$integer = hexdec($match[1]);
       
   259 		if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
       
   260 		{
       
   261 			return chr($integer);
       
   262 		}
       
   263 		else
       
   264 		{
       
   265 			return strtoupper($match[0]);
       
   266 		}
       
   267 	}
       
   268 
       
   269 	/**
       
   270 	 * Converts a Windows-1252 encoded string to a UTF-8 encoded string
       
   271 	 *
       
   272 	 * @static
       
   273 	 * @param string $string Windows-1252 encoded string
       
   274 	 * @return string UTF-8 encoded string
       
   275 	 */
       
   276 	public static function windows_1252_to_utf8($string)
       
   277 	{
       
   278 		static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
       
   279 
       
   280 		return strtr($string, $convert_table);
       
   281 	}
       
   282 
       
   283 	/**
       
   284 	 * Change a string from one encoding to another
       
   285 	 *
       
   286 	 * @param string $data Raw data in $input encoding
       
   287 	 * @param string $input Encoding of $data
       
   288 	 * @param string $output Encoding you want
       
   289 	 * @return string|boolean False if we can't convert it
       
   290 	 */
       
   291 	public static function change_encoding($data, $input, $output)
       
   292 	{
       
   293 		$input = SimplePie_Misc::encoding($input);
       
   294 		$output = SimplePie_Misc::encoding($output);
       
   295 
       
   296 		// We fail to fail on non US-ASCII bytes
       
   297 		if ($input === 'US-ASCII')
       
   298 		{
       
   299 			static $non_ascii_octects = '';
       
   300 			if (!$non_ascii_octects)
       
   301 			{
       
   302 				for ($i = 0x80; $i <= 0xFF; $i++)
       
   303 				{
       
   304 					$non_ascii_octects .= chr($i);
       
   305 				}
       
   306 			}
       
   307 			$data = substr($data, 0, strcspn($data, $non_ascii_octects));
       
   308 		}
       
   309 
       
   310 		// This is first, as behaviour of this is completely predictable
       
   311 		if ($input === 'windows-1252' && $output === 'UTF-8')
       
   312 		{
       
   313 			return SimplePie_Misc::windows_1252_to_utf8($data);
       
   314 		}
       
   315 		// This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
       
   316 		elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output)))
       
   317 		{
       
   318 			return $return;
       
   319  		}
       
   320 		// This is last, as behaviour of this varies with OS userland and PHP version
       
   321 		elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))
       
   322 		{
       
   323 			return $return;
       
   324 		}
       
   325 		// If we can't do anything, just fail
       
   326 		else
       
   327 		{
       
   328 			return false;
       
   329 		}
       
   330 	}
       
   331 
       
   332 	protected static function change_encoding_mbstring($data, $input, $output)
       
   333 	{
       
   334 		if ($input === 'windows-949')
       
   335 		{
       
   336 			$input = 'EUC-KR';
       
   337 		}
       
   338 		if ($output === 'windows-949')
       
   339 		{
       
   340 			$output = 'EUC-KR';
       
   341 		}
       
   342 		if ($input === 'Windows-31J')
       
   343 		{
       
   344 			$input = 'SJIS';
       
   345 		}
       
   346 		if ($output === 'Windows-31J')
       
   347 		{
       
   348 			$output = 'SJIS';
       
   349 		}
       
   350 
       
   351 		// Check that the encoding is supported
       
   352 		if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80")
       
   353 		{
       
   354 			return false;
       
   355 		}
       
   356 		if (!in_array($input, mb_list_encodings()))
       
   357 		{
       
   358 			return false;
       
   359 		}
       
   360 
       
   361 		// Let's do some conversion
       
   362 		if ($return = @mb_convert_encoding($data, $output, $input))
       
   363 		{
       
   364 			return $return;
       
   365 		}
       
   366 
       
   367 		return false;
       
   368 	}
       
   369 
       
   370 	protected static function change_encoding_iconv($data, $input, $output)
       
   371 	{
       
   372 		return @iconv($input, $output, $data);
       
   373 	}
       
   374 
       
   375 	/**
       
   376 	 * Normalize an encoding name
       
   377 	 *
       
   378 	 * This is automatically generated by create.php
       
   379 	 *
       
   380 	 * To generate it, run `php create.php` on the command line, and copy the
       
   381 	 * output to replace this function.
       
   382 	 *
       
   383 	 * @param string $charset Character set to standardise
       
   384 	 * @return string Standardised name
       
   385 	 */
       
   386 	public static function encoding($charset)
       
   387 	{
       
   388 		// Normalization from UTS #22
       
   389 		switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
       
   390 		{
       
   391 			case 'adobestandardencoding':
       
   392 			case 'csadobestandardencoding':
       
   393 				return 'Adobe-Standard-Encoding';
       
   394 
       
   395 			case 'adobesymbolencoding':
       
   396 			case 'cshppsmath':
       
   397 				return 'Adobe-Symbol-Encoding';
       
   398 
       
   399 			case 'ami1251':
       
   400 			case 'amiga1251':
       
   401 				return 'Amiga-1251';
       
   402 
       
   403 			case 'ansix31101983':
       
   404 			case 'csat5001983':
       
   405 			case 'csiso99naplps':
       
   406 			case 'isoir99':
       
   407 			case 'naplps':
       
   408 				return 'ANSI_X3.110-1983';
       
   409 
       
   410 			case 'arabic7':
       
   411 			case 'asmo449':
       
   412 			case 'csiso89asmo449':
       
   413 			case 'iso9036':
       
   414 			case 'isoir89':
       
   415 				return 'ASMO_449';
       
   416 
       
   417 			case 'big5':
       
   418 			case 'csbig5':
       
   419 				return 'Big5';
       
   420 
       
   421 			case 'big5hkscs':
       
   422 				return 'Big5-HKSCS';
       
   423 
       
   424 			case 'bocu1':
       
   425 			case 'csbocu1':
       
   426 				return 'BOCU-1';
       
   427 
       
   428 			case 'brf':
       
   429 			case 'csbrf':
       
   430 				return 'BRF';
       
   431 
       
   432 			case 'bs4730':
       
   433 			case 'csiso4unitedkingdom':
       
   434 			case 'gb':
       
   435 			case 'iso646gb':
       
   436 			case 'isoir4':
       
   437 			case 'uk':
       
   438 				return 'BS_4730';
       
   439 
       
   440 			case 'bsviewdata':
       
   441 			case 'csiso47bsviewdata':
       
   442 			case 'isoir47':
       
   443 				return 'BS_viewdata';
       
   444 
       
   445 			case 'cesu8':
       
   446 			case 'cscesu8':
       
   447 				return 'CESU-8';
       
   448 
       
   449 			case 'ca':
       
   450 			case 'csa71':
       
   451 			case 'csaz243419851':
       
   452 			case 'csiso121canadian1':
       
   453 			case 'iso646ca':
       
   454 			case 'isoir121':
       
   455 				return 'CSA_Z243.4-1985-1';
       
   456 
       
   457 			case 'csa72':
       
   458 			case 'csaz243419852':
       
   459 			case 'csiso122canadian2':
       
   460 			case 'iso646ca2':
       
   461 			case 'isoir122':
       
   462 				return 'CSA_Z243.4-1985-2';
       
   463 
       
   464 			case 'csaz24341985gr':
       
   465 			case 'csiso123csaz24341985gr':
       
   466 			case 'isoir123':
       
   467 				return 'CSA_Z243.4-1985-gr';
       
   468 
       
   469 			case 'csiso139csn369103':
       
   470 			case 'csn369103':
       
   471 			case 'isoir139':
       
   472 				return 'CSN_369103';
       
   473 
       
   474 			case 'csdecmcs':
       
   475 			case 'dec':
       
   476 			case 'decmcs':
       
   477 				return 'DEC-MCS';
       
   478 
       
   479 			case 'csiso21german':
       
   480 			case 'de':
       
   481 			case 'din66003':
       
   482 			case 'iso646de':
       
   483 			case 'isoir21':
       
   484 				return 'DIN_66003';
       
   485 
       
   486 			case 'csdkus':
       
   487 			case 'dkus':
       
   488 				return 'dk-us';
       
   489 
       
   490 			case 'csiso646danish':
       
   491 			case 'dk':
       
   492 			case 'ds2089':
       
   493 			case 'iso646dk':
       
   494 				return 'DS_2089';
       
   495 
       
   496 			case 'csibmebcdicatde':
       
   497 			case 'ebcdicatde':
       
   498 				return 'EBCDIC-AT-DE';
       
   499 
       
   500 			case 'csebcdicatdea':
       
   501 			case 'ebcdicatdea':
       
   502 				return 'EBCDIC-AT-DE-A';
       
   503 
       
   504 			case 'csebcdiccafr':
       
   505 			case 'ebcdiccafr':
       
   506 				return 'EBCDIC-CA-FR';
       
   507 
       
   508 			case 'csebcdicdkno':
       
   509 			case 'ebcdicdkno':
       
   510 				return 'EBCDIC-DK-NO';
       
   511 
       
   512 			case 'csebcdicdknoa':
       
   513 			case 'ebcdicdknoa':
       
   514 				return 'EBCDIC-DK-NO-A';
       
   515 
       
   516 			case 'csebcdices':
       
   517 			case 'ebcdices':
       
   518 				return 'EBCDIC-ES';
       
   519 
       
   520 			case 'csebcdicesa':
       
   521 			case 'ebcdicesa':
       
   522 				return 'EBCDIC-ES-A';
       
   523 
       
   524 			case 'csebcdicess':
       
   525 			case 'ebcdicess':
       
   526 				return 'EBCDIC-ES-S';
       
   527 
       
   528 			case 'csebcdicfise':
       
   529 			case 'ebcdicfise':
       
   530 				return 'EBCDIC-FI-SE';
       
   531 
       
   532 			case 'csebcdicfisea':
       
   533 			case 'ebcdicfisea':
       
   534 				return 'EBCDIC-FI-SE-A';
       
   535 
       
   536 			case 'csebcdicfr':
       
   537 			case 'ebcdicfr':
       
   538 				return 'EBCDIC-FR';
       
   539 
       
   540 			case 'csebcdicit':
       
   541 			case 'ebcdicit':
       
   542 				return 'EBCDIC-IT';
       
   543 
       
   544 			case 'csebcdicpt':
       
   545 			case 'ebcdicpt':
       
   546 				return 'EBCDIC-PT';
       
   547 
       
   548 			case 'csebcdicuk':
       
   549 			case 'ebcdicuk':
       
   550 				return 'EBCDIC-UK';
       
   551 
       
   552 			case 'csebcdicus':
       
   553 			case 'ebcdicus':
       
   554 				return 'EBCDIC-US';
       
   555 
       
   556 			case 'csiso111ecmacyrillic':
       
   557 			case 'ecmacyrillic':
       
   558 			case 'isoir111':
       
   559 			case 'koi8e':
       
   560 				return 'ECMA-cyrillic';
       
   561 
       
   562 			case 'csiso17spanish':
       
   563 			case 'es':
       
   564 			case 'iso646es':
       
   565 			case 'isoir17':
       
   566 				return 'ES';
       
   567 
       
   568 			case 'csiso85spanish2':
       
   569 			case 'es2':
       
   570 			case 'iso646es2':
       
   571 			case 'isoir85':
       
   572 				return 'ES2';
       
   573 
       
   574 			case 'cseucpkdfmtjapanese':
       
   575 			case 'eucjp':
       
   576 			case 'extendedunixcodepackedformatforjapanese':
       
   577 				return 'EUC-JP';
       
   578 
       
   579 			case 'cseucfixwidjapanese':
       
   580 			case 'extendedunixcodefixedwidthforjapanese':
       
   581 				return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
       
   582 
       
   583 			case 'gb18030':
       
   584 				return 'GB18030';
       
   585 
       
   586 			case 'chinese':
       
   587 			case 'cp936':
       
   588 			case 'csgb2312':
       
   589 			case 'csiso58gb231280':
       
   590 			case 'gb2312':
       
   591 			case 'gb231280':
       
   592 			case 'gbk':
       
   593 			case 'isoir58':
       
   594 			case 'ms936':
       
   595 			case 'windows936':
       
   596 				return 'GBK';
       
   597 
       
   598 			case 'cn':
       
   599 			case 'csiso57gb1988':
       
   600 			case 'gb198880':
       
   601 			case 'iso646cn':
       
   602 			case 'isoir57':
       
   603 				return 'GB_1988-80';
       
   604 
       
   605 			case 'csiso153gost1976874':
       
   606 			case 'gost1976874':
       
   607 			case 'isoir153':
       
   608 			case 'stsev35888':
       
   609 				return 'GOST_19768-74';
       
   610 
       
   611 			case 'csiso150':
       
   612 			case 'csiso150greekccitt':
       
   613 			case 'greekccitt':
       
   614 			case 'isoir150':
       
   615 				return 'greek-ccitt';
       
   616 
       
   617 			case 'csiso88greek7':
       
   618 			case 'greek7':
       
   619 			case 'isoir88':
       
   620 				return 'greek7';
       
   621 
       
   622 			case 'csiso18greek7old':
       
   623 			case 'greek7old':
       
   624 			case 'isoir18':
       
   625 				return 'greek7-old';
       
   626 
       
   627 			case 'cshpdesktop':
       
   628 			case 'hpdesktop':
       
   629 				return 'HP-DeskTop';
       
   630 
       
   631 			case 'cshplegal':
       
   632 			case 'hplegal':
       
   633 				return 'HP-Legal';
       
   634 
       
   635 			case 'cshpmath8':
       
   636 			case 'hpmath8':
       
   637 				return 'HP-Math8';
       
   638 
       
   639 			case 'cshppifont':
       
   640 			case 'hppifont':
       
   641 				return 'HP-Pi-font';
       
   642 
       
   643 			case 'cshproman8':
       
   644 			case 'hproman8':
       
   645 			case 'r8':
       
   646 			case 'roman8':
       
   647 				return 'hp-roman8';
       
   648 
       
   649 			case 'hzgb2312':
       
   650 				return 'HZ-GB-2312';
       
   651 
       
   652 			case 'csibmsymbols':
       
   653 			case 'ibmsymbols':
       
   654 				return 'IBM-Symbols';
       
   655 
       
   656 			case 'csibmthai':
       
   657 			case 'ibmthai':
       
   658 				return 'IBM-Thai';
       
   659 
       
   660 			case 'cp37':
       
   661 			case 'csibm37':
       
   662 			case 'ebcdiccpca':
       
   663 			case 'ebcdiccpnl':
       
   664 			case 'ebcdiccpus':
       
   665 			case 'ebcdiccpwt':
       
   666 			case 'ibm37':
       
   667 				return 'IBM037';
       
   668 
       
   669 			case 'cp38':
       
   670 			case 'csibm38':
       
   671 			case 'ebcdicint':
       
   672 			case 'ibm38':
       
   673 				return 'IBM038';
       
   674 
       
   675 			case 'cp273':
       
   676 			case 'csibm273':
       
   677 			case 'ibm273':
       
   678 				return 'IBM273';
       
   679 
       
   680 			case 'cp274':
       
   681 			case 'csibm274':
       
   682 			case 'ebcdicbe':
       
   683 			case 'ibm274':
       
   684 				return 'IBM274';
       
   685 
       
   686 			case 'cp275':
       
   687 			case 'csibm275':
       
   688 			case 'ebcdicbr':
       
   689 			case 'ibm275':
       
   690 				return 'IBM275';
       
   691 
       
   692 			case 'csibm277':
       
   693 			case 'ebcdiccpdk':
       
   694 			case 'ebcdiccpno':
       
   695 			case 'ibm277':
       
   696 				return 'IBM277';
       
   697 
       
   698 			case 'cp278':
       
   699 			case 'csibm278':
       
   700 			case 'ebcdiccpfi':
       
   701 			case 'ebcdiccpse':
       
   702 			case 'ibm278':
       
   703 				return 'IBM278';
       
   704 
       
   705 			case 'cp280':
       
   706 			case 'csibm280':
       
   707 			case 'ebcdiccpit':
       
   708 			case 'ibm280':
       
   709 				return 'IBM280';
       
   710 
       
   711 			case 'cp281':
       
   712 			case 'csibm281':
       
   713 			case 'ebcdicjpe':
       
   714 			case 'ibm281':
       
   715 				return 'IBM281';
       
   716 
       
   717 			case 'cp284':
       
   718 			case 'csibm284':
       
   719 			case 'ebcdiccpes':
       
   720 			case 'ibm284':
       
   721 				return 'IBM284';
       
   722 
       
   723 			case 'cp285':
       
   724 			case 'csibm285':
       
   725 			case 'ebcdiccpgb':
       
   726 			case 'ibm285':
       
   727 				return 'IBM285';
       
   728 
       
   729 			case 'cp290':
       
   730 			case 'csibm290':
       
   731 			case 'ebcdicjpkana':
       
   732 			case 'ibm290':
       
   733 				return 'IBM290';
       
   734 
       
   735 			case 'cp297':
       
   736 			case 'csibm297':
       
   737 			case 'ebcdiccpfr':
       
   738 			case 'ibm297':
       
   739 				return 'IBM297';
       
   740 
       
   741 			case 'cp420':
       
   742 			case 'csibm420':
       
   743 			case 'ebcdiccpar1':
       
   744 			case 'ibm420':
       
   745 				return 'IBM420';
       
   746 
       
   747 			case 'cp423':
       
   748 			case 'csibm423':
       
   749 			case 'ebcdiccpgr':
       
   750 			case 'ibm423':
       
   751 				return 'IBM423';
       
   752 
       
   753 			case 'cp424':
       
   754 			case 'csibm424':
       
   755 			case 'ebcdiccphe':
       
   756 			case 'ibm424':
       
   757 				return 'IBM424';
       
   758 
       
   759 			case '437':
       
   760 			case 'cp437':
       
   761 			case 'cspc8codepage437':
       
   762 			case 'ibm437':
       
   763 				return 'IBM437';
       
   764 
       
   765 			case 'cp500':
       
   766 			case 'csibm500':
       
   767 			case 'ebcdiccpbe':
       
   768 			case 'ebcdiccpch':
       
   769 			case 'ibm500':
       
   770 				return 'IBM500';
       
   771 
       
   772 			case 'cp775':
       
   773 			case 'cspc775baltic':
       
   774 			case 'ibm775':
       
   775 				return 'IBM775';
       
   776 
       
   777 			case '850':
       
   778 			case 'cp850':
       
   779 			case 'cspc850multilingual':
       
   780 			case 'ibm850':
       
   781 				return 'IBM850';
       
   782 
       
   783 			case '851':
       
   784 			case 'cp851':
       
   785 			case 'csibm851':
       
   786 			case 'ibm851':
       
   787 				return 'IBM851';
       
   788 
       
   789 			case '852':
       
   790 			case 'cp852':
       
   791 			case 'cspcp852':
       
   792 			case 'ibm852':
       
   793 				return 'IBM852';
       
   794 
       
   795 			case '855':
       
   796 			case 'cp855':
       
   797 			case 'csibm855':
       
   798 			case 'ibm855':
       
   799 				return 'IBM855';
       
   800 
       
   801 			case '857':
       
   802 			case 'cp857':
       
   803 			case 'csibm857':
       
   804 			case 'ibm857':
       
   805 				return 'IBM857';
       
   806 
       
   807 			case 'ccsid858':
       
   808 			case 'cp858':
       
   809 			case 'ibm858':
       
   810 			case 'pcmultilingual850euro':
       
   811 				return 'IBM00858';
       
   812 
       
   813 			case '860':
       
   814 			case 'cp860':
       
   815 			case 'csibm860':
       
   816 			case 'ibm860':
       
   817 				return 'IBM860';
       
   818 
       
   819 			case '861':
       
   820 			case 'cp861':
       
   821 			case 'cpis':
       
   822 			case 'csibm861':
       
   823 			case 'ibm861':
       
   824 				return 'IBM861';
       
   825 
       
   826 			case '862':
       
   827 			case 'cp862':
       
   828 			case 'cspc862latinhebrew':
       
   829 			case 'ibm862':
       
   830 				return 'IBM862';
       
   831 
       
   832 			case '863':
       
   833 			case 'cp863':
       
   834 			case 'csibm863':
       
   835 			case 'ibm863':
       
   836 				return 'IBM863';
       
   837 
       
   838 			case 'cp864':
       
   839 			case 'csibm864':
       
   840 			case 'ibm864':
       
   841 				return 'IBM864';
       
   842 
       
   843 			case '865':
       
   844 			case 'cp865':
       
   845 			case 'csibm865':
       
   846 			case 'ibm865':
       
   847 				return 'IBM865';
       
   848 
       
   849 			case '866':
       
   850 			case 'cp866':
       
   851 			case 'csibm866':
       
   852 			case 'ibm866':
       
   853 				return 'IBM866';
       
   854 
       
   855 			case 'cp868':
       
   856 			case 'cpar':
       
   857 			case 'csibm868':
       
   858 			case 'ibm868':
       
   859 				return 'IBM868';
       
   860 
       
   861 			case '869':
       
   862 			case 'cp869':
       
   863 			case 'cpgr':
       
   864 			case 'csibm869':
       
   865 			case 'ibm869':
       
   866 				return 'IBM869';
       
   867 
       
   868 			case 'cp870':
       
   869 			case 'csibm870':
       
   870 			case 'ebcdiccproece':
       
   871 			case 'ebcdiccpyu':
       
   872 			case 'ibm870':
       
   873 				return 'IBM870';
       
   874 
       
   875 			case 'cp871':
       
   876 			case 'csibm871':
       
   877 			case 'ebcdiccpis':
       
   878 			case 'ibm871':
       
   879 				return 'IBM871';
       
   880 
       
   881 			case 'cp880':
       
   882 			case 'csibm880':
       
   883 			case 'ebcdiccyrillic':
       
   884 			case 'ibm880':
       
   885 				return 'IBM880';
       
   886 
       
   887 			case 'cp891':
       
   888 			case 'csibm891':
       
   889 			case 'ibm891':
       
   890 				return 'IBM891';
       
   891 
       
   892 			case 'cp903':
       
   893 			case 'csibm903':
       
   894 			case 'ibm903':
       
   895 				return 'IBM903';
       
   896 
       
   897 			case '904':
       
   898 			case 'cp904':
       
   899 			case 'csibbm904':
       
   900 			case 'ibm904':
       
   901 				return 'IBM904';
       
   902 
       
   903 			case 'cp905':
       
   904 			case 'csibm905':
       
   905 			case 'ebcdiccptr':
       
   906 			case 'ibm905':
       
   907 				return 'IBM905';
       
   908 
       
   909 			case 'cp918':
       
   910 			case 'csibm918':
       
   911 			case 'ebcdiccpar2':
       
   912 			case 'ibm918':
       
   913 				return 'IBM918';
       
   914 
       
   915 			case 'ccsid924':
       
   916 			case 'cp924':
       
   917 			case 'ebcdiclatin9euro':
       
   918 			case 'ibm924':
       
   919 				return 'IBM00924';
       
   920 
       
   921 			case 'cp1026':
       
   922 			case 'csibm1026':
       
   923 			case 'ibm1026':
       
   924 				return 'IBM1026';
       
   925 
       
   926 			case 'ibm1047':
       
   927 				return 'IBM1047';
       
   928 
       
   929 			case 'ccsid1140':
       
   930 			case 'cp1140':
       
   931 			case 'ebcdicus37euro':
       
   932 			case 'ibm1140':
       
   933 				return 'IBM01140';
       
   934 
       
   935 			case 'ccsid1141':
       
   936 			case 'cp1141':
       
   937 			case 'ebcdicde273euro':
       
   938 			case 'ibm1141':
       
   939 				return 'IBM01141';
       
   940 
       
   941 			case 'ccsid1142':
       
   942 			case 'cp1142':
       
   943 			case 'ebcdicdk277euro':
       
   944 			case 'ebcdicno277euro':
       
   945 			case 'ibm1142':
       
   946 				return 'IBM01142';
       
   947 
       
   948 			case 'ccsid1143':
       
   949 			case 'cp1143':
       
   950 			case 'ebcdicfi278euro':
       
   951 			case 'ebcdicse278euro':
       
   952 			case 'ibm1143':
       
   953 				return 'IBM01143';
       
   954 
       
   955 			case 'ccsid1144':
       
   956 			case 'cp1144':
       
   957 			case 'ebcdicit280euro':
       
   958 			case 'ibm1144':
       
   959 				return 'IBM01144';
       
   960 
       
   961 			case 'ccsid1145':
       
   962 			case 'cp1145':
       
   963 			case 'ebcdices284euro':
       
   964 			case 'ibm1145':
       
   965 				return 'IBM01145';
       
   966 
       
   967 			case 'ccsid1146':
       
   968 			case 'cp1146':
       
   969 			case 'ebcdicgb285euro':
       
   970 			case 'ibm1146':
       
   971 				return 'IBM01146';
       
   972 
       
   973 			case 'ccsid1147':
       
   974 			case 'cp1147':
       
   975 			case 'ebcdicfr297euro':
       
   976 			case 'ibm1147':
       
   977 				return 'IBM01147';
       
   978 
       
   979 			case 'ccsid1148':
       
   980 			case 'cp1148':
       
   981 			case 'ebcdicinternational500euro':
       
   982 			case 'ibm1148':
       
   983 				return 'IBM01148';
       
   984 
       
   985 			case 'ccsid1149':
       
   986 			case 'cp1149':
       
   987 			case 'ebcdicis871euro':
       
   988 			case 'ibm1149':
       
   989 				return 'IBM01149';
       
   990 
       
   991 			case 'csiso143iecp271':
       
   992 			case 'iecp271':
       
   993 			case 'isoir143':
       
   994 				return 'IEC_P27-1';
       
   995 
       
   996 			case 'csiso49inis':
       
   997 			case 'inis':
       
   998 			case 'isoir49':
       
   999 				return 'INIS';
       
  1000 
       
  1001 			case 'csiso50inis8':
       
  1002 			case 'inis8':
       
  1003 			case 'isoir50':
       
  1004 				return 'INIS-8';
       
  1005 
       
  1006 			case 'csiso51iniscyrillic':
       
  1007 			case 'iniscyrillic':
       
  1008 			case 'isoir51':
       
  1009 				return 'INIS-cyrillic';
       
  1010 
       
  1011 			case 'csinvariant':
       
  1012 			case 'invariant':
       
  1013 				return 'INVARIANT';
       
  1014 
       
  1015 			case 'iso2022cn':
       
  1016 				return 'ISO-2022-CN';
       
  1017 
       
  1018 			case 'iso2022cnext':
       
  1019 				return 'ISO-2022-CN-EXT';
       
  1020 
       
  1021 			case 'csiso2022jp':
       
  1022 			case 'iso2022jp':
       
  1023 				return 'ISO-2022-JP';
       
  1024 
       
  1025 			case 'csiso2022jp2':
       
  1026 			case 'iso2022jp2':
       
  1027 				return 'ISO-2022-JP-2';
       
  1028 
       
  1029 			case 'csiso2022kr':
       
  1030 			case 'iso2022kr':
       
  1031 				return 'ISO-2022-KR';
       
  1032 
       
  1033 			case 'cswindows30latin1':
       
  1034 			case 'iso88591windows30latin1':
       
  1035 				return 'ISO-8859-1-Windows-3.0-Latin-1';
       
  1036 
       
  1037 			case 'cswindows31latin1':
       
  1038 			case 'iso88591windows31latin1':
       
  1039 				return 'ISO-8859-1-Windows-3.1-Latin-1';
       
  1040 
       
  1041 			case 'csisolatin2':
       
  1042 			case 'iso88592':
       
  1043 			case 'iso885921987':
       
  1044 			case 'isoir101':
       
  1045 			case 'l2':
       
  1046 			case 'latin2':
       
  1047 				return 'ISO-8859-2';
       
  1048 
       
  1049 			case 'cswindows31latin2':
       
  1050 			case 'iso88592windowslatin2':
       
  1051 				return 'ISO-8859-2-Windows-Latin-2';
       
  1052 
       
  1053 			case 'csisolatin3':
       
  1054 			case 'iso88593':
       
  1055 			case 'iso885931988':
       
  1056 			case 'isoir109':
       
  1057 			case 'l3':
       
  1058 			case 'latin3':
       
  1059 				return 'ISO-8859-3';
       
  1060 
       
  1061 			case 'csisolatin4':
       
  1062 			case 'iso88594':
       
  1063 			case 'iso885941988':
       
  1064 			case 'isoir110':
       
  1065 			case 'l4':
       
  1066 			case 'latin4':
       
  1067 				return 'ISO-8859-4';
       
  1068 
       
  1069 			case 'csisolatincyrillic':
       
  1070 			case 'cyrillic':
       
  1071 			case 'iso88595':
       
  1072 			case 'iso885951988':
       
  1073 			case 'isoir144':
       
  1074 				return 'ISO-8859-5';
       
  1075 
       
  1076 			case 'arabic':
       
  1077 			case 'asmo708':
       
  1078 			case 'csisolatinarabic':
       
  1079 			case 'ecma114':
       
  1080 			case 'iso88596':
       
  1081 			case 'iso885961987':
       
  1082 			case 'isoir127':
       
  1083 				return 'ISO-8859-6';
       
  1084 
       
  1085 			case 'csiso88596e':
       
  1086 			case 'iso88596e':
       
  1087 				return 'ISO-8859-6-E';
       
  1088 
       
  1089 			case 'csiso88596i':
       
  1090 			case 'iso88596i':
       
  1091 				return 'ISO-8859-6-I';
       
  1092 
       
  1093 			case 'csisolatingreek':
       
  1094 			case 'ecma118':
       
  1095 			case 'elot928':
       
  1096 			case 'greek':
       
  1097 			case 'greek8':
       
  1098 			case 'iso88597':
       
  1099 			case 'iso885971987':
       
  1100 			case 'isoir126':
       
  1101 				return 'ISO-8859-7';
       
  1102 
       
  1103 			case 'csisolatinhebrew':
       
  1104 			case 'hebrew':
       
  1105 			case 'iso88598':
       
  1106 			case 'iso885981988':
       
  1107 			case 'isoir138':
       
  1108 				return 'ISO-8859-8';
       
  1109 
       
  1110 			case 'csiso88598e':
       
  1111 			case 'iso88598e':
       
  1112 				return 'ISO-8859-8-E';
       
  1113 
       
  1114 			case 'csiso88598i':
       
  1115 			case 'iso88598i':
       
  1116 				return 'ISO-8859-8-I';
       
  1117 
       
  1118 			case 'cswindows31latin5':
       
  1119 			case 'iso88599windowslatin5':
       
  1120 				return 'ISO-8859-9-Windows-Latin-5';
       
  1121 
       
  1122 			case 'csisolatin6':
       
  1123 			case 'iso885910':
       
  1124 			case 'iso8859101992':
       
  1125 			case 'isoir157':
       
  1126 			case 'l6':
       
  1127 			case 'latin6':
       
  1128 				return 'ISO-8859-10';
       
  1129 
       
  1130 			case 'iso885913':
       
  1131 				return 'ISO-8859-13';
       
  1132 
       
  1133 			case 'iso885914':
       
  1134 			case 'iso8859141998':
       
  1135 			case 'isoceltic':
       
  1136 			case 'isoir199':
       
  1137 			case 'l8':
       
  1138 			case 'latin8':
       
  1139 				return 'ISO-8859-14';
       
  1140 
       
  1141 			case 'iso885915':
       
  1142 			case 'latin9':
       
  1143 				return 'ISO-8859-15';
       
  1144 
       
  1145 			case 'iso885916':
       
  1146 			case 'iso8859162001':
       
  1147 			case 'isoir226':
       
  1148 			case 'l10':
       
  1149 			case 'latin10':
       
  1150 				return 'ISO-8859-16';
       
  1151 
       
  1152 			case 'iso10646j1':
       
  1153 				return 'ISO-10646-J-1';
       
  1154 
       
  1155 			case 'csunicode':
       
  1156 			case 'iso10646ucs2':
       
  1157 				return 'ISO-10646-UCS-2';
       
  1158 
       
  1159 			case 'csucs4':
       
  1160 			case 'iso10646ucs4':
       
  1161 				return 'ISO-10646-UCS-4';
       
  1162 
       
  1163 			case 'csunicodeascii':
       
  1164 			case 'iso10646ucsbasic':
       
  1165 				return 'ISO-10646-UCS-Basic';
       
  1166 
       
  1167 			case 'csunicodelatin1':
       
  1168 			case 'iso10646':
       
  1169 			case 'iso10646unicodelatin1':
       
  1170 				return 'ISO-10646-Unicode-Latin1';
       
  1171 
       
  1172 			case 'csiso10646utf1':
       
  1173 			case 'iso10646utf1':
       
  1174 				return 'ISO-10646-UTF-1';
       
  1175 
       
  1176 			case 'csiso115481':
       
  1177 			case 'iso115481':
       
  1178 			case 'isotr115481':
       
  1179 				return 'ISO-11548-1';
       
  1180 
       
  1181 			case 'csiso90':
       
  1182 			case 'isoir90':
       
  1183 				return 'iso-ir-90';
       
  1184 
       
  1185 			case 'csunicodeibm1261':
       
  1186 			case 'isounicodeibm1261':
       
  1187 				return 'ISO-Unicode-IBM-1261';
       
  1188 
       
  1189 			case 'csunicodeibm1264':
       
  1190 			case 'isounicodeibm1264':
       
  1191 				return 'ISO-Unicode-IBM-1264';
       
  1192 
       
  1193 			case 'csunicodeibm1265':
       
  1194 			case 'isounicodeibm1265':
       
  1195 				return 'ISO-Unicode-IBM-1265';
       
  1196 
       
  1197 			case 'csunicodeibm1268':
       
  1198 			case 'isounicodeibm1268':
       
  1199 				return 'ISO-Unicode-IBM-1268';
       
  1200 
       
  1201 			case 'csunicodeibm1276':
       
  1202 			case 'isounicodeibm1276':
       
  1203 				return 'ISO-Unicode-IBM-1276';
       
  1204 
       
  1205 			case 'csiso646basic1983':
       
  1206 			case 'iso646basic1983':
       
  1207 			case 'ref':
       
  1208 				return 'ISO_646.basic:1983';
       
  1209 
       
  1210 			case 'csiso2intlrefversion':
       
  1211 			case 'irv':
       
  1212 			case 'iso646irv1983':
       
  1213 			case 'isoir2':
       
  1214 				return 'ISO_646.irv:1983';
       
  1215 
       
  1216 			case 'csiso2033':
       
  1217 			case 'e13b':
       
  1218 			case 'iso20331983':
       
  1219 			case 'isoir98':
       
  1220 				return 'ISO_2033-1983';
       
  1221 
       
  1222 			case 'csiso5427cyrillic':
       
  1223 			case 'iso5427':
       
  1224 			case 'isoir37':
       
  1225 				return 'ISO_5427';
       
  1226 
       
  1227 			case 'iso5427cyrillic1981':
       
  1228 			case 'iso54271981':
       
  1229 			case 'isoir54':
       
  1230 				return 'ISO_5427:1981';
       
  1231 
       
  1232 			case 'csiso5428greek':
       
  1233 			case 'iso54281980':
       
  1234 			case 'isoir55':
       
  1235 				return 'ISO_5428:1980';
       
  1236 
       
  1237 			case 'csiso6937add':
       
  1238 			case 'iso6937225':
       
  1239 			case 'isoir152':
       
  1240 				return 'ISO_6937-2-25';
       
  1241 
       
  1242 			case 'csisotextcomm':
       
  1243 			case 'iso69372add':
       
  1244 			case 'isoir142':
       
  1245 				return 'ISO_6937-2-add';
       
  1246 
       
  1247 			case 'csiso8859supp':
       
  1248 			case 'iso8859supp':
       
  1249 			case 'isoir154':
       
  1250 			case 'latin125':
       
  1251 				return 'ISO_8859-supp';
       
  1252 
       
  1253 			case 'csiso10367box':
       
  1254 			case 'iso10367box':
       
  1255 			case 'isoir155':
       
  1256 				return 'ISO_10367-box';
       
  1257 
       
  1258 			case 'csiso15italian':
       
  1259 			case 'iso646it':
       
  1260 			case 'isoir15':
       
  1261 			case 'it':
       
  1262 				return 'IT';
       
  1263 
       
  1264 			case 'csiso13jisc6220jp':
       
  1265 			case 'isoir13':
       
  1266 			case 'jisc62201969':
       
  1267 			case 'jisc62201969jp':
       
  1268 			case 'katakana':
       
  1269 			case 'x2017':
       
  1270 				return 'JIS_C6220-1969-jp';
       
  1271 
       
  1272 			case 'csiso14jisc6220ro':
       
  1273 			case 'iso646jp':
       
  1274 			case 'isoir14':
       
  1275 			case 'jisc62201969ro':
       
  1276 			case 'jp':
       
  1277 				return 'JIS_C6220-1969-ro';
       
  1278 
       
  1279 			case 'csiso42jisc62261978':
       
  1280 			case 'isoir42':
       
  1281 			case 'jisc62261978':
       
  1282 				return 'JIS_C6226-1978';
       
  1283 
       
  1284 			case 'csiso87jisx208':
       
  1285 			case 'isoir87':
       
  1286 			case 'jisc62261983':
       
  1287 			case 'jisx2081983':
       
  1288 			case 'x208':
       
  1289 				return 'JIS_C6226-1983';
       
  1290 
       
  1291 			case 'csiso91jisc62291984a':
       
  1292 			case 'isoir91':
       
  1293 			case 'jisc62291984a':
       
  1294 			case 'jpocra':
       
  1295 				return 'JIS_C6229-1984-a';
       
  1296 
       
  1297 			case 'csiso92jisc62991984b':
       
  1298 			case 'iso646jpocrb':
       
  1299 			case 'isoir92':
       
  1300 			case 'jisc62291984b':
       
  1301 			case 'jpocrb':
       
  1302 				return 'JIS_C6229-1984-b';
       
  1303 
       
  1304 			case 'csiso93jis62291984badd':
       
  1305 			case 'isoir93':
       
  1306 			case 'jisc62291984badd':
       
  1307 			case 'jpocrbadd':
       
  1308 				return 'JIS_C6229-1984-b-add';
       
  1309 
       
  1310 			case 'csiso94jis62291984hand':
       
  1311 			case 'isoir94':
       
  1312 			case 'jisc62291984hand':
       
  1313 			case 'jpocrhand':
       
  1314 				return 'JIS_C6229-1984-hand';
       
  1315 
       
  1316 			case 'csiso95jis62291984handadd':
       
  1317 			case 'isoir95':
       
  1318 			case 'jisc62291984handadd':
       
  1319 			case 'jpocrhandadd':
       
  1320 				return 'JIS_C6229-1984-hand-add';
       
  1321 
       
  1322 			case 'csiso96jisc62291984kana':
       
  1323 			case 'isoir96':
       
  1324 			case 'jisc62291984kana':
       
  1325 				return 'JIS_C6229-1984-kana';
       
  1326 
       
  1327 			case 'csjisencoding':
       
  1328 			case 'jisencoding':
       
  1329 				return 'JIS_Encoding';
       
  1330 
       
  1331 			case 'cshalfwidthkatakana':
       
  1332 			case 'jisx201':
       
  1333 			case 'x201':
       
  1334 				return 'JIS_X0201';
       
  1335 
       
  1336 			case 'csiso159jisx2121990':
       
  1337 			case 'isoir159':
       
  1338 			case 'jisx2121990':
       
  1339 			case 'x212':
       
  1340 				return 'JIS_X0212-1990';
       
  1341 
       
  1342 			case 'csiso141jusib1002':
       
  1343 			case 'iso646yu':
       
  1344 			case 'isoir141':
       
  1345 			case 'js':
       
  1346 			case 'jusib1002':
       
  1347 			case 'yu':
       
  1348 				return 'JUS_I.B1.002';
       
  1349 
       
  1350 			case 'csiso147macedonian':
       
  1351 			case 'isoir147':
       
  1352 			case 'jusib1003mac':
       
  1353 			case 'macedonian':
       
  1354 				return 'JUS_I.B1.003-mac';
       
  1355 
       
  1356 			case 'csiso146serbian':
       
  1357 			case 'isoir146':
       
  1358 			case 'jusib1003serb':
       
  1359 			case 'serbian':
       
  1360 				return 'JUS_I.B1.003-serb';
       
  1361 
       
  1362 			case 'koi7switched':
       
  1363 				return 'KOI7-switched';
       
  1364 
       
  1365 			case 'cskoi8r':
       
  1366 			case 'koi8r':
       
  1367 				return 'KOI8-R';
       
  1368 
       
  1369 			case 'koi8u':
       
  1370 				return 'KOI8-U';
       
  1371 
       
  1372 			case 'csksc5636':
       
  1373 			case 'iso646kr':
       
  1374 			case 'ksc5636':
       
  1375 				return 'KSC5636';
       
  1376 
       
  1377 			case 'cskz1048':
       
  1378 			case 'kz1048':
       
  1379 			case 'rk1048':
       
  1380 			case 'strk10482002':
       
  1381 				return 'KZ-1048';
       
  1382 
       
  1383 			case 'csiso19latingreek':
       
  1384 			case 'isoir19':
       
  1385 			case 'latingreek':
       
  1386 				return 'latin-greek';
       
  1387 
       
  1388 			case 'csiso27latingreek1':
       
  1389 			case 'isoir27':
       
  1390 			case 'latingreek1':
       
  1391 				return 'Latin-greek-1';
       
  1392 
       
  1393 			case 'csiso158lap':
       
  1394 			case 'isoir158':
       
  1395 			case 'lap':
       
  1396 			case 'latinlap':
       
  1397 				return 'latin-lap';
       
  1398 
       
  1399 			case 'csmacintosh':
       
  1400 			case 'mac':
       
  1401 			case 'macintosh':
       
  1402 				return 'macintosh';
       
  1403 
       
  1404 			case 'csmicrosoftpublishing':
       
  1405 			case 'microsoftpublishing':
       
  1406 				return 'Microsoft-Publishing';
       
  1407 
       
  1408 			case 'csmnem':
       
  1409 			case 'mnem':
       
  1410 				return 'MNEM';
       
  1411 
       
  1412 			case 'csmnemonic':
       
  1413 			case 'mnemonic':
       
  1414 				return 'MNEMONIC';
       
  1415 
       
  1416 			case 'csiso86hungarian':
       
  1417 			case 'hu':
       
  1418 			case 'iso646hu':
       
  1419 			case 'isoir86':
       
  1420 			case 'msz77953':
       
  1421 				return 'MSZ_7795.3';
       
  1422 
       
  1423 			case 'csnatsdano':
       
  1424 			case 'isoir91':
       
  1425 			case 'natsdano':
       
  1426 				return 'NATS-DANO';
       
  1427 
       
  1428 			case 'csnatsdanoadd':
       
  1429 			case 'isoir92':
       
  1430 			case 'natsdanoadd':
       
  1431 				return 'NATS-DANO-ADD';
       
  1432 
       
  1433 			case 'csnatssefi':
       
  1434 			case 'isoir81':
       
  1435 			case 'natssefi':
       
  1436 				return 'NATS-SEFI';
       
  1437 
       
  1438 			case 'csnatssefiadd':
       
  1439 			case 'isoir82':
       
  1440 			case 'natssefiadd':
       
  1441 				return 'NATS-SEFI-ADD';
       
  1442 
       
  1443 			case 'csiso151cuba':
       
  1444 			case 'cuba':
       
  1445 			case 'iso646cu':
       
  1446 			case 'isoir151':
       
  1447 			case 'ncnc1081':
       
  1448 				return 'NC_NC00-10:81';
       
  1449 
       
  1450 			case 'csiso69french':
       
  1451 			case 'fr':
       
  1452 			case 'iso646fr':
       
  1453 			case 'isoir69':
       
  1454 			case 'nfz62010':
       
  1455 				return 'NF_Z_62-010';
       
  1456 
       
  1457 			case 'csiso25french':
       
  1458 			case 'iso646fr1':
       
  1459 			case 'isoir25':
       
  1460 			case 'nfz620101973':
       
  1461 				return 'NF_Z_62-010_(1973)';
       
  1462 
       
  1463 			case 'csiso60danishnorwegian':
       
  1464 			case 'csiso60norwegian1':
       
  1465 			case 'iso646no':
       
  1466 			case 'isoir60':
       
  1467 			case 'no':
       
  1468 			case 'ns45511':
       
  1469 				return 'NS_4551-1';
       
  1470 
       
  1471 			case 'csiso61norwegian2':
       
  1472 			case 'iso646no2':
       
  1473 			case 'isoir61':
       
  1474 			case 'no2':
       
  1475 			case 'ns45512':
       
  1476 				return 'NS_4551-2';
       
  1477 
       
  1478 			case 'osdebcdicdf3irv':
       
  1479 				return 'OSD_EBCDIC_DF03_IRV';
       
  1480 
       
  1481 			case 'osdebcdicdf41':
       
  1482 				return 'OSD_EBCDIC_DF04_1';
       
  1483 
       
  1484 			case 'osdebcdicdf415':
       
  1485 				return 'OSD_EBCDIC_DF04_15';
       
  1486 
       
  1487 			case 'cspc8danishnorwegian':
       
  1488 			case 'pc8danishnorwegian':
       
  1489 				return 'PC8-Danish-Norwegian';
       
  1490 
       
  1491 			case 'cspc8turkish':
       
  1492 			case 'pc8turkish':
       
  1493 				return 'PC8-Turkish';
       
  1494 
       
  1495 			case 'csiso16portuguese':
       
  1496 			case 'iso646pt':
       
  1497 			case 'isoir16':
       
  1498 			case 'pt':
       
  1499 				return 'PT';
       
  1500 
       
  1501 			case 'csiso84portuguese2':
       
  1502 			case 'iso646pt2':
       
  1503 			case 'isoir84':
       
  1504 			case 'pt2':
       
  1505 				return 'PT2';
       
  1506 
       
  1507 			case 'cp154':
       
  1508 			case 'csptcp154':
       
  1509 			case 'cyrillicasian':
       
  1510 			case 'pt154':
       
  1511 			case 'ptcp154':
       
  1512 				return 'PTCP154';
       
  1513 
       
  1514 			case 'scsu':
       
  1515 				return 'SCSU';
       
  1516 
       
  1517 			case 'csiso10swedish':
       
  1518 			case 'fi':
       
  1519 			case 'iso646fi':
       
  1520 			case 'iso646se':
       
  1521 			case 'isoir10':
       
  1522 			case 'se':
       
  1523 			case 'sen850200b':
       
  1524 				return 'SEN_850200_B';
       
  1525 
       
  1526 			case 'csiso11swedishfornames':
       
  1527 			case 'iso646se2':
       
  1528 			case 'isoir11':
       
  1529 			case 'se2':
       
  1530 			case 'sen850200c':
       
  1531 				return 'SEN_850200_C';
       
  1532 
       
  1533 			case 'csiso102t617bit':
       
  1534 			case 'isoir102':
       
  1535 			case 't617bit':
       
  1536 				return 'T.61-7bit';
       
  1537 
       
  1538 			case 'csiso103t618bit':
       
  1539 			case 'isoir103':
       
  1540 			case 't61':
       
  1541 			case 't618bit':
       
  1542 				return 'T.61-8bit';
       
  1543 
       
  1544 			case 'csiso128t101g2':
       
  1545 			case 'isoir128':
       
  1546 			case 't101g2':
       
  1547 				return 'T.101-G2';
       
  1548 
       
  1549 			case 'cstscii':
       
  1550 			case 'tscii':
       
  1551 				return 'TSCII';
       
  1552 
       
  1553 			case 'csunicode11':
       
  1554 			case 'unicode11':
       
  1555 				return 'UNICODE-1-1';
       
  1556 
       
  1557 			case 'csunicode11utf7':
       
  1558 			case 'unicode11utf7':
       
  1559 				return 'UNICODE-1-1-UTF-7';
       
  1560 
       
  1561 			case 'csunknown8bit':
       
  1562 			case 'unknown8bit':
       
  1563 				return 'UNKNOWN-8BIT';
       
  1564 
       
  1565 			case 'ansix341968':
       
  1566 			case 'ansix341986':
       
  1567 			case 'ascii':
       
  1568 			case 'cp367':
       
  1569 			case 'csascii':
       
  1570 			case 'ibm367':
       
  1571 			case 'iso646irv1991':
       
  1572 			case 'iso646us':
       
  1573 			case 'isoir6':
       
  1574 			case 'us':
       
  1575 			case 'usascii':
       
  1576 				return 'US-ASCII';
       
  1577 
       
  1578 			case 'csusdk':
       
  1579 			case 'usdk':
       
  1580 				return 'us-dk';
       
  1581 
       
  1582 			case 'utf7':
       
  1583 				return 'UTF-7';
       
  1584 
       
  1585 			case 'utf8':
       
  1586 				return 'UTF-8';
       
  1587 
       
  1588 			case 'utf16':
       
  1589 				return 'UTF-16';
       
  1590 
       
  1591 			case 'utf16be':
       
  1592 				return 'UTF-16BE';
       
  1593 
       
  1594 			case 'utf16le':
       
  1595 				return 'UTF-16LE';
       
  1596 
       
  1597 			case 'utf32':
       
  1598 				return 'UTF-32';
       
  1599 
       
  1600 			case 'utf32be':
       
  1601 				return 'UTF-32BE';
       
  1602 
       
  1603 			case 'utf32le':
       
  1604 				return 'UTF-32LE';
       
  1605 
       
  1606 			case 'csventurainternational':
       
  1607 			case 'venturainternational':
       
  1608 				return 'Ventura-International';
       
  1609 
       
  1610 			case 'csventuramath':
       
  1611 			case 'venturamath':
       
  1612 				return 'Ventura-Math';
       
  1613 
       
  1614 			case 'csventuraus':
       
  1615 			case 'venturaus':
       
  1616 				return 'Ventura-US';
       
  1617 
       
  1618 			case 'csiso70videotexsupp1':
       
  1619 			case 'isoir70':
       
  1620 			case 'videotexsuppl':
       
  1621 				return 'videotex-suppl';
       
  1622 
       
  1623 			case 'csviqr':
       
  1624 			case 'viqr':
       
  1625 				return 'VIQR';
       
  1626 
       
  1627 			case 'csviscii':
       
  1628 			case 'viscii':
       
  1629 				return 'VISCII';
       
  1630 
       
  1631 			case 'csshiftjis':
       
  1632 			case 'cswindows31j':
       
  1633 			case 'mskanji':
       
  1634 			case 'shiftjis':
       
  1635 			case 'windows31j':
       
  1636 				return 'Windows-31J';
       
  1637 
       
  1638 			case 'iso885911':
       
  1639 			case 'tis620':
       
  1640 				return 'windows-874';
       
  1641 
       
  1642 			case 'cseuckr':
       
  1643 			case 'csksc56011987':
       
  1644 			case 'euckr':
       
  1645 			case 'isoir149':
       
  1646 			case 'korean':
       
  1647 			case 'ksc5601':
       
  1648 			case 'ksc56011987':
       
  1649 			case 'ksc56011989':
       
  1650 			case 'windows949':
       
  1651 				return 'windows-949';
       
  1652 
       
  1653 			case 'windows1250':
       
  1654 				return 'windows-1250';
       
  1655 
       
  1656 			case 'windows1251':
       
  1657 				return 'windows-1251';
       
  1658 
       
  1659 			case 'cp819':
       
  1660 			case 'csisolatin1':
       
  1661 			case 'ibm819':
       
  1662 			case 'iso88591':
       
  1663 			case 'iso885911987':
       
  1664 			case 'isoir100':
       
  1665 			case 'l1':
       
  1666 			case 'latin1':
       
  1667 			case 'windows1252':
       
  1668 				return 'windows-1252';
       
  1669 
       
  1670 			case 'windows1253':
       
  1671 				return 'windows-1253';
       
  1672 
       
  1673 			case 'csisolatin5':
       
  1674 			case 'iso88599':
       
  1675 			case 'iso885991989':
       
  1676 			case 'isoir148':
       
  1677 			case 'l5':
       
  1678 			case 'latin5':
       
  1679 			case 'windows1254':
       
  1680 				return 'windows-1254';
       
  1681 
       
  1682 			case 'windows1255':
       
  1683 				return 'windows-1255';
       
  1684 
       
  1685 			case 'windows1256':
       
  1686 				return 'windows-1256';
       
  1687 
       
  1688 			case 'windows1257':
       
  1689 				return 'windows-1257';
       
  1690 
       
  1691 			case 'windows1258':
       
  1692 				return 'windows-1258';
       
  1693 
       
  1694 			default:
       
  1695 				return $charset;
       
  1696 		}
       
  1697 	}
       
  1698 
       
  1699 	public static function get_curl_version()
       
  1700 	{
       
  1701 		if (is_array($curl = curl_version()))
       
  1702 		{
       
  1703 			$curl = $curl['version'];
       
  1704 		}
       
  1705 		elseif (substr($curl, 0, 5) === 'curl/')
       
  1706 		{
       
  1707 			$curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
       
  1708 		}
       
  1709 		elseif (substr($curl, 0, 8) === 'libcurl/')
       
  1710 		{
       
  1711 			$curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
       
  1712 		}
       
  1713 		else
       
  1714 		{
       
  1715 			$curl = 0;
       
  1716 		}
       
  1717 		return $curl;
       
  1718 	}
       
  1719 
       
  1720 	/**
       
  1721 	 * Strip HTML comments
       
  1722 	 *
       
  1723 	 * @param string $data Data to strip comments from
       
  1724 	 * @return string Comment stripped string
       
  1725 	 */
       
  1726 	public static function strip_comments($data)
       
  1727 	{
       
  1728 		$output = '';
       
  1729 		while (($start = strpos($data, '<!--')) !== false)
       
  1730 		{
       
  1731 			$output .= substr($data, 0, $start);
       
  1732 			if (($end = strpos($data, '-->', $start)) !== false)
       
  1733 			{
       
  1734 				$data = substr_replace($data, '', 0, $end + 3);
       
  1735 			}
       
  1736 			else
       
  1737 			{
       
  1738 				$data = '';
       
  1739 			}
       
  1740 		}
       
  1741 		return $output . $data;
       
  1742 	}
       
  1743 
       
  1744 	public static function parse_date($dt)
       
  1745 	{
       
  1746 		$parser = SimplePie_Parse_Date::get();
       
  1747 		return $parser->parse($dt);
       
  1748 	}
       
  1749 
       
  1750 	/**
       
  1751 	 * Decode HTML entities
       
  1752 	 *
       
  1753 	 * @deprecated Use DOMDocument instead
       
  1754 	 * @param string $data Input data
       
  1755 	 * @return string Output data
       
  1756 	 */
       
  1757 	public static function entities_decode($data)
       
  1758 	{
       
  1759 		$decoder = new SimplePie_Decode_HTML_Entities($data);
       
  1760 		return $decoder->parse();
       
  1761 	}
       
  1762 
       
  1763 	/**
       
  1764 	 * Remove RFC822 comments
       
  1765 	 *
       
  1766 	 * @param string $data Data to strip comments from
       
  1767 	 * @return string Comment stripped string
       
  1768 	 */
       
  1769 	public static function uncomment_rfc822($string)
       
  1770 	{
       
  1771 		$string = (string) $string;
       
  1772 		$position = 0;
       
  1773 		$length = strlen($string);
       
  1774 		$depth = 0;
       
  1775 
       
  1776 		$output = '';
       
  1777 
       
  1778 		while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
       
  1779 		{
       
  1780 			$output .= substr($string, $position, $pos - $position);
       
  1781 			$position = $pos + 1;
       
  1782 			if ($string[$pos - 1] !== '\\')
       
  1783 			{
       
  1784 				$depth++;
       
  1785 				while ($depth && $position < $length)
       
  1786 				{
       
  1787 					$position += strcspn($string, '()', $position);
       
  1788 					if ($string[$position - 1] === '\\')
       
  1789 					{
       
  1790 						$position++;
       
  1791 						continue;
       
  1792 					}
       
  1793 					elseif (isset($string[$position]))
       
  1794 					{
       
  1795 						switch ($string[$position])
       
  1796 						{
       
  1797 							case '(':
       
  1798 								$depth++;
       
  1799 								break;
       
  1800 
       
  1801 							case ')':
       
  1802 								$depth--;
       
  1803 								break;
       
  1804 						}
       
  1805 						$position++;
       
  1806 					}
       
  1807 					else
       
  1808 					{
       
  1809 						break;
       
  1810 					}
       
  1811 				}
       
  1812 			}
       
  1813 			else
       
  1814 			{
       
  1815 				$output .= '(';
       
  1816 			}
       
  1817 		}
       
  1818 		$output .= substr($string, $position);
       
  1819 
       
  1820 		return $output;
       
  1821 	}
       
  1822 
       
  1823 	public static function parse_mime($mime)
       
  1824 	{
       
  1825 		if (($pos = strpos($mime, ';')) === false)
       
  1826 		{
       
  1827 			return trim($mime);
       
  1828 		}
       
  1829 		else
       
  1830 		{
       
  1831 			return trim(substr($mime, 0, $pos));
       
  1832 		}
       
  1833 	}
       
  1834 
       
  1835 	public static function atom_03_construct_type($attribs)
       
  1836 	{
       
  1837 		if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
       
  1838 		{
       
  1839 			$mode = SIMPLEPIE_CONSTRUCT_BASE64;
       
  1840 		}
       
  1841 		else
       
  1842 		{
       
  1843 			$mode = SIMPLEPIE_CONSTRUCT_NONE;
       
  1844 		}
       
  1845 		if (isset($attribs['']['type']))
       
  1846 		{
       
  1847 			switch (strtolower(trim($attribs['']['type'])))
       
  1848 			{
       
  1849 				case 'text':
       
  1850 				case 'text/plain':
       
  1851 					return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
       
  1852 
       
  1853 				case 'html':
       
  1854 				case 'text/html':
       
  1855 					return SIMPLEPIE_CONSTRUCT_HTML | $mode;
       
  1856 
       
  1857 				case 'xhtml':
       
  1858 				case 'application/xhtml+xml':
       
  1859 					return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
       
  1860 
       
  1861 				default:
       
  1862 					return SIMPLEPIE_CONSTRUCT_NONE | $mode;
       
  1863 			}
       
  1864 		}
       
  1865 		else
       
  1866 		{
       
  1867 			return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
       
  1868 		}
       
  1869 	}
       
  1870 
       
  1871 	public static function atom_10_construct_type($attribs)
       
  1872 	{
       
  1873 		if (isset($attribs['']['type']))
       
  1874 		{
       
  1875 			switch (strtolower(trim($attribs['']['type'])))
       
  1876 			{
       
  1877 				case 'text':
       
  1878 					return SIMPLEPIE_CONSTRUCT_TEXT;
       
  1879 
       
  1880 				case 'html':
       
  1881 					return SIMPLEPIE_CONSTRUCT_HTML;
       
  1882 
       
  1883 				case 'xhtml':
       
  1884 					return SIMPLEPIE_CONSTRUCT_XHTML;
       
  1885 
       
  1886 				default:
       
  1887 					return SIMPLEPIE_CONSTRUCT_NONE;
       
  1888 			}
       
  1889 		}
       
  1890 		return SIMPLEPIE_CONSTRUCT_TEXT;
       
  1891 	}
       
  1892 
       
  1893 	public static function atom_10_content_construct_type($attribs)
       
  1894 	{
       
  1895 		if (isset($attribs['']['type']))
       
  1896 		{
       
  1897 			$type = strtolower(trim($attribs['']['type']));
       
  1898 			switch ($type)
       
  1899 			{
       
  1900 				case 'text':
       
  1901 					return SIMPLEPIE_CONSTRUCT_TEXT;
       
  1902 
       
  1903 				case 'html':
       
  1904 					return SIMPLEPIE_CONSTRUCT_HTML;
       
  1905 
       
  1906 				case 'xhtml':
       
  1907 					return SIMPLEPIE_CONSTRUCT_XHTML;
       
  1908 			}
       
  1909 			if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
       
  1910 			{
       
  1911 				return SIMPLEPIE_CONSTRUCT_NONE;
       
  1912 			}
       
  1913 			else
       
  1914 			{
       
  1915 				return SIMPLEPIE_CONSTRUCT_BASE64;
       
  1916 			}
       
  1917 		}
       
  1918 		else
       
  1919 		{
       
  1920 			return SIMPLEPIE_CONSTRUCT_TEXT;
       
  1921 		}
       
  1922 	}
       
  1923 
       
  1924 	public static function is_isegment_nz_nc($string)
       
  1925 	{
       
  1926 		return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
       
  1927 	}
       
  1928 
       
  1929 	public static function space_seperated_tokens($string)
       
  1930 	{
       
  1931 		$space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
       
  1932 		$string_length = strlen($string);
       
  1933 
       
  1934 		$position = strspn($string, $space_characters);
       
  1935 		$tokens = array();
       
  1936 
       
  1937 		while ($position < $string_length)
       
  1938 		{
       
  1939 			$len = strcspn($string, $space_characters, $position);
       
  1940 			$tokens[] = substr($string, $position, $len);
       
  1941 			$position += $len;
       
  1942 			$position += strspn($string, $space_characters, $position);
       
  1943 		}
       
  1944 
       
  1945 		return $tokens;
       
  1946 	}
       
  1947 
       
  1948 	/**
       
  1949 	 * Converts a unicode codepoint to a UTF-8 character
       
  1950 	 *
       
  1951 	 * @static
       
  1952 	 * @param int $codepoint Unicode codepoint
       
  1953 	 * @return string UTF-8 character
       
  1954 	 */
       
  1955 	public static function codepoint_to_utf8($codepoint)
       
  1956 	{
       
  1957 		$codepoint = (int) $codepoint;
       
  1958 		if ($codepoint < 0)
       
  1959 		{
       
  1960 			return false;
       
  1961 		}
       
  1962 		else if ($codepoint <= 0x7f)
       
  1963 		{
       
  1964 			return chr($codepoint);
       
  1965 		}
       
  1966 		else if ($codepoint <= 0x7ff)
       
  1967 		{
       
  1968 			return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
       
  1969 		}
       
  1970 		else if ($codepoint <= 0xffff)
       
  1971 		{
       
  1972 			return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
       
  1973 		}
       
  1974 		else if ($codepoint <= 0x10ffff)
       
  1975 		{
       
  1976 			return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
       
  1977 		}
       
  1978 		else
       
  1979 		{
       
  1980 			// U+FFFD REPLACEMENT CHARACTER
       
  1981 			return "\xEF\xBF\xBD";
       
  1982 		}
       
  1983 	}
       
  1984 
       
  1985 	/**
       
  1986 	 * Similar to parse_str()
       
  1987 	 *
       
  1988 	 * Returns an associative array of name/value pairs, where the value is an
       
  1989 	 * array of values that have used the same name
       
  1990 	 *
       
  1991 	 * @static
       
  1992 	 * @param string $str The input string.
       
  1993 	 * @return array
       
  1994 	 */
       
  1995 	public static function parse_str($str)
       
  1996 	{
       
  1997 		$return = array();
       
  1998 		$str = explode('&', $str);
       
  1999 
       
  2000 		foreach ($str as $section)
       
  2001 		{
       
  2002 			if (strpos($section, '=') !== false)
       
  2003 			{
       
  2004 				list($name, $value) = explode('=', $section, 2);
       
  2005 				$return[urldecode($name)][] = urldecode($value);
       
  2006 			}
       
  2007 			else
       
  2008 			{
       
  2009 				$return[urldecode($section)][] = null;
       
  2010 			}
       
  2011 		}
       
  2012 
       
  2013 		return $return;
       
  2014 	}
       
  2015 
       
  2016 	/**
       
  2017 	 * Detect XML encoding, as per XML 1.0 Appendix F.1
       
  2018 	 *
       
  2019 	 * @todo Add support for EBCDIC
       
  2020 	 * @param string $data XML data
       
  2021 	 * @param SimplePie_Registry $registry Class registry
       
  2022 	 * @return array Possible encodings
       
  2023 	 */
       
  2024 	public static function xml_encoding($data, $registry)
       
  2025 	{
       
  2026 		// UTF-32 Big Endian BOM
       
  2027 		if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
       
  2028 		{
       
  2029 			$encoding[] = 'UTF-32BE';
       
  2030 		}
       
  2031 		// UTF-32 Little Endian BOM
       
  2032 		elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
       
  2033 		{
       
  2034 			$encoding[] = 'UTF-32LE';
       
  2035 		}
       
  2036 		// UTF-16 Big Endian BOM
       
  2037 		elseif (substr($data, 0, 2) === "\xFE\xFF")
       
  2038 		{
       
  2039 			$encoding[] = 'UTF-16BE';
       
  2040 		}
       
  2041 		// UTF-16 Little Endian BOM
       
  2042 		elseif (substr($data, 0, 2) === "\xFF\xFE")
       
  2043 		{
       
  2044 			$encoding[] = 'UTF-16LE';
       
  2045 		}
       
  2046 		// UTF-8 BOM
       
  2047 		elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
       
  2048 		{
       
  2049 			$encoding[] = 'UTF-8';
       
  2050 		}
       
  2051 		// UTF-32 Big Endian Without BOM
       
  2052 		elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
       
  2053 		{
       
  2054 			if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
       
  2055 			{
       
  2056 				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
       
  2057 				if ($parser->parse())
       
  2058 				{
       
  2059 					$encoding[] = $parser->encoding;
       
  2060 				}
       
  2061 			}
       
  2062 			$encoding[] = 'UTF-32BE';
       
  2063 		}
       
  2064 		// UTF-32 Little Endian Without BOM
       
  2065 		elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
       
  2066 		{
       
  2067 			if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
       
  2068 			{
       
  2069 				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
       
  2070 				if ($parser->parse())
       
  2071 				{
       
  2072 					$encoding[] = $parser->encoding;
       
  2073 				}
       
  2074 			}
       
  2075 			$encoding[] = 'UTF-32LE';
       
  2076 		}
       
  2077 		// UTF-16 Big Endian Without BOM
       
  2078 		elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
       
  2079 		{
       
  2080 			if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
       
  2081 			{
       
  2082 				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
       
  2083 				if ($parser->parse())
       
  2084 				{
       
  2085 					$encoding[] = $parser->encoding;
       
  2086 				}
       
  2087 			}
       
  2088 			$encoding[] = 'UTF-16BE';
       
  2089 		}
       
  2090 		// UTF-16 Little Endian Without BOM
       
  2091 		elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
       
  2092 		{
       
  2093 			if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
       
  2094 			{
       
  2095 				$parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
       
  2096 				if ($parser->parse())
       
  2097 				{
       
  2098 					$encoding[] = $parser->encoding;
       
  2099 				}
       
  2100 			}
       
  2101 			$encoding[] = 'UTF-16LE';
       
  2102 		}
       
  2103 		// US-ASCII (or superset)
       
  2104 		elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
       
  2105 		{
       
  2106 			if ($pos = strpos($data, "\x3F\x3E"))
       
  2107 			{
       
  2108 				$parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
       
  2109 				if ($parser->parse())
       
  2110 				{
       
  2111 					$encoding[] = $parser->encoding;
       
  2112 				}
       
  2113 			}
       
  2114 			$encoding[] = 'UTF-8';
       
  2115 		}
       
  2116 		// Fallback to UTF-8
       
  2117 		else
       
  2118 		{
       
  2119 			$encoding[] = 'UTF-8';
       
  2120 		}
       
  2121 		return $encoding;
       
  2122 	}
       
  2123 
       
  2124 	public static function output_javascript()
       
  2125 	{
       
  2126 		if (function_exists('ob_gzhandler'))
       
  2127 		{
       
  2128 			ob_start('ob_gzhandler');
       
  2129 		}
       
  2130 		header('Content-type: text/javascript; charset: UTF-8');
       
  2131 		header('Cache-Control: must-revalidate');
       
  2132 		header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
       
  2133 		?>
       
  2134 function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
       
  2135 	if (placeholder != '') {
       
  2136 		document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
       
  2137 	}
       
  2138 	else {
       
  2139 		document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
       
  2140 	}
       
  2141 }
       
  2142 
       
  2143 function embed_flash(bgcolor, width, height, link, loop, type) {
       
  2144 	document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
       
  2145 }
       
  2146 
       
  2147 function embed_flv(width, height, link, placeholder, loop, player) {
       
  2148 	document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
       
  2149 }
       
  2150 
       
  2151 function embed_wmedia(width, height, link) {
       
  2152 	document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
       
  2153 }
       
  2154 		<?php
       
  2155 	}
       
  2156 
       
  2157 	/**
       
  2158 	 * Get the SimplePie build timestamp
       
  2159 	 *
       
  2160 	 * Uses the git index if it exists, otherwise uses the modification time
       
  2161 	 * of the newest file.
       
  2162 	 */
       
  2163 	public static function get_build()
       
  2164 	{
       
  2165 		$root = dirname(dirname(__FILE__));
       
  2166 		if (file_exists($root . '/.git/index'))
       
  2167 		{
       
  2168 			return filemtime($root . '/.git/index');
       
  2169 		}
       
  2170 		elseif (file_exists($root . '/SimplePie'))
       
  2171 		{
       
  2172 			$time = 0;
       
  2173 			foreach (glob($root . '/SimplePie/*.php') as $file)
       
  2174 			{
       
  2175 				if (($mtime = filemtime($file)) > $time)
       
  2176 				{
       
  2177 					$time = $mtime;
       
  2178 				}
       
  2179 			}
       
  2180 			return $time;
       
  2181 		}
       
  2182 		elseif (file_exists(dirname(__FILE__) . '/Core.php'))
       
  2183 		{
       
  2184 			return filemtime(dirname(__FILE__) . '/Core.php');
       
  2185 		}
       
  2186 		else
       
  2187 		{
       
  2188 			return filemtime(__FILE__);
       
  2189 		}
       
  2190 	}
       
  2191 
       
  2192 	/**
       
  2193 	 * Format debugging information
       
  2194 	 */
       
  2195 	public static function debug(&$sp)
       
  2196 	{
       
  2197 		$info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
       
  2198 		$info .= 'PHP ' . PHP_VERSION . "\n";
       
  2199 		if ($sp->error() !== null)
       
  2200 		{
       
  2201 			$info .= 'Error occurred: ' . $sp->error() . "\n";
       
  2202 		}
       
  2203 		else
       
  2204 		{
       
  2205 			$info .= "No error found.\n";
       
  2206 		}
       
  2207 		$info .= "Extensions:\n";
       
  2208 		$extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
       
  2209 		foreach ($extensions as $ext)
       
  2210 		{
       
  2211 			if (extension_loaded($ext))
       
  2212 			{
       
  2213 				$info .= "    $ext loaded\n";
       
  2214 				switch ($ext)
       
  2215 				{
       
  2216 					case 'pcre':
       
  2217 						$info .= '      Version ' . PCRE_VERSION . "\n";
       
  2218 						break;
       
  2219 					case 'curl':
       
  2220 						$version = curl_version();
       
  2221 						$info .= '      Version ' . $version['version'] . "\n";
       
  2222 						break;
       
  2223 					case 'mbstring':
       
  2224 						$info .= '      Overloading: ' . mb_get_info('func_overload') . "\n";
       
  2225 						break;
       
  2226 					case 'iconv':
       
  2227 						$info .= '      Version ' . ICONV_VERSION . "\n";
       
  2228 						break;
       
  2229 					case 'xml':
       
  2230 						$info .= '      Version ' . LIBXML_DOTTED_VERSION . "\n";
       
  2231 						break;
       
  2232 				}
       
  2233 			}
       
  2234 			else
       
  2235 			{
       
  2236 				$info .= "    $ext not loaded\n";
       
  2237 			}
       
  2238 		}
       
  2239 		return $info;
       
  2240 	}
       
  2241 
       
  2242 	public static function silence_errors($num, $str)
       
  2243 	{
       
  2244 		// No-op
       
  2245 	}
       
  2246 }
       
  2247