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 ); |