[Scummvm-cvs-logs] SF.net SVN: scummvm: [24928] tools/trunk
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Tue Dec 26 00:25:55 CET 2006
Revision: 24928
http://scummvm.svn.sourceforge.net/scummvm/?rev=24928&view=rev
Author: fingolfin
Date: 2006-12-25 15:25:55 -0800 (Mon, 25 Dec 2006)
Log Message:
-----------
More descumm cleanup
Modified Paths:
--------------
tools/trunk/descumm-tool.cpp
tools/trunk/descumm.h
Modified: tools/trunk/descumm-tool.cpp
===================================================================
--- tools/trunk/descumm-tool.cpp 2006-12-25 23:25:28 UTC (rev 24927)
+++ tools/trunk/descumm-tool.cpp 2006-12-25 23:25:55 UTC (rev 24928)
@@ -23,8 +23,12 @@
#include "descumm.h"
-void ShowHelpAndExit()
-{
+// 200kb limit on the input file (we just read it all at once into memory).
+// Should be no problem, the biggest scripts I have seen were in COMI and
+// went up to 180kb (script-457).
+#define MAX_FILE_SIZE (200 * 1024)
+
+void ShowHelpAndExit() {
printf("SCUMM Script decompiler\n"
"Syntax:\n"
"\tdescumm [-o] filename\n"
@@ -249,8 +253,7 @@
int main(int argc, char *argv[]) {
FILE *in;
- byte *mem, *memorg;
- int len;
+ byte *memorg;
char *filename;
scriptVersion = 0xff;
@@ -268,75 +271,75 @@
}
// Read the file into memory
- memorg = mem = (byte *)malloc(MAX_FILE_SIZE);
- len = fread(mem, 1, MAX_FILE_SIZE, in);
+ memorg = (byte *)malloc(MAX_FILE_SIZE);
+ size_of_code = fread(memorg, 1, MAX_FILE_SIZE, in);
fclose(in);
- size_of_code = len;
offs_of_line = 0;
+ org_pos = memorg;
if (GF_UNBLOCKED) {
if (size_of_code < 4) {
error("File too small to be a script");
}
// Hack to detect verb script: first 4 bytes should be file length
- if (READ_LE_UINT32(mem) == size_of_code) {
+ if (READ_LE_UINT32(org_pos) == size_of_code) {
if (scriptVersion <= 2)
- offs_of_line = skipVerbHeader_V12(mem);
+ offs_of_line = skipVerbHeader_V12(org_pos);
else
- offs_of_line = skipVerbHeader_V34(mem );
+ offs_of_line = skipVerbHeader_V34(org_pos);
} else {
- mem += 4;
+ org_pos += 4;
}
} else if (scriptVersion >= 5) {
if (size_of_code < (scriptVersion == 5 ? 8 : 9)) {
error("File too small to be a script");
}
- switch (READ_BE_UINT32(mem)) {
+ switch (READ_BE_UINT32(org_pos)) {
case 'LSC2':
if (size_of_code <= 12) {
printf("File too small to be a local script\n");
}
- printf("Script# %d\n", READ_LE_UINT32(mem+8));
- mem += 12;
+ printf("Script# %d\n", READ_LE_UINT32(org_pos+8));
+ org_pos += 12;
break; /* Local script */
case 'LSCR':
if (scriptVersion == 8) {
if (size_of_code <= 12) {
printf("File too small to be a local script\n");
}
- printf("Script# %d\n", READ_LE_UINT32(mem+8));
- mem += 12;
+ printf("Script# %d\n", READ_LE_UINT32(org_pos+8));
+ org_pos += 12;
} else if (scriptVersion == 7) {
if (size_of_code <= 10) {
printf("File too small to be a local script\n");
}
- printf("Script# %d\n", READ_LE_UINT16(mem+8));
- mem += 10;
+ printf("Script# %d\n", READ_LE_UINT16(org_pos+8));
+ org_pos += 10;
} else {
if (size_of_code <= 9) {
printf("File too small to be a local script\n");
}
- printf("Script# %d\n", (byte)mem[8]);
- mem += 9;
+ printf("Script# %d\n", (byte)org_pos[8]);
+ org_pos += 9;
}
break; /* Local script */
case 'SCRP':
- mem += 8;
+ org_pos += 8;
break; /* Script */
case 'ENCD':
- mem += 8;
+ org_pos += 8;
break; /* Entry code */
case 'EXCD':
- mem += 8;
+ org_pos += 8;
break; /* Exit code */
case 'VERB':
if (scriptVersion == 8) {
- mem += 8;
- offs_of_line = skipVerbHeader_V8(mem);
+ org_pos += 8;
+ offs_of_line = skipVerbHeader_V8(org_pos);
} else
- offs_of_line = skipVerbHeader_V567(mem);
+ offs_of_line = skipVerbHeader_V567(org_pos);
break; /* Verb */
default:
error("Unknown script type");
@@ -345,33 +348,32 @@
if (size_of_code < 6) {
error("File too small to be a script");
}
- switch (READ_BE_UINT16(mem + 4)) {
+ switch (READ_BE_UINT16(org_pos + 4)) {
case 'LS':
- printf("Script# %d\n", (byte)mem[6]);
- mem += 7;
+ printf("Script# %d\n", (byte)org_pos[6]);
+ org_pos += 7;
break; /* Local script */
case 'SC':
- mem += 6;
+ org_pos += 6;
break; /* Script */
case 'EN':
- mem += 6;
+ org_pos += 6;
break; /* Entry code */
case 'EX':
- mem += 6;
+ org_pos += 6;
break; /* Exit code */
case 'OC':
- offs_of_line = skipVerbHeader_V34(mem);
+ offs_of_line = skipVerbHeader_V34(org_pos);
break; /* Verb */
default:
error("Unknown script type");
}
}
- org_pos = mem;
cur_pos = org_pos + offs_of_line;
- len -= mem - memorg;
- while (cur_pos < mem + len) {
+ offs_of_line = get_curoffs();
+ while (cur_pos < size_of_code + memorg) {
byte opcode = *cur_pos;
int j = g_blockStack.size();
char outputLineBuffer[8192] = "";
Modified: tools/trunk/descumm.h
===================================================================
--- tools/trunk/descumm.h 2006-12-25 23:25:28 UTC (rev 24927)
+++ tools/trunk/descumm.h 2006-12-25 23:25:55 UTC (rev 24928)
@@ -27,12 +27,6 @@
#include "util.h"
-// 200kb limit on the input file (we just read it all at once into memory).
-// Should be no problem, the biggest scripts I have seen were in COMI and
-// went up to 180kb (script-457).
-#define MAX_FILE_SIZE (200 * 1024)
-
-
typedef unsigned int uint;
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list