X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=vendor%2Fnikic%2Fphp-parser%2Flib%2FPhpParser%2FUnserializer%2FXML.php;fp=vendor%2Fnikic%2Fphp-parser%2Flib%2FPhpParser%2FUnserializer%2FXML.php;h=b33dd097e138d756b0b102ab77650b8d8b510301;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/vendor/nikic/php-parser/lib/PhpParser/Unserializer/XML.php b/vendor/nikic/php-parser/lib/PhpParser/Unserializer/XML.php new file mode 100644 index 000000000..b33dd097e --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Unserializer/XML.php @@ -0,0 +1,155 @@ +reader = new XMLReader; + } + + public function unserialize($string) { + $this->reader->XML($string); + + $this->reader->read(); + if ('AST' !== $this->reader->name) { + throw new DomainException('AST root element not found'); + } + + return $this->read($this->reader->depth); + } + + protected function read($depthLimit, $throw = true, &$nodeFound = null) { + $nodeFound = true; + while ($this->reader->read() && $depthLimit < $this->reader->depth) { + if (XMLReader::ELEMENT !== $this->reader->nodeType) { + continue; + } + + if ('node' === $this->reader->prefix) { + return $this->readNode(); + } elseif ('scalar' === $this->reader->prefix) { + return $this->readScalar(); + } elseif ('comment' === $this->reader->name) { + return $this->readComment(); + } else { + throw new DomainException(sprintf('Unexpected node of type "%s"', $this->reader->name)); + } + } + + $nodeFound = false; + if ($throw) { + throw new DomainException('Expected node or scalar'); + } + } + + protected function readNode() { + $className = $this->getClassNameFromType($this->reader->localName); + + // create the node without calling it's constructor + $node = unserialize( + sprintf( + "O:%d:\"%s\":1:{s:13:\"\0*\0attributes\";a:0:{}}", + strlen($className), $className + ) + ); + + $depthLimit = $this->reader->depth; + while ($this->reader->read() && $depthLimit < $this->reader->depth) { + if (XMLReader::ELEMENT !== $this->reader->nodeType) { + continue; + } + + $type = $this->reader->prefix; + if ('subNode' !== $type && 'attribute' !== $type) { + throw new DomainException( + sprintf('Expected sub node or attribute, got node of type "%s"', $this->reader->name) + ); + } + + $name = $this->reader->localName; + $value = $this->read($this->reader->depth); + + if ('subNode' === $type) { + $node->$name = $value; + } else { + $node->setAttribute($name, $value); + } + } + + return $node; + } + + protected function readScalar() { + switch ($name = $this->reader->localName) { + case 'array': + $depth = $this->reader->depth; + $array = array(); + while (true) { + $node = $this->read($depth, false, $nodeFound); + if (!$nodeFound) { + break; + } + $array[] = $node; + } + return $array; + case 'string': + return $this->reader->readString(); + case 'int': + return $this->parseInt($this->reader->readString()); + case 'float': + $text = $this->reader->readString(); + if (false === $float = filter_var($text, FILTER_VALIDATE_FLOAT)) { + throw new DomainException(sprintf('"%s" is not a valid float', $text)); + } + return $float; + case 'true': + case 'false': + case 'null': + if (!$this->reader->isEmptyElement) { + throw new DomainException(sprintf('"%s" scalar must be empty', $name)); + } + return constant($name); + default: + throw new DomainException(sprintf('Unknown scalar type "%s"', $name)); + } + } + + private function parseInt($text) { + if (false === $int = filter_var($text, FILTER_VALIDATE_INT)) { + throw new DomainException(sprintf('"%s" is not a valid integer', $text)); + } + return $int; + } + + protected function readComment() { + $className = $this->reader->getAttribute('isDocComment') === 'true' + ? 'PhpParser\Comment\Doc' + : 'PhpParser\Comment' + ; + return new $className( + $this->reader->readString(), + $this->parseInt($this->reader->getAttribute('line')) + ); + } + + protected function getClassNameFromType($type) { + $className = 'PhpParser\\Node\\' . strtr($type, '_', '\\'); + if (!class_exists($className)) { + $className .= '_'; + } + if (!class_exists($className)) { + throw new DomainException(sprintf('Unknown node type "%s"', $type)); + } + return $className; + } +}