<?php

namespace Safe;

use Safe\Exceptions\XmlException;

/**
 * xml_parser_create_ns creates a new XML parser
 * with XML namespace support and returns a resource handle referencing
 * it to be used by the other XML functions.
 *
 * @param string $encoding The input encoding is automatically detected, so that the
 * encoding parameter specifies only the output
 * encoding. In PHP 5.0.0 and 5.0.1, the default output charset is
 * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported
 * encodings are ISO-8859-1, UTF-8 and
 * US-ASCII.
 * @param string $separator With a namespace aware parser tag parameters passed to the various
 * handler functions will consist of namespace and tag name separated by
 * the string specified in separator.
 * @return resource Returns a resource handle for the new XML parser.
 * @throws XmlException
 *
 */
function xml_parser_create_ns(?string $encoding = null, string $separator = ":")
{
    error_clear_last();
    if ($separator !== ":") {
        $result = \xml_parser_create_ns($encoding, $separator);
    } elseif ($encoding !== null) {
        $result = \xml_parser_create_ns($encoding);
    } else {
        $result = \xml_parser_create_ns();
    }
    if ($result === false) {
        throw XmlException::createFromPhpError();
    }
    return $result;
}


/**
 * xml_parser_create creates a new XML parser
 * and returns a resource handle referencing it to be used by the
 * other XML functions.
 *
 * @param string $encoding The optional encoding specifies the character
 * encoding for the input/output in PHP 4. Starting from PHP 5, the input
 * encoding is automatically detected, so that the
 * encoding parameter specifies only the output
 * encoding. In PHP 4, the default output encoding is the same as the
 * input charset. If empty string is passed, the parser attempts to identify
 * which encoding the document is encoded in by looking at the heading 3 or
 * 4 bytes. In PHP 5.0.0 and 5.0.1, the default output charset is
 * ISO-8859-1, while in PHP 5.0.2 and upper is UTF-8. The supported
 * encodings are ISO-8859-1, UTF-8 and
 * US-ASCII.
 * @return resource Returns a resource handle for the new XML parser.
 * @throws XmlException
 *
 */
function xml_parser_create(?string $encoding = null)
{
    error_clear_last();
    if ($encoding !== null) {
        $result = \xml_parser_create($encoding);
    } else {
        $result = \xml_parser_create();
    }
    if ($result === false) {
        throw XmlException::createFromPhpError();
    }
    return $result;
}


/**
 * This function allows to use parser inside
 * object. All callback functions could be set with
 * xml_set_element_handler etc and assumed to be
 * methods of object.
 *
 * @param resource $parser A reference to the XML parser to use inside the object.
 * @param object $object The object where to use the XML parser.
 * @throws XmlException
 *
 */
function xml_set_object($parser, object &$object): void
{
    error_clear_last();
    $result = \xml_set_object($parser, $object);
    if ($result === false) {
        throw XmlException::createFromPhpError();
    }
}
