361 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			361 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Classes, which help reading streams of data from files.
 | |
|  * Based on the classes from Danilo Segan <danilo@kvota.net>
 | |
|  *
 | |
|  * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $
 | |
|  * @package pomo
 | |
|  * @subpackage streams
 | |
|  */
 | |
| 
 | |
| if ( ! class_exists( 'POMO_Reader', false ) ) :
 | |
| 	#[AllowDynamicProperties]
 | |
| 	class POMO_Reader {
 | |
| 
 | |
| 		public $endian = 'little';
 | |
| 		public $_pos;
 | |
| 		public $is_overloaded;
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP5 constructor.
 | |
| 		 */
 | |
| 		public function __construct() {
 | |
| 			if ( function_exists( 'mb_substr' )
 | |
| 				&& ( (int) ini_get( 'mbstring.func_overload' ) & 2 ) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
 | |
| 			) {
 | |
| 				$this->is_overloaded = true;
 | |
| 			} else {
 | |
| 				$this->is_overloaded = false;
 | |
| 			}
 | |
| 
 | |
| 			$this->_pos = 0;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP4 constructor.
 | |
| 		 *
 | |
| 		 * @deprecated 5.4.0 Use __construct() instead.
 | |
| 		 *
 | |
| 		 * @see POMO_Reader::__construct()
 | |
| 		 */
 | |
| 		public function POMO_Reader() {
 | |
| 			_deprecated_constructor( self::class, '5.4.0', static::class );
 | |
| 			self::__construct();
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * Sets the endianness of the file.
 | |
| 		 *
 | |
| 		 * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'.
 | |
| 		 */
 | |
| 		public function setEndian( $endian ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
 | |
| 			$this->endian = $endian;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * Reads a 32bit Integer from the Stream
 | |
| 		 *
 | |
| 		 * @return mixed The integer, corresponding to the next 32 bits from
 | |
| 		 *  the stream of false if there are not enough bytes or on error
 | |
| 		 */
 | |
| 		public function readint32() {
 | |
| 			$bytes = $this->read( 4 );
 | |
| 			if ( 4 !== $this->strlen( $bytes ) ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 			$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
 | |
| 			$int           = unpack( $endian_letter, $bytes );
 | |
| 			return reset( $int );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * Reads an array of 32-bit Integers from the Stream
 | |
| 		 *
 | |
| 		 * @param int $count How many elements should be read
 | |
| 		 * @return mixed Array of integers or false if there isn't
 | |
| 		 *  enough data or on error
 | |
| 		 */
 | |
| 		public function readint32array( $count ) {
 | |
| 			$bytes = $this->read( 4 * $count );
 | |
| 			if ( 4 * $count !== $this->strlen( $bytes ) ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 			$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
 | |
| 			return unpack( $endian_letter . $count, $bytes );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param string $input_string
 | |
| 		 * @param int    $start
 | |
| 		 * @param int    $length
 | |
| 		 * @return string
 | |
| 		 */
 | |
| 		public function substr( $input_string, $start, $length ) {
 | |
| 			if ( $this->is_overloaded ) {
 | |
| 				return mb_substr( $input_string, $start, $length, 'ascii' );
 | |
| 			} else {
 | |
| 				return substr( $input_string, $start, $length );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param string $input_string
 | |
| 		 * @return int
 | |
| 		 */
 | |
| 		public function strlen( $input_string ) {
 | |
| 			if ( $this->is_overloaded ) {
 | |
| 				return mb_strlen( $input_string, 'ascii' );
 | |
| 			} else {
 | |
| 				return strlen( $input_string );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param string $input_string
 | |
| 		 * @param int    $chunk_size
 | |
| 		 * @return array
 | |
| 		 */
 | |
| 		public function str_split( $input_string, $chunk_size ) {
 | |
| 			if ( ! function_exists( 'str_split' ) ) {
 | |
| 				$length = $this->strlen( $input_string );
 | |
| 				$out    = array();
 | |
| 				for ( $i = 0; $i < $length; $i += $chunk_size ) {
 | |
| 					$out[] = $this->substr( $input_string, $i, $chunk_size );
 | |
| 				}
 | |
| 				return $out;
 | |
| 			} else {
 | |
| 				return str_split( $input_string, $chunk_size );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return int
 | |
| 		 */
 | |
| 		public function pos() {
 | |
| 			return $this->_pos;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return true
 | |
| 		 */
 | |
| 		public function is_resource() {
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return true
 | |
| 		 */
 | |
| 		public function close() {
 | |
| 			return true;
 | |
| 		}
 | |
| 	}
 | |
| endif;
 | |
| 
 | |
| if ( ! class_exists( 'POMO_FileReader', false ) ) :
 | |
| 	class POMO_FileReader extends POMO_Reader {
 | |
| 
 | |
| 		/**
 | |
| 		 * File pointer resource.
 | |
| 		 *
 | |
| 		 * @var resource|false
 | |
| 		 */
 | |
| 		public $_f;
 | |
| 
 | |
| 		/**
 | |
| 		 * @param string $filename
 | |
| 		 */
 | |
| 		public function __construct( $filename ) {
 | |
| 			parent::__construct();
 | |
| 			$this->_f = fopen( $filename, 'rb' );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP4 constructor.
 | |
| 		 *
 | |
| 		 * @deprecated 5.4.0 Use __construct() instead.
 | |
| 		 *
 | |
| 		 * @see POMO_FileReader::__construct()
 | |
| 		 */
 | |
| 		public function POMO_FileReader( $filename ) {
 | |
| 			_deprecated_constructor( self::class, '5.4.0', static::class );
 | |
| 			self::__construct( $filename );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param int $bytes
 | |
| 		 * @return string|false Returns read string, otherwise false.
 | |
| 		 */
 | |
| 		public function read( $bytes ) {
 | |
| 			return fread( $this->_f, $bytes );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param int $pos
 | |
| 		 * @return bool
 | |
| 		 */
 | |
| 		public function seekto( $pos ) {
 | |
| 			if ( -1 === fseek( $this->_f, $pos, SEEK_SET ) ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 			$this->_pos = $pos;
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return bool
 | |
| 		 */
 | |
| 		public function is_resource() {
 | |
| 			return is_resource( $this->_f );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return bool
 | |
| 		 */
 | |
| 		public function feof() {
 | |
| 			return feof( $this->_f );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return bool
 | |
| 		 */
 | |
| 		public function close() {
 | |
| 			return fclose( $this->_f );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return string
 | |
| 		 */
 | |
| 		public function read_all() {
 | |
| 			return stream_get_contents( $this->_f );
 | |
| 		}
 | |
| 	}
 | |
| endif;
 | |
| 
 | |
| if ( ! class_exists( 'POMO_StringReader', false ) ) :
 | |
| 	/**
 | |
| 	 * Provides file-like methods for manipulating a string instead
 | |
| 	 * of a physical file.
 | |
| 	 */
 | |
| 	class POMO_StringReader extends POMO_Reader {
 | |
| 
 | |
| 		public $_str = '';
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP5 constructor.
 | |
| 		 */
 | |
| 		public function __construct( $str = '' ) {
 | |
| 			parent::__construct();
 | |
| 			$this->_str = $str;
 | |
| 			$this->_pos = 0;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP4 constructor.
 | |
| 		 *
 | |
| 		 * @deprecated 5.4.0 Use __construct() instead.
 | |
| 		 *
 | |
| 		 * @see POMO_StringReader::__construct()
 | |
| 		 */
 | |
| 		public function POMO_StringReader( $str = '' ) {
 | |
| 			_deprecated_constructor( self::class, '5.4.0', static::class );
 | |
| 			self::__construct( $str );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param string $bytes
 | |
| 		 * @return string
 | |
| 		 */
 | |
| 		public function read( $bytes ) {
 | |
| 			$data        = $this->substr( $this->_str, $this->_pos, $bytes );
 | |
| 			$this->_pos += $bytes;
 | |
| 			if ( $this->strlen( $this->_str ) < $this->_pos ) {
 | |
| 				$this->_pos = $this->strlen( $this->_str );
 | |
| 			}
 | |
| 			return $data;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @param int $pos
 | |
| 		 * @return int
 | |
| 		 */
 | |
| 		public function seekto( $pos ) {
 | |
| 			$this->_pos = $pos;
 | |
| 			if ( $this->strlen( $this->_str ) < $this->_pos ) {
 | |
| 				$this->_pos = $this->strlen( $this->_str );
 | |
| 			}
 | |
| 			return $this->_pos;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return int
 | |
| 		 */
 | |
| 		public function length() {
 | |
| 			return $this->strlen( $this->_str );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * @return string
 | |
| 		 */
 | |
| 		public function read_all() {
 | |
| 			return $this->substr( $this->_str, $this->_pos, $this->strlen( $this->_str ) );
 | |
| 		}
 | |
| 	}
 | |
| endif;
 | |
| 
 | |
| if ( ! class_exists( 'POMO_CachedFileReader', false ) ) :
 | |
| 	/**
 | |
| 	 * Reads the contents of the file in the beginning.
 | |
| 	 */
 | |
| 	class POMO_CachedFileReader extends POMO_StringReader {
 | |
| 		/**
 | |
| 		 * PHP5 constructor.
 | |
| 		 */
 | |
| 		public function __construct( $filename ) {
 | |
| 			parent::__construct();
 | |
| 			$this->_str = file_get_contents( $filename );
 | |
| 			if ( false === $this->_str ) {
 | |
| 				return false;
 | |
| 			}
 | |
| 			$this->_pos = 0;
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP4 constructor.
 | |
| 		 *
 | |
| 		 * @deprecated 5.4.0 Use __construct() instead.
 | |
| 		 *
 | |
| 		 * @see POMO_CachedFileReader::__construct()
 | |
| 		 */
 | |
| 		public function POMO_CachedFileReader( $filename ) {
 | |
| 			_deprecated_constructor( self::class, '5.4.0', static::class );
 | |
| 			self::__construct( $filename );
 | |
| 		}
 | |
| 	}
 | |
| endif;
 | |
| 
 | |
| if ( ! class_exists( 'POMO_CachedIntFileReader', false ) ) :
 | |
| 	/**
 | |
| 	 * Reads the contents of the file in the beginning.
 | |
| 	 */
 | |
| 	class POMO_CachedIntFileReader extends POMO_CachedFileReader {
 | |
| 		/**
 | |
| 		 * PHP5 constructor.
 | |
| 		 */
 | |
| 		public function __construct( $filename ) {
 | |
| 			parent::__construct( $filename );
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * PHP4 constructor.
 | |
| 		 *
 | |
| 		 * @deprecated 5.4.0 Use __construct() instead.
 | |
| 		 *
 | |
| 		 * @see POMO_CachedIntFileReader::__construct()
 | |
| 		 */
 | |
| 		public function POMO_CachedIntFileReader( $filename ) {
 | |
| 			_deprecated_constructor( self::class, '5.4.0', static::class );
 | |
| 			self::__construct( $filename );
 | |
| 		}
 | |
| 	}
 | |
| endif;
 |