- $originals_lenghts = $reader->readint32array($total * 2); // each of
- $reader->seekto($translations_lenghts_addr);
- $translations_lenghts = $reader->readint32array($total * 2);
-
- $length = create_function('$i', 'return $i * 2 + 1;');
- $offset = create_function('$i', 'return $i * 2 + 2;');
-
- for ($i = 0; $i < $total; ++$i) {
- $reader->seekto($originals_lenghts[$offset($i)]);
- $original = $reader->read($originals_lenghts[$length($i)]);
- $reader->seekto($translations_lenghts[$offset($i)]);
- $translation = $reader->read($translations_lenghts[$length($i)]);
- if ('' == $original) {
+
+ // read originals' indices
+ $originals_lengths_length = $translations_lenghts_addr - $originals_lenghts_addr;
+ if ( $originals_lengths_length != $total * 8 )
+ return false;
+
+ $originals = $reader->read($originals_lengths_length);
+ if ( $reader->strlen( $originals ) != $originals_lengths_length )
+ return false;
+
+ // read translations' indices
+ $translations_lenghts_length = $hash_addr - $translations_lenghts_addr;
+ if ( $translations_lenghts_length != $total * 8 )
+ return false;
+
+ $translations = $reader->read($translations_lenghts_length);
+ if ( $reader->strlen( $translations ) != $translations_lenghts_length )
+ return false;
+
+ // transform raw data into set of indices
+ $originals = $reader->str_split( $originals, 8 );
+ $translations = $reader->str_split( $translations, 8 );
+
+ // skip hash table
+ $strings_addr = $hash_addr + $hash_length * 4;
+
+ $reader->seekto($strings_addr);
+
+ $strings = $reader->read_all();
+ $reader->close();
+
+ for ( $i = 0; $i < $total; $i++ ) {
+ $o = unpack( "{$endian}length/{$endian}pos", $originals[$i] );
+ $t = unpack( "{$endian}length/{$endian}pos", $translations[$i] );
+ if ( !$o || !$t ) return false;
+
+ // adjust offset due to reading strings to separate space before
+ $o['pos'] -= $strings_addr;
+ $t['pos'] -= $strings_addr;
+
+ $original = $reader->substr( $strings, $o['pos'], $o['length'] );
+ $translation = $reader->substr( $strings, $t['pos'], $t['length'] );
+
+ if ('' === $original) {