1 | <?php
|
---|
2 | /**
|
---|
3 | * PHP-Gettext External Library: StreamReader classes
|
---|
4 | *
|
---|
5 | * @package External
|
---|
6 | * @subpackage PHP-gettext
|
---|
7 | *
|
---|
8 | * @internal
|
---|
9 | Copyright (c) 2003, 2005 Danilo Segan <danilo@kvota.net>.
|
---|
10 |
|
---|
11 | This file is part of PHP-gettext.
|
---|
12 |
|
---|
13 | PHP-gettext is free software; you can redistribute it and/or modify
|
---|
14 | it under the terms of the GNU General Public License as published by
|
---|
15 | the Free Software Foundation; either version 2 of the License, or
|
---|
16 | (at your option) any later version.
|
---|
17 |
|
---|
18 | PHP-gettext is distributed in the hope that it will be useful,
|
---|
19 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
21 | GNU General Public License for more details.
|
---|
22 |
|
---|
23 | You should have received a copy of the GNU General Public License
|
---|
24 | along with PHP-gettext; if not, write to the Free Software
|
---|
25 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
26 |
|
---|
27 | */
|
---|
28 |
|
---|
29 |
|
---|
30 | // Simple class to wrap file streams, string streams, etc.
|
---|
31 | // seek is essential, and it should be byte stream
|
---|
32 | class StreamReader {
|
---|
33 | // should return a string [FIXME: perhaps return array of bytes?]
|
---|
34 | function read($bytes) {
|
---|
35 | return false;
|
---|
36 | }
|
---|
37 |
|
---|
38 | // should return new position
|
---|
39 | function seekto($position) {
|
---|
40 | return false;
|
---|
41 | }
|
---|
42 |
|
---|
43 | // returns current position
|
---|
44 | function currentpos() {
|
---|
45 | return false;
|
---|
46 | }
|
---|
47 |
|
---|
48 | // returns length of entire stream (limit for seekto()s)
|
---|
49 | function length() {
|
---|
50 | return false;
|
---|
51 | }
|
---|
52 | }
|
---|
53 |
|
---|
54 | class StringReader {
|
---|
55 | var $_pos;
|
---|
56 | var $_str;
|
---|
57 |
|
---|
58 | function StringReader($str='') {
|
---|
59 | $this->_str = $str;
|
---|
60 | $this->_pos = 0;
|
---|
61 | // If string functions are overloaded, we need to use the mb versions
|
---|
62 | $this->is_overloaded = ((ini_get("mbstring.func_overload") & 2) != 0) && function_exists('mb_substr');
|
---|
63 | }
|
---|
64 |
|
---|
65 | function _substr($string, $start, $length) {
|
---|
66 | if ($this->is_overloaded) {
|
---|
67 | return mb_substr($string,$start,$length,'ascii');
|
---|
68 | } else {
|
---|
69 | return substr($string,$start,$length);
|
---|
70 | }
|
---|
71 | }
|
---|
72 |
|
---|
73 | function _strlen($string) {
|
---|
74 | if ($this->is_overloaded) {
|
---|
75 | return mb_strlen($string,'ascii');
|
---|
76 | } else {
|
---|
77 | return strlen($string);
|
---|
78 | }
|
---|
79 | }
|
---|
80 |
|
---|
81 | function read($bytes) {
|
---|
82 | $data = $this->_substr($this->_str, $this->_pos, $bytes);
|
---|
83 | $this->_pos += $bytes;
|
---|
84 | if ($this->_strlen($this->_str)<$this->_pos)
|
---|
85 | $this->_pos = $this->_strlen($this->_str);
|
---|
86 |
|
---|
87 | return $data;
|
---|
88 | }
|
---|
89 |
|
---|
90 | function seekto($pos) {
|
---|
91 | $this->_pos = $pos;
|
---|
92 | if ($this->_strlen($this->_str)<$this->_pos)
|
---|
93 | $this->_pos = $this->_strlen($this->_str);
|
---|
94 | return $this->_pos;
|
---|
95 | }
|
---|
96 |
|
---|
97 | function currentpos() {
|
---|
98 | return $this->_pos;
|
---|
99 | }
|
---|
100 |
|
---|
101 | function length() {
|
---|
102 | return $this->_strlen($this->_str);
|
---|
103 | }
|
---|
104 | }
|
---|
105 |
|
---|
106 |
|
---|
107 | class FileReader {
|
---|
108 | var $_pos;
|
---|
109 | var $_fd;
|
---|
110 | var $_length;
|
---|
111 |
|
---|
112 | function FileReader($filename) {
|
---|
113 | if (file_exists($filename)) {
|
---|
114 |
|
---|
115 | $this->_length=filesize($filename);
|
---|
116 | $this->_pos = 0;
|
---|
117 | $this->_fd = fopen($filename,'rb');
|
---|
118 | if (!$this->_fd) {
|
---|
119 | $this->error = 3; // Cannot read file, probably permissions
|
---|
120 | return false;
|
---|
121 | }
|
---|
122 | } else {
|
---|
123 | $this->error = 2; // File doesn't exist
|
---|
124 | return false;
|
---|
125 | }
|
---|
126 | }
|
---|
127 |
|
---|
128 | function read($bytes) {
|
---|
129 | if ($bytes) {
|
---|
130 | fseek($this->_fd, $this->_pos);
|
---|
131 |
|
---|
132 | // PHP 5.1.1 does not read more than 8192 bytes in one fread()
|
---|
133 | // the discussions at PHP Bugs suggest it's the intended behaviour
|
---|
134 | while ($bytes > 0) {
|
---|
135 | $chunk = fread($this->_fd, $bytes);
|
---|
136 | $data .= $chunk;
|
---|
137 | $bytes -= strlen($chunk);
|
---|
138 | }
|
---|
139 | $this->_pos = ftell($this->_fd);
|
---|
140 |
|
---|
141 | return $data;
|
---|
142 | } else return '';
|
---|
143 | }
|
---|
144 |
|
---|
145 | function seekto($pos) {
|
---|
146 | fseek($this->_fd, $pos);
|
---|
147 | $this->_pos = ftell($this->_fd);
|
---|
148 | return $this->_pos;
|
---|
149 | }
|
---|
150 |
|
---|
151 | function currentpos() {
|
---|
152 | return $this->_pos;
|
---|
153 | }
|
---|
154 |
|
---|
155 | function length() {
|
---|
156 | return $this->_length;
|
---|
157 | }
|
---|
158 |
|
---|
159 | function close() {
|
---|
160 | fclose($this->_fd);
|
---|
161 | }
|
---|
162 |
|
---|
163 | }
|
---|
164 |
|
---|
165 | // Preloads entire file in memory first, then creates a StringReader
|
---|
166 | // over it (it assumes knowledge of StringReader internals)
|
---|
167 | class CachedFileReader extends StringReader {
|
---|
168 | function CachedFileReader($filename) {
|
---|
169 | parent::StringReader();
|
---|
170 |
|
---|
171 | if (file_exists($filename)) {
|
---|
172 |
|
---|
173 | $length=filesize($filename);
|
---|
174 | $fd = fopen($filename,'rb');
|
---|
175 |
|
---|
176 | if (!$fd) {
|
---|
177 | $this->error = 3; // Cannot read file, probably permissions
|
---|
178 | return false;
|
---|
179 | }
|
---|
180 | $this->_str = fread($fd, $length);
|
---|
181 | fclose($fd);
|
---|
182 |
|
---|
183 | } else {
|
---|
184 | $this->error = 2; // File doesn't exist
|
---|
185 | return false;
|
---|
186 | }
|
---|
187 | }
|
---|
188 | }
|
---|
189 |
|
---|
190 |
|
---|
191 | ?>
|
---|