* */ /** * ------------------------------ 5.2 --- * @group 5_2 * @since 5.2 * * Additions of PHP 5.2.0 * - some listed here might have appeared earlier or in release candidates * * @emulated * json_encode * json_decode * error_get_last * preg_last_error * lchown * lchgrp * E_RECOVERABLE_ERROR * M_SQRTPI * M_LNPI * M_EULER * M_SQRT3 * * @missing * sys_getloadavg * inet_ntop * inet_pton * array_fill_keys * array_intersect_key * array_intersect_ukey * array_diff_key * array_diff_ukey * array_product * pdo_drivers * ftp_ssl_connect * XmlReader * XmlWriter * PDO* * * @unimplementable * stream_* * */ /** * @since unknown */ if (!defined("E_RECOVERABLE_ERROR")) { define("E_RECOVERABLE_ERROR", 4096); } /** * Converts PHP variable or array into a "JSON" (JavaScript value expression * or "object notation") string. * * @compat * Output seems identical to PECL versions. "Only" 20x slower than PECL version. * @bugs * Doesn't take care with unicode too much - leaves UTF-8 sequences alone. * * @param $var mixed PHP variable/array/object * @return string transformed into JSON equivalent */ if (!function_exists("json_encode")) { function json_encode($var, /*emu_args*/$obj=FALSE) { #-- prepare JSON string $json = ""; #-- add array entries if (is_array($var) || ($obj=is_object($var))) { #-- check if array is associative if (!$obj) foreach ((array)$var as $i=>$v) { if (!is_int($i)) { $obj = 1; break; } } #-- concat invidual entries foreach ((array)$var as $i=>$v) { $json .= ($json ? "," : "") // comma separators . ($obj ? ("\"$i\":") : "") // assoc prefix . (json_encode($v)); // value } #-- enclose into braces or brackets $json = $obj ? "{".$json."}" : "[".$json."]"; } #-- strings need some care elseif (is_string($var)) { if (!utf8_decode($var)) { $var = utf8_encode($var); } $var = str_replace(array("\"", "\\", "/", "\b", "\f", "\n", "\r", "\t"), array("\\\"", "\\\\", "\\/", "\\b", "\\f", "\\n", "\\r", "\\t"), $var); $json = '"' . $var . '"'; //@COMPAT: for fully-fully-compliance $var = preg_replace("/[\000-\037]/", "", $var); } #-- basic types elseif (is_bool($var)) { $json = $var ? "true" : "false"; } elseif ($var === NULL) { $json = "null"; } elseif (is_int($var) || is_float($var)) { $json = "$var"; } #-- something went wrong else { trigger_error("json_encode: don't know what a '" .gettype($var). "' is.", E_USER_ERROR); } #-- done return($json); } } /** * Parses a JSON (JavaScript value expression) string into a PHP variable * (array or object). * * @compat * Behaves similar to PECL version, but is less quiet on errors. * Now even decodes unicode \uXXXX string escapes into UTF-8. * "Only" 27 times slower than native function. * @bugs * Might parse some misformed representations, when other implementations * would scream error or explode. * @code * This is state machine spaghetti code. Needs the extranous parameters to * process subarrays, etc. When it recursively calls itself, $n is the * current position, and $waitfor a string with possible end-tokens. * * @param $json string JSON encoded values * @param $assoc bool (optional) if outer shell should be decoded as object always * @return mixed parsed into PHP variable/array/object */ if (!function_exists("json_decode")) { function json_decode($json, $assoc=FALSE, /*emu_args*/$n=0,$state=0,$waitfor=0) { #-- result var $val = NULL; static $lang_eq = array("true" => TRUE, "false" => FALSE, "null" => NULL); static $str_eq = array("n"=>"\012", "r"=>"\015", "\\"=>"\\", '"'=>'"', "f"=>"\f", "b"=>"\b", "t"=>"\t", "/"=>"/"); #-- flat char-wise parsing for (/*n*/; $n>6) . chr(0x80 + $hex&63); } elseif ($hex <= 0xFFFF) { // 1110xxxx 10xxxxxx 10xxxxxx $val .= chr(0xE0 + $hex>>12) . chr(0x80 + ($hex>>6)&63) . chr(0x80 + $hex&63); } // other ranges, like 0x1FFFFF=0xF0, 0x3FFFFFF=0xF8 and 0x7FFFFFFF=0xFC do not apply } // no escape, just a redundant backslash //@COMPAT: we could throw an exception here else { $val .= "\\" . $c; } } // end of string elseif ($c == '"') { $state = 0; } // yeeha! a single character found!!!!1! else/*if (ord($c) >= 32)*/ { //@COMPAT: specialchars check - but native json doesn't do it? $val .= $c; } } #-> end of sub-call (array/object) elseif ($waitfor && (strpos($waitfor, $c) !== false)) { return array($val, $n); // return current value and state } #-= in-array elseif ($state===']') { list($v, $n) = json_decode($json, 0, $n, 0, ",]"); $val[] = $v; if ($json[$n] == "]") { return array($val, $n); } } #-= in-object elseif ($state==='}') { list($i, $n) = json_decode($json, 0, $n, 0, ":"); // this allowed non-string indicies list($v, $n) = json_decode($json, 0, $n+1, 0, ",}"); $val[$i] = $v; if ($json[$n] == "}") { return array($val, $n); } } #-- looking for next item (0) else { #-> whitespace if (preg_match("/\s/", $c)) { // skip } #-> string begin elseif ($c == '"') { $state = '"'; } #-> object elseif ($c == "{") { list($val, $n) = json_decode($json, $assoc, $n+1, '}', "}"); if ($val && $n && !$assoc) { $obj = new stdClass(); foreach ($val as $i=>$v) { $obj->{$i} = $v; } $val = $obj; unset($obj); } } #-> array elseif ($c == "[") { list($val, $n) = json_decode($json, $assoc, $n+1, ']', "]"); } #-> comment elseif (($c == "/") && ($json[$n+1]=="*")) { // just find end, skip over ($n = strpos($json, "*/", $n+1)) or ($n = strlen($json)); } #-> numbers elseif (preg_match("#^(-?\d+(?:\.\d+)?)(?:[eE]([-+]?\d+))?#", substr($json, $n), $uu)) { $val = $uu[1]; $n += strlen($uu[0]) - 1; if (strpos($val, ".")) { // float $val = (float)$val; } elseif ($val[0] == "0") { // oct $val = octdec($val); } else { $val = (int)$val; } // exponent? if (isset($uu[2])) { $val *= pow(10, (int)$uu[2]); } } #-> boolean or null elseif (preg_match("#^(true|false|null)\b#", substr($json, $n), $uu)) { $val = $lang_eq[$uu[1]]; $n += strlen($uu[1]) - 1; } #-- parsing error else { // PHPs native json_decode() breaks here usually and QUIETLY trigger_error("json_decode: error parsing '$c' at position $n", E_USER_WARNING); return $waitfor ? array(NULL, 1<<30) : NULL; } }//state #-- next char if ($n === NULL) { return NULL; } $n++; }//for #-- final result return ($val); } } /** * Constants for future 64-bit integer support. * */ if (!defined("PHP_INT_SIZE")) { define("PHP_INT_SIZE", 4); } if (!defined("PHP_INT_MAX")) { define("PHP_INT_MAX", 2147483647); } /** * @flag bugfix * @see #33895 * * Missing constants in 5.1, originally appeared in 4.0. */ if (!defined("M_SQRTPI")) { define("M_SQRTPI", 1.7724538509055); } if (!defined("M_LNPI")) { define("M_LNPI", 1.1447298858494); } if (!defined("M_EULER")) { define("M_EULER", 0.57721566490153); } if (!defined("M_SQRT3")) { define("M_SQRT3", 1.7320508075689); } /** * removes entities < > & and eventually " from HTML string * */ if (!function_exists("htmlspecialchars_decode")) { if (!defined("ENT_COMPAT")) { define("ENT_COMPAT", 2); } if (!defined("ENT_QUOTES")) { define("ENT_QUOTES", 3); } if (!defined("ENT_NOQUOTES")) { define("ENT_NOQUOTES", 0); } function htmlspecialchars_decode($string, $quotes=2) { $d = $quotes & ENT_COMPAT; $s = $quotes & ENT_QUOTES; return str_replace( array("<", ">", ($s ? """ : "&.-;"), ($d ? "'" : "&.-;"), "&"), array("<", ">", "'", "\"", "&"), $string ); } } ?>