ru-se.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

streams.php (7612B)


      1 <?php
      2 /**
      3  * Classes, which help reading streams of data from files.
      4  * Based on the classes from Danilo Segan <danilo@kvota.net>
      5  *
      6  * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $
      7  * @package pomo
      8  * @subpackage streams
      9  */
     10 
     11 if ( ! class_exists( 'POMO_Reader', false ) ) :
     12 	class POMO_Reader {
     13 
     14 		public $endian = 'little';
     15 		public $_post  = '';
     16 
     17 		/**
     18 		 * PHP5 constructor.
     19 		 */
     20 		function __construct() {
     21 			if ( function_exists( 'mb_substr' )
     22 				&& ( (int) ini_get( 'mbstring.func_overload' ) & 2 ) // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated
     23 			) {
     24 				$this->is_overloaded = true;
     25 			} else {
     26 				$this->is_overloaded = false;
     27 			}
     28 
     29 			$this->_pos = 0;
     30 		}
     31 
     32 		/**
     33 		 * PHP4 constructor.
     34 		 *
     35 		 * @deprecated 5.4.0 Use __construct() instead.
     36 		 *
     37 		 * @see POMO_Reader::__construct()
     38 		 */
     39 		public function POMO_Reader() {
     40 			_deprecated_constructor( self::class, '5.4.0', static::class );
     41 			self::__construct();
     42 		}
     43 
     44 		/**
     45 		 * Sets the endianness of the file.
     46 		 *
     47 		 * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'.
     48 		 */
     49 		function setEndian( $endian ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid
     50 			$this->endian = $endian;
     51 		}
     52 
     53 		/**
     54 		 * Reads a 32bit Integer from the Stream
     55 		 *
     56 		 * @return mixed The integer, corresponding to the next 32 bits from
     57 		 *  the stream of false if there are not enough bytes or on error
     58 		 */
     59 		function readint32() {
     60 			$bytes = $this->read( 4 );
     61 			if ( 4 != $this->strlen( $bytes ) ) {
     62 				return false;
     63 			}
     64 			$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
     65 			$int           = unpack( $endian_letter, $bytes );
     66 			return reset( $int );
     67 		}
     68 
     69 		/**
     70 		 * Reads an array of 32-bit Integers from the Stream
     71 		 *
     72 		 * @param int $count How many elements should be read
     73 		 * @return mixed Array of integers or false if there isn't
     74 		 *  enough data or on error
     75 		 */
     76 		function readint32array( $count ) {
     77 			$bytes = $this->read( 4 * $count );
     78 			if ( 4 * $count != $this->strlen( $bytes ) ) {
     79 				return false;
     80 			}
     81 			$endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V';
     82 			return unpack( $endian_letter . $count, $bytes );
     83 		}
     84 
     85 		/**
     86 		 * @param string $string
     87 		 * @param int    $start
     88 		 * @param int    $length
     89 		 * @return string
     90 		 */
     91 		function substr( $string, $start, $length ) {
     92 			if ( $this->is_overloaded ) {
     93 				return mb_substr( $string, $start, $length, 'ascii' );
     94 			} else {
     95 				return substr( $string, $start, $length );
     96 			}
     97 		}
     98 
     99 		/**
    100 		 * @param string $string
    101 		 * @return int
    102 		 */
    103 		function strlen( $string ) {
    104 			if ( $this->is_overloaded ) {
    105 				return mb_strlen( $string, 'ascii' );
    106 			} else {
    107 				return strlen( $string );
    108 			}
    109 		}
    110 
    111 		/**
    112 		 * @param string $string
    113 		 * @param int    $chunk_size
    114 		 * @return array
    115 		 */
    116 		function str_split( $string, $chunk_size ) {
    117 			if ( ! function_exists( 'str_split' ) ) {
    118 				$length = $this->strlen( $string );
    119 				$out    = array();
    120 				for ( $i = 0; $i < $length; $i += $chunk_size ) {
    121 					$out[] = $this->substr( $string, $i, $chunk_size );
    122 				}
    123 				return $out;
    124 			} else {
    125 				return str_split( $string, $chunk_size );
    126 			}
    127 		}
    128 
    129 		/**
    130 		 * @return int
    131 		 */
    132 		function pos() {
    133 			return $this->_pos;
    134 		}
    135 
    136 		/**
    137 		 * @return true
    138 		 */
    139 		function is_resource() {
    140 			return true;
    141 		}
    142 
    143 		/**
    144 		 * @return true
    145 		 */
    146 		function close() {
    147 			return true;
    148 		}
    149 	}
    150 endif;
    151 
    152 if ( ! class_exists( 'POMO_FileReader', false ) ) :
    153 	class POMO_FileReader extends POMO_Reader {
    154 
    155 		/**
    156 		 * @param string $filename
    157 		 */
    158 		function __construct( $filename ) {
    159 			parent::__construct();
    160 			$this->_f = fopen( $filename, 'rb' );
    161 		}
    162 
    163 		/**
    164 		 * PHP4 constructor.
    165 		 *
    166 		 * @deprecated 5.4.0 Use __construct() instead.
    167 		 *
    168 		 * @see POMO_FileReader::__construct()
    169 		 */
    170 		public function POMO_FileReader( $filename ) {
    171 			_deprecated_constructor( self::class, '5.4.0', static::class );
    172 			self::__construct( $filename );
    173 		}
    174 
    175 		/**
    176 		 * @param int $bytes
    177 		 * @return string|false Returns read string, otherwise false.
    178 		 */
    179 		function read( $bytes ) {
    180 			return fread( $this->_f, $bytes );
    181 		}
    182 
    183 		/**
    184 		 * @param int $pos
    185 		 * @return bool
    186 		 */
    187 		function seekto( $pos ) {
    188 			if ( -1 == fseek( $this->_f, $pos, SEEK_SET ) ) {
    189 				return false;
    190 			}
    191 			$this->_pos = $pos;
    192 			return true;
    193 		}
    194 
    195 		/**
    196 		 * @return bool
    197 		 */
    198 		function is_resource() {
    199 			return is_resource( $this->_f );
    200 		}
    201 
    202 		/**
    203 		 * @return bool
    204 		 */
    205 		function feof() {
    206 			return feof( $this->_f );
    207 		}
    208 
    209 		/**
    210 		 * @return bool
    211 		 */
    212 		function close() {
    213 			return fclose( $this->_f );
    214 		}
    215 
    216 		/**
    217 		 * @return string
    218 		 */
    219 		function read_all() {
    220 			$all = '';
    221 			while ( ! $this->feof() ) {
    222 				$all .= $this->read( 4096 );
    223 			}
    224 			return $all;
    225 		}
    226 	}
    227 endif;
    228 
    229 if ( ! class_exists( 'POMO_StringReader', false ) ) :
    230 	/**
    231 	 * Provides file-like methods for manipulating a string instead
    232 	 * of a physical file.
    233 	 */
    234 	class POMO_StringReader extends POMO_Reader {
    235 
    236 		public $_str = '';
    237 
    238 		/**
    239 		 * PHP5 constructor.
    240 		 */
    241 		function __construct( $str = '' ) {
    242 			parent::__construct();
    243 			$this->_str = $str;
    244 			$this->_pos = 0;
    245 		}
    246 
    247 		/**
    248 		 * PHP4 constructor.
    249 		 *
    250 		 * @deprecated 5.4.0 Use __construct() instead.
    251 		 *
    252 		 * @see POMO_StringReader::__construct()
    253 		 */
    254 		public function POMO_StringReader( $str = '' ) {
    255 			_deprecated_constructor( self::class, '5.4.0', static::class );
    256 			self::__construct( $str );
    257 		}
    258 
    259 		/**
    260 		 * @param string $bytes
    261 		 * @return string
    262 		 */
    263 		function read( $bytes ) {
    264 			$data        = $this->substr( $this->_str, $this->_pos, $bytes );
    265 			$this->_pos += $bytes;
    266 			if ( $this->strlen( $this->_str ) < $this->_pos ) {
    267 				$this->_pos = $this->strlen( $this->_str );
    268 			}
    269 			return $data;
    270 		}
    271 
    272 		/**
    273 		 * @param int $pos
    274 		 * @return int
    275 		 */
    276 		function seekto( $pos ) {
    277 			$this->_pos = $pos;
    278 			if ( $this->strlen( $this->_str ) < $this->_pos ) {
    279 				$this->_pos = $this->strlen( $this->_str );
    280 			}
    281 			return $this->_pos;
    282 		}
    283 
    284 		/**
    285 		 * @return int
    286 		 */
    287 		function length() {
    288 			return $this->strlen( $this->_str );
    289 		}
    290 
    291 		/**
    292 		 * @return string
    293 		 */
    294 		function read_all() {
    295 			return $this->substr( $this->_str, $this->_pos, $this->strlen( $this->_str ) );
    296 		}
    297 
    298 	}
    299 endif;
    300 
    301 if ( ! class_exists( 'POMO_CachedFileReader', false ) ) :
    302 	/**
    303 	 * Reads the contents of the file in the beginning.
    304 	 */
    305 	class POMO_CachedFileReader extends POMO_StringReader {
    306 		/**
    307 		 * PHP5 constructor.
    308 		 */
    309 		function __construct( $filename ) {
    310 			parent::__construct();
    311 			$this->_str = file_get_contents( $filename );
    312 			if ( false === $this->_str ) {
    313 				return false;
    314 			}
    315 			$this->_pos = 0;
    316 		}
    317 
    318 		/**
    319 		 * PHP4 constructor.
    320 		 *
    321 		 * @deprecated 5.4.0 Use __construct() instead.
    322 		 *
    323 		 * @see POMO_CachedFileReader::__construct()
    324 		 */
    325 		public function POMO_CachedFileReader( $filename ) {
    326 			_deprecated_constructor( self::class, '5.4.0', static::class );
    327 			self::__construct( $filename );
    328 		}
    329 	}
    330 endif;
    331 
    332 if ( ! class_exists( 'POMO_CachedIntFileReader', false ) ) :
    333 	/**
    334 	 * Reads the contents of the file in the beginning.
    335 	 */
    336 	class POMO_CachedIntFileReader extends POMO_CachedFileReader {
    337 		/**
    338 		 * PHP5 constructor.
    339 		 */
    340 		public function __construct( $filename ) {
    341 			parent::__construct( $filename );
    342 		}
    343 
    344 		/**
    345 		 * PHP4 constructor.
    346 		 *
    347 		 * @deprecated 5.4.0 Use __construct() instead.
    348 		 *
    349 		 * @see POMO_CachedIntFileReader::__construct()
    350 		 */
    351 		function POMO_CachedIntFileReader( $filename ) {
    352 			_deprecated_constructor( self::class, '5.4.0', static::class );
    353 			self::__construct( $filename );
    354 		}
    355 	}
    356 endif;
    357