| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							| 
									
										
										
										
											2015-04-14 21:40:09 +02:00
										 |  |  |    Copyright (c) 2003, 2005, 2006, 2009 Danilo Segan <danilo@kvota.net>. | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |    This file is part of PHP-gettext. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    PHP-gettext is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |    it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |    the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |    (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    PHP-gettext is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |    GNU General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |    along with PHP-gettext; if not, write to the Free Software | 
					
						
							|  |  |  |    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-14 21:40:09 +02:00
										 |  |  |   // Simple class to wrap file streams, string streams, etc.
 | 
					
						
							|  |  |  |   // seek is essential, and it should be byte stream
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  | class StreamReader | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // should return a string [FIXME: perhaps return array of bytes?]
 | 
					
						
							|  |  |  |     public function read($bytes) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     // should return new position
 | 
					
						
							|  |  |  |     public function seekto($position) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     // returns current position
 | 
					
						
							|  |  |  |     public function currentpos() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     // returns length of entire stream (limit for seekto()s)
 | 
					
						
							|  |  |  |     public function length() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  | class StringReader | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public $_pos; | 
					
						
							|  |  |  |     public $_str; | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function StringReader($str='') | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->_str = $str; | 
					
						
							|  |  |  |         $this->_pos = 0; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function read($bytes) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $data = substr($this->_str, $this->_pos, $bytes); | 
					
						
							|  |  |  |         $this->_pos += $bytes; | 
					
						
							|  |  |  |         if (strlen($this->_str)<$this->_pos) { | 
					
						
							|  |  |  |             $this->_pos = strlen($this->_str); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |         return $data; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function seekto($pos) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->_pos = $pos; | 
					
						
							|  |  |  |         if (strlen($this->_str)<$this->_pos) { | 
					
						
							|  |  |  |             $this->_pos = strlen($this->_str); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->_pos; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function currentpos() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->_pos; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function length() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return strlen($this->_str); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  | class FileReader | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public $_pos; | 
					
						
							|  |  |  |     public $_fd; | 
					
						
							|  |  |  |     public $_length; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function FileReader($filename) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (file_exists($filename)) { | 
					
						
							|  |  |  |             $this->_length=filesize($filename); | 
					
						
							|  |  |  |             $this->_pos = 0; | 
					
						
							|  |  |  |             $this->_fd = fopen($filename, 'rb'); | 
					
						
							|  |  |  |             if (!$this->_fd) { | 
					
						
							|  |  |  |                 $this->error = 3; // Cannot read file, probably permissions
 | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $this->error = 2; // File doesn't exist
 | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function read($bytes) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($bytes) { | 
					
						
							|  |  |  |             fseek($this->_fd, $this->_pos); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // PHP 5.1.1 does not read more than 8192 bytes in one fread()
 | 
					
						
							|  |  |  |             // the discussions at PHP Bugs suggest it's the intended behaviour
 | 
					
						
							|  |  |  |             $data = ''; | 
					
						
							|  |  |  |             while ($bytes > 0) { | 
					
						
							|  |  |  |                 $chunk  = fread($this->_fd, $bytes); | 
					
						
							|  |  |  |                 $data  .= $chunk; | 
					
						
							|  |  |  |                 $bytes -= strlen($chunk); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $this->_pos = ftell($this->_fd); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return $data; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return ''; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function seekto($pos) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         fseek($this->_fd, $pos); | 
					
						
							|  |  |  |         $this->_pos = ftell($this->_fd); | 
					
						
							|  |  |  |         return $this->_pos; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function currentpos() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->_pos; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function length() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->_length; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  |     public function close() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         fclose($this->_fd); | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-04-14 21:40:09 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-08-18 20:59:18 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:36:15 +01:00
										 |  |  | // Preloads entire file in memory first, then creates a StringReader
 | 
					
						
							|  |  |  | // over it (it assumes knowledge of StringReader internals)
 | 
					
						
							|  |  |  | class CachedFileReader extends StringReader | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public function CachedFileReader($filename) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (file_exists($filename)) { | 
					
						
							|  |  |  |             $length=filesize($filename); | 
					
						
							|  |  |  |             $fd = fopen($filename, 'rb'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$fd) { | 
					
						
							|  |  |  |                 $this->error = 3; // Cannot read file, probably permissions
 | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $this->_str = fread($fd, $length); | 
					
						
							|  |  |  |             fclose($fd); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $this->error = 2; // File doesn't exist
 | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; |