Skip to content
Permalink
Browse files

DEBUGGER: Extend the md5 and md5mac commands to handle any chunk length

This will be useful in matching the MD5 checksums with what the
advanced detector returns
  • Loading branch information
bluegr committed Dec 28, 2014
1 parent 78b2c87 commit dd347dec83e0d074585cdfd99aa93a17da94ccd4
Showing with 42 additions and 14 deletions.
  1. +42 −14 gui/debugger.cpp
@@ -522,11 +522,25 @@ struct ArchiveMemberLess {

bool Debugger::cmdMd5(int argc, const char **argv) {
if (argc < 2) {
debugPrintf("md5 <filename | pattern>\n");
debugPrintf("md5 [-n length] <filename | pattern>\n");
} else {
uint32 length = 0;
uint paramOffset = 0;

// If the user supplied an -n parameter, set the bytes to read
if (!strcmp(argv[1], "-n")) {
// Make sure that we have at least two more parameters
if (argc < 4) {
debugPrintf("md5 [-n length] <filename | pattern>\n");
return true;
}
length = atoi(argv[2]);
paramOffset = 2;
}

// Assume that spaces are part of a single filename.
Common::String filename = argv[1];
for (int i = 2; i < argc; i++) {
Common::String filename = argv[1 + paramOffset];
for (int i = 2 + paramOffset; i < argc; i++) {
filename = filename + " " + argv[i];
}
Common::ArchiveMemberList list;
@@ -536,9 +550,9 @@ bool Debugger::cmdMd5(int argc, const char **argv) {
} else {
sort(list.begin(), list.end(), ArchiveMemberLess());
for (Common::ArchiveMemberList::iterator iter = list.begin(); iter != list.end(); ++iter) {
Common::ReadStream *stream = (*iter)->createReadStream();
Common::String md5 = Common::computeStreamMD5AsString(*stream, 0);
debugPrintf("%s %s\n", md5.c_str(), (*iter)->getDisplayName().c_str());
Common::SeekableReadStream *stream = (*iter)->createReadStream();
Common::String md5 = Common::computeStreamMD5AsString(*stream, length);
debugPrintf("%s %s %d\n", md5.c_str(), (*iter)->getDisplayName().c_str(), stream->size());
delete stream;
}
}
@@ -548,11 +562,25 @@ bool Debugger::cmdMd5(int argc, const char **argv) {

bool Debugger::cmdMd5Mac(int argc, const char **argv) {
if (argc < 2) {
debugPrintf("md5mac <base filename>\n");
debugPrintf("md5mac [-n length] <base filename>\n");
} else {
uint32 length = 0;
uint paramOffset = 0;

// If the user supplied an -n parameter, set the bytes to read
if (!strcmp(argv[1], "-n")) {
// Make sure that we have at least two more parameters
if (argc < 4) {
debugPrintf("md5mac [-n length] <base filename>\n");
return true;
}
length = atoi(argv[2]);
paramOffset = 2;
}

// Assume that spaces are part of a single filename.
Common::String filename = argv[1];
for (int i = 2; i < argc; i++) {
Common::String filename = argv[1 + paramOffset];
for (int i = 2 + paramOffset; i < argc; i++) {
filename = filename + " " + argv[i];
}
Common::MacResManager macResMan;
@@ -568,13 +596,13 @@ bool Debugger::cmdMd5Mac(int argc, const char **argv) {
} else {
// The resource fork is probably the most relevant one.
if (macResMan.hasResFork()) {
Common::String md5 = macResMan.computeResForkMD5AsString(0);
debugPrintf("%s %s (resource)\n", md5.c_str(), macResMan.getBaseFileName().c_str());
Common::String md5 = macResMan.computeResForkMD5AsString(length);
debugPrintf("%s %s (resource) %d\n", md5.c_str(), macResMan.getBaseFileName().c_str(), macResMan.getResForkDataSize());
}
if (macResMan.hasDataFork()) {
Common::ReadStream *stream = macResMan.getDataFork();
Common::String md5 = Common::computeStreamMD5AsString(*stream, 0);
debugPrintf("%s %s (data)\n", md5.c_str(), macResMan.getBaseFileName().c_str());
Common::SeekableReadStream *stream = macResMan.getDataFork();
Common::String md5 = Common::computeStreamMD5AsString(*stream, length);
debugPrintf("%s %s (data) %d\n", md5.c_str(), macResMan.getBaseFileName().c_str(), stream->size());
}
}
macResMan.close();

0 comments on commit dd347de

Please sign in to comment.
You can’t perform that action at this time.