Computed actual (i.e. compressed) size for TRE objects

This commit is contained in:
2015-04-29 15:09:19 +02:00
parent 12242de1e1
commit fcd32ed598
2 changed files with 28 additions and 14 deletions

View File

@@ -79,7 +79,19 @@ TreFile::TreFile(char const* base, size_t length)
fprintf(stderr, "Data length exceeds file length: %.8x %.8x\n", dataPtr, length); fprintf(stderr, "Data length exceeds file length: %.8x %.8x\n", dataPtr, length);
} }
table3_.emplace_back(dataPtr, length, flags); if (!table3_.empty()) {
uint32_t lastPtr, lastLen;
uint8_t lastFlags;
std::tie(lastPtr, std::ignore, lastLen, lastFlags) = table3_.back();
if (lastPtr+lastLen > dataPtr) {
if (lastFlags&0x80)
std::get<2>(table3_.back()) = dataPtr - lastPtr;
else
fprintf(stderr, "Overlap? %u %u (%hhu) -> %u\n",lastPtr, lastLen, lastFlags, dataPtr);
}
}
table3_.emplace_back(dataPtr, length, length, flags);
} }
// Read Table 2 // Read Table 2
@@ -258,7 +270,7 @@ void TreFile::printStructure()
printf("\t%.8x -> (ofs %.8x, len %.8x, flags %.2hhx)\n", ent.first, printf("\t%.8x -> (ofs %.8x, len %.8x, flags %.2hhx)\n", ent.first,
std::get<0>(table3_[ent.second]), std::get<0>(table3_[ent.second]),
std::get<1>(table3_[ent.second]), std::get<1>(table3_[ent.second]),
std::get<2>(table3_[ent.second])); std::get<3>(table3_[ent.second]));
} }
printf("Files by Name:\n"); printf("Files by Name:\n");
@@ -266,7 +278,7 @@ void TreFile::printStructure()
printf("\t%s -> (ofs %.8x, len %.8x, flags %.2hhx)\n", ent.first.c_str(), printf("\t%s -> (ofs %.8x, len %.8x, flags %.2hhx)\n", ent.first.c_str(),
std::get<0>(table3_[ent.second]), std::get<0>(table3_[ent.second]),
std::get<1>(table3_[ent.second]), std::get<1>(table3_[ent.second]),
std::get<2>(table3_[ent.second])); std::get<3>(table3_[ent.second]));
} }
} }
@@ -293,34 +305,34 @@ size_t TreFile::findCRC_(uint32_t crc) const
void TreFile::dumpIdx_(std::string const& name, size_t table3Idx) const void TreFile::dumpIdx_(std::string const& name, size_t table3Idx) const
{ {
uint32_t dataPtr, length; uint32_t dataPtr, length, clength;
uint8_t flags; uint8_t flags;
std::tie(dataPtr, length, flags) = table3_[table3Idx]; std::tie(dataPtr, length, clength, flags) = table3_[table3Idx];
if(flags&0x80) // if(flags&0x80)
throw Exception{"Compressed TRE objects NYI"}; // throw Exception{"Compressed TRE objects NYI"};
if ((dataPtr + length) > length_) if ((dataPtr + clength) > length_)
throw FormatException{"length exceeds file size"}; throw FormatException{"length exceeds file size"};
FILEUPtr outFile{fopen(name.c_str(), "wb")}; FILEUPtr outFile{fopen(name.c_str(), "wb")};
if (!outFile) if (!outFile)
throw POSIXException{errno, "Could not open " + name}; throw POSIXException{errno, "Could not open " + name};
if (fwrite(base_+dataPtr, length, 1, outFile.get()) != 1) if (fwrite(base_+dataPtr, clength, 1, outFile.get()) != 1)
throw POSIXException{errno, "Could not write"}; throw POSIXException{errno, "Could not write"};
} }
TreFile::Object TreFile::openIdx_(size_t table3Idx) const TreFile::Object TreFile::openIdx_(size_t table3Idx) const
{ {
uint32_t dataPtr, length; uint32_t dataPtr, length, clength;
uint8_t flags; uint8_t flags;
std::tie(dataPtr, length, flags) = table3_[table3Idx]; std::tie(dataPtr, length, clength, flags) = table3_[table3Idx];
if(flags&0x80) if(flags&0x80)
throw Exception{"Compressed TRE objects NYI"}; throw Exception{"Compressed TRE objects NYI"};
if ((dataPtr + length) > length_) if ((dataPtr + clength) > length_)
throw FormatException{"length exceeds file size"}; throw FormatException{"length exceeds file size"};
return Object(base_+dataPtr, return Object(base_+dataPtr,
@@ -330,7 +342,7 @@ TreFile::Object TreFile::openIdx_(size_t table3Idx) const
TreFile::Stat TreFile::statIdx_(size_t table3Idx) const TreFile::Stat TreFile::statIdx_(size_t table3Idx) const
{ {
Stat ret; Stat ret;
std::tie(std::ignore, ret.size, ret.flags) = table3_[table3Idx]; std::tie(std::ignore, ret.size, ret.csize, ret.flags) = table3_[table3Idx];
return ret; return ret;
} }

View File

@@ -71,6 +71,7 @@ public:
struct Stat { struct Stat {
uint32_t size; uint32_t size;
uint32_t csize;
uint8_t flags; uint8_t flags;
}; };
@@ -89,7 +90,8 @@ private:
std::map<uint32_t, size_t> table1_; std::map<uint32_t, size_t> table1_;
std::map<std::string, size_t> table2_; std::map<std::string, size_t> table2_;
std::vector<std::tuple<uint32_t, uint32_t, uint8_t> > table3_; // base, size, comp. size, flags
std::vector<std::tuple<uint32_t, uint32_t, uint32_t, uint8_t> > table3_;
char const* base_; char const* base_;
size_t length_; size_t length_;