wp/wp-includes/pomo/mo.php
changeset 21 48c4eec2b7e6
parent 19 3d72ae0968f4
equal deleted inserted replaced
20:7b1b88e27a20 21:48c4eec2b7e6
    11 require_once __DIR__ . '/streams.php';
    11 require_once __DIR__ . '/streams.php';
    12 
    12 
    13 if ( ! class_exists( 'MO', false ) ) :
    13 if ( ! class_exists( 'MO', false ) ) :
    14 	class MO extends Gettext_Translations {
    14 	class MO extends Gettext_Translations {
    15 
    15 
       
    16 		/**
       
    17 		 * Number of plural forms.
       
    18 		 *
       
    19 		 * @var int
       
    20 		 */
    16 		public $_nplurals = 2;
    21 		public $_nplurals = 2;
    17 
    22 
    18 		/**
    23 		/**
    19 		 * Loaded MO file.
    24 		 * Loaded MO file.
    20 		 *
    25 		 *
   122 			);
   127 			);
   123 			fseek( $fh, $originals_lengths_addr );
   128 			fseek( $fh, $originals_lengths_addr );
   124 
   129 
   125 			// Headers' msgid is an empty string.
   130 			// Headers' msgid is an empty string.
   126 			fwrite( $fh, pack( 'VV', 0, $current_addr ) );
   131 			fwrite( $fh, pack( 'VV', 0, $current_addr ) );
   127 			$current_addr++;
   132 			++$current_addr;
   128 			$originals_table = "\0";
   133 			$originals_table = "\0";
   129 
   134 
   130 			$reader = new POMO_Reader();
   135 			$reader = new POMO_Reader();
   131 
   136 
   132 			foreach ( $entries as $entry ) {
   137 			foreach ( $entries as $entry ) {
   199 			// bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565
   204 			// bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565
   200 			$magic_little    = (int) - 1794895138;
   205 			$magic_little    = (int) - 1794895138;
   201 			$magic_little_64 = (int) 2500072158;
   206 			$magic_little_64 = (int) 2500072158;
   202 			// 0xde120495
   207 			// 0xde120495
   203 			$magic_big = ( (int) - 569244523 ) & 0xFFFFFFFF;
   208 			$magic_big = ( (int) - 569244523 ) & 0xFFFFFFFF;
   204 			if ( $magic_little == $magic || $magic_little_64 == $magic ) {
   209 			if ( $magic_little === $magic || $magic_little_64 === $magic ) {
   205 				return 'little';
   210 				return 'little';
   206 			} elseif ( $magic_big == $magic ) {
   211 			} elseif ( $magic_big === $magic ) {
   207 				return 'big';
   212 				return 'big';
   208 			} else {
   213 			} else {
   209 				return false;
   214 				return false;
   210 			}
   215 			}
   211 		}
   216 		}
   222 			$reader->setEndian( $endian_string );
   227 			$reader->setEndian( $endian_string );
   223 
   228 
   224 			$endian = ( 'big' === $endian_string ) ? 'N' : 'V';
   229 			$endian = ( 'big' === $endian_string ) ? 'N' : 'V';
   225 
   230 
   226 			$header = $reader->read( 24 );
   231 			$header = $reader->read( 24 );
   227 			if ( $reader->strlen( $header ) != 24 ) {
   232 			if ( $reader->strlen( $header ) !== 24 ) {
   228 				return false;
   233 				return false;
   229 			}
   234 			}
   230 
   235 
   231 			// Parse header.
   236 			// Parse header.
   232 			$header = unpack( "{$endian}revision/{$endian}total/{$endian}originals_lengths_addr/{$endian}translations_lengths_addr/{$endian}hash_length/{$endian}hash_addr", $header );
   237 			$header = unpack( "{$endian}revision/{$endian}total/{$endian}originals_lengths_addr/{$endian}translations_lengths_addr/{$endian}hash_length/{$endian}hash_addr", $header );
   233 			if ( ! is_array( $header ) ) {
   238 			if ( ! is_array( $header ) ) {
   234 				return false;
   239 				return false;
   235 			}
   240 			}
   236 
   241 
   237 			// Support revision 0 of MO format specs, only.
   242 			// Support revision 0 of MO format specs, only.
   238 			if ( 0 != $header['revision'] ) {
   243 			if ( 0 !== $header['revision'] ) {
   239 				return false;
   244 				return false;
   240 			}
   245 			}
   241 
   246 
   242 			// Seek to data blocks.
   247 			// Seek to data blocks.
   243 			$reader->seekto( $header['originals_lengths_addr'] );
   248 			$reader->seekto( $header['originals_lengths_addr'] );
   244 
   249 
   245 			// Read originals' indices.
   250 			// Read originals' indices.
   246 			$originals_lengths_length = $header['translations_lengths_addr'] - $header['originals_lengths_addr'];
   251 			$originals_lengths_length = $header['translations_lengths_addr'] - $header['originals_lengths_addr'];
   247 			if ( $originals_lengths_length != $header['total'] * 8 ) {
   252 			if ( $originals_lengths_length !== $header['total'] * 8 ) {
   248 				return false;
   253 				return false;
   249 			}
   254 			}
   250 
   255 
   251 			$originals = $reader->read( $originals_lengths_length );
   256 			$originals = $reader->read( $originals_lengths_length );
   252 			if ( $reader->strlen( $originals ) != $originals_lengths_length ) {
   257 			if ( $reader->strlen( $originals ) !== $originals_lengths_length ) {
   253 				return false;
   258 				return false;
   254 			}
   259 			}
   255 
   260 
   256 			// Read translations' indices.
   261 			// Read translations' indices.
   257 			$translations_lengths_length = $header['hash_addr'] - $header['translations_lengths_addr'];
   262 			$translations_lengths_length = $header['hash_addr'] - $header['translations_lengths_addr'];
   258 			if ( $translations_lengths_length != $header['total'] * 8 ) {
   263 			if ( $translations_lengths_length !== $header['total'] * 8 ) {
   259 				return false;
   264 				return false;
   260 			}
   265 			}
   261 
   266 
   262 			$translations = $reader->read( $translations_lengths_length );
   267 			$translations = $reader->read( $translations_lengths_length );
   263 			if ( $reader->strlen( $translations ) != $translations_lengths_length ) {
   268 			if ( $reader->strlen( $translations ) !== $translations_lengths_length ) {
   264 				return false;
   269 				return false;
   265 			}
   270 			}
   266 
   271 
   267 			// Transform raw data into set of indices.
   272 			// Transform raw data into set of indices.
   268 			$originals    = $reader->str_split( $originals, 8 );
   273 			$originals    = $reader->str_split( $originals, 8 );