void writeResponseTree() { outputFile.seek(dataOffset); const uint OFFSETS[3] = { 0x619520, 0x618340, 0x617380 }; for (int idx = 0; idx < 1022; ++idx) { inputFile.seek(OFFSETS[_version] - FILE_DIFF[_version] + idx * 8); uint id = inputFile.readLong(); uint offset = inputFile.readLong(); outputFile.writeLong(id); if (!id) { // An end of list id } else if (offset >= OFFSETS[_version] && offset <= (OFFSETS[_version] + 0x1FF0)) { // Offset to another table outputFile.writeByte(0); outputFile.writeLong((offset - OFFSETS[_version]) / 8); } else { // Offset to ASCIIZ string outputFile.writeByte(1); writeString(offset); } } uint size = outputFile.size() - dataOffset; writeEntryHeader("TEXT/TREE", dataOffset, size); dataOffset += size; }
void writeSentenceMappings(const char *name, uint offset, int numValues) { inputFile.seek(offset - FILE_DIFF[_version]); outputFile.seek(dataOffset); uint id; while ((id = inputFile.readLong()) != 0) { outputFile.writeLong(id); for (int ctr = 0; ctr < numValues; ++ctr) outputFile.writeLong(inputFile.readLong()); } uint size = outputFile.size() - dataOffset; writeEntryHeader(name, dataOffset, size); dataOffset += size; }
void writeSentenceEntries(const char *name, uint tableOffset) { outputFile.seek(dataOffset); uint v1, v2, v4, v9, v11, v12, v13; uint offset3, offset5, offset6, offset7, offset8, offset10; for (uint idx = 0; ; ++idx) { inputFile.seek(tableOffset - FILE_DIFF[_version] + idx * 0x34); v1 = inputFile.readLong(); if (!v1) // Reached end of list break; // Read data fields v2 = inputFile.readLong(); offset3 = inputFile.readLong(); v4 = inputFile.readLong(); offset5 = inputFile.readLong(); offset6 = inputFile.readLong(); offset7 = inputFile.readLong(); offset8 = inputFile.readLong(); v9 = inputFile.readLong(); offset10 = inputFile.readLong(); v11 = inputFile.readLong(); v12 = inputFile.readLong(); v13 = inputFile.readLong(); outputFile.writeLong(v1); outputFile.writeLong(v2); writeString(offset3); outputFile.writeLong(v1); writeString(offset5); writeString(offset6); writeString(offset7); writeString(offset8); outputFile.writeLong(v9); writeString(offset10); outputFile.writeLong(v11); outputFile.writeLong(v12); outputFile.writeLong(v13); } uint size = outputFile.size() - dataOffset; writeEntryHeader(name, dataOffset, size); dataOffset += size; }
void writeWords(const char *name, uint tableOffset, int recordCount = 2) { outputFile.seek(dataOffset); int recordSize = recordCount * 4; uint val, strOffset; for (uint idx = 0; ; ++idx) { inputFile.seek(tableOffset - FILE_DIFF[_version] + idx * recordSize); val = inputFile.readLong(); strOffset = inputFile.readLong(); if (!val) // Reached end of list break; outputFile.writeLong(val); writeString(strOffset); } uint size = outputFile.size() - dataOffset; writeEntryHeader(name, dataOffset, size); dataOffset += size; }
void writeStringArray(const char *name, uint offset, int count) { outputFile.seek(dataOffset); inputFile.seek(offset - FILE_DIFF[_version]); uint *offsets = new uint[count]; for (int idx = 0; idx < count; ++idx) offsets[idx] = inputFile.readLong(); // Iterate through reading each string for (int idx = 0; idx < count; ++idx) { if (offsets[idx]) { inputFile.seek(offsets[idx] - FILE_DIFF[_version]); outputFile.writeString(inputFile); } else { outputFile.writeString(""); } } uint size = outputFile.size() - dataOffset; writeEntryHeader(name, dataOffset, size); dataOffset += size; delete[] offsets; }