File: Parser.php

package info (click to toggle)
php4 4.0.3pl1-0potato3
  • links: PTS
  • area: main
  • in suites: potato
  • size: 15,168 kB
  • ctags: 20,556
  • sloc: ansic: 155,237; php: 10,827; sh: 9,608; yacc: 1,874; lex: 1,742; makefile: 788; java: 424; awk: 359; cpp: 335; perl: 181; xml: 57
file content (116 lines) | stat: -rw-r--r-- 2,923 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php

require_once "PEAR.php";

/*

Tests that need to be made:
- error class
- mixing character encodings
- a test using all expat handlers
- options (folding, output charset)

 */

class XML_Parser extends PEAR {
    var $parser;
    var $fp;
    var $folding = true;

    function XML_Parser($charset = 'UTF-8') {
	$this->PEAR();
	$xp = @xml_parser_create($charset);
	if (is_resource($xp)) {
	    $this->parser = $xp;
	    xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING,
				  $this->folding);
	    xml_set_object($xp, $this);
	    if (method_exists($this, "startHandler") ||
		method_exists($this, "endHandler")) {
		xml_set_element_handler($xp, "startHandler", "endHandler");
	    }
	    if (method_exists($this, "cdataHandler")) {
		xml_set_character_data_handler($xp, "cdataHandler");
	    }
	    if (method_exists($this, "defaultHandler")) {
		xml_set_default_handler($xp, "defaultHandler");
	    }
	    if (method_exists($this, "piHandler")) {
		xml_set_processing_instruction_handler($xp, "piHandler");
	    }
	    if (method_exists($this, "unparsedHandler")) {
		xml_set_unparsed_entity_decl_handler($xp, "unparsedHandler");
	    }
	    if (method_exists($this, "notationHandler")) {
		xml_set_notation_decl_handler($xp, "notationHandler");
	    }
	    if (method_exists($this, "entityrefHandler")) {
		xml_set_external_entity_ref_handler($xp, "entityrefHandler");
	    }
	}
    }

    function setInputFile($file) {
	$fp = @fopen($file, "r");
	if (is_resource($fp)) {
	    $this->fp = $fp;
	    return $fp;
	}
	return new XML_Parser_Error($php_errormsg);
    }

    function setInput($fp) {
	if (is_resource($fp)) {
	    $this->fp = $fp;
	    return true;
	}
	return new XML_Parser_Error("not a file resource");
    }

    function parse() {
	if (!is_resource($this->fp)) {
	    return new XML_Parser_Error("no input");
	}
	if (!is_resource($this->parser)) {
	    return new XML_Parser_Error("no parser");
	}
	while ($data = fread($this->fp, 2048)) {
	    $err = $this->parseString($data, feof($this->fp));
	    if (PEAR::isError($err)) {
		return $err;
	    }
	}
	return true;
    }

    function parseString($data, $eof = false) {
	if (!is_resource($this->parser)) {
	    return new XML_Parser_Error("no parser");
	}
	if (!xml_parse($this->parser, $data, $eof)) {
	    $err = new XML_Parser_Error($this->parser);
	    xml_parser_free($this->parser);
	    return $err;
	}
	return true;
    }

}

class XML_Parser_Error extends PEAR_Error {
    var $error_message_prefix = 'XML_Parser: ';
    function XML_Parser_Error($msgorparser = 'unknown error',
			      $code = 0,
			      $mode = PEAR_ERROR_RETURN,
			      $level = E_USER_NOTICE) {
	if (is_resource($msgorparser)) {
	    $msgorparser =
		sprintf("%s at XML input line %d",
			xml_error_string(xml_get_error_code($msgorparser)),
			xml_get_current_line_number($msgorparser));
	}
	$this->PEAR_Error($msgorparser, $code, $mode, $level);
    }
}

?>