aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/linker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/cruise/linker.cpp')
-rw-r--r--engines/cruise/linker.cpp609
1 files changed, 319 insertions, 290 deletions
diff --git a/engines/cruise/linker.cpp b/engines/cruise/linker.cpp
index 465248f606..914a571394 100644
--- a/engines/cruise/linker.cpp
+++ b/engines/cruise/linker.cpp
@@ -26,304 +26,333 @@
namespace Cruise {
-exportEntryStruct* parseExport(int* out1, int* pExportedFuncionIdx, char* buffer)
-{
- char localBuffer[256];
- uint8 functionName[256];
- uint8 overlayName[256];
- char* dotPtr;
- char* ptr2;
- int idx;
- int numExport;
- exportEntryStruct* currentExportEntry;
- uint8* entity1Name;
- int i;
-
- *out1 = 0;
- *pExportedFuncionIdx = 0;
-
- strcpyuint8(localBuffer, buffer);
- dotPtr = strchr(localBuffer,'.');
-
- if(dotPtr)
- {
- strcpyuint8(functionName,dotPtr+1);
- *dotPtr = 0;
-
- strcpyuint8(overlayName,localBuffer);
- }
- else
- {
- overlayName[0] = 0;
-
- strcpyuint8(functionName,buffer);
- }
-
- ptr2 = strchr((char*)functionName,':');
-
- if(ptr2)
- {
- *ptr2 = 0;
-
- *out1 = 1;
- }
-
- strToUpper(overlayName);
- strToUpper(functionName);
- if(strlen((char*)overlayName) == 0)
- return NULL;
-
- idx = findOverlayByName2(overlayName);
-
- if(idx == -4)
- return(NULL);
-
- if(overlayTable[idx].alreadyLoaded == 0)
- return(NULL);
-
- if(!overlayTable[idx].ovlData)
- return(NULL);
-
- numExport = overlayTable[idx].ovlData->numExport;
- currentExportEntry = overlayTable[idx].ovlData->exportDataPtr;
- entity1Name = overlayTable[idx].ovlData->exportNamesPtr;
-
- if(!entity1Name)
- return(0);
-
- for(i=0;i<numExport;i++)
- {
- uint8 exportedName[256];
- uint8* name = entity1Name + currentExportEntry->offsetToName;
-
- strcpyuint8(exportedName,name);
- strToUpper(exportedName);
-
- if(!strcmpuint8(functionName,exportedName))
- {
- *pExportedFuncionIdx = idx;
-
- return(currentExportEntry);
- }
-
- currentExportEntry++;
- }
-
- return(NULL);
-}
+exportEntryStruct *parseExport(int *out1, int *pExportedFuncionIdx,
+ char *buffer) {
+ char localBuffer[256];
+ uint8 functionName[256];
+ uint8 overlayName[256];
+ char *dotPtr;
+ char *ptr2;
+ int idx;
+ int numExport;
+ exportEntryStruct *currentExportEntry;
+ uint8 *entity1Name;
+ int i;
+
+ *out1 = 0;
+ *pExportedFuncionIdx = 0;
+
+ strcpyuint8(localBuffer, buffer);
+ dotPtr = strchr(localBuffer, '.');
+
+ if (dotPtr) {
+ strcpyuint8(functionName, dotPtr + 1);
+ *dotPtr = 0;
+
+ strcpyuint8(overlayName, localBuffer);
+ } else {
+ overlayName[0] = 0;
+
+ strcpyuint8(functionName, buffer);
+ }
+
+ ptr2 = strchr((char *)functionName, ':');
+
+ if (ptr2) {
+ *ptr2 = 0;
+
+ *out1 = 1;
+ }
+
+ strToUpper(overlayName);
+ strToUpper(functionName);
+ if (strlen((char *)overlayName) == 0)
+ return NULL;
+
+ idx = findOverlayByName2(overlayName);
+
+ if (idx == -4)
+ return (NULL);
+ if (overlayTable[idx].alreadyLoaded == 0)
+ return (NULL);
-int updateScriptImport(int ovlIdx)
-{
- char buffer[256];
- ovlDataStruct* ovlData;
- int numData3;
- int size5;
- int numImport;
- int param;
- int var_32;
- ovlData3Struct* pScript;
+ if (!overlayTable[idx].ovlData)
+ return (NULL);
+
+ numExport = overlayTable[idx].ovlData->numExport;
+ currentExportEntry = overlayTable[idx].ovlData->exportDataPtr;
+ entity1Name = overlayTable[idx].ovlData->exportNamesPtr;
+
+ if (!entity1Name)
+ return (0);
+
+ for (i = 0; i < numExport; i++) {
+ uint8 exportedName[256];
+ uint8 *name = entity1Name + currentExportEntry->offsetToName;
+
+ strcpyuint8(exportedName, name);
+ strToUpper(exportedName);
+
+ if (!strcmpuint8(functionName, exportedName)) {
+ *pExportedFuncionIdx = idx;
+
+ return (currentExportEntry);
+ }
+
+ currentExportEntry++;
+ }
+
+ return (NULL);
+}
+
+int updateScriptImport(int ovlIdx) {
+ char buffer[256];
+ ovlDataStruct *ovlData;
+ int numData3;
+ int size5;
+ int numImport;
+ int param;
+ int var_32;
+ ovlData3Struct *pScript;
// char* importDataPtr;
// char* namePtr;
// char* linkDataPtr;
-
- if(!overlayTable[ovlIdx].ovlData)
- return(-4);
-
- ovlData = overlayTable[ovlIdx].ovlData;
-
- numData3 = ovlData->numScripts1;
- size5 = ovlData->numScripts2;
- numImport = ovlData->numImport;
- param = 0;
-
- // do it for the 2 first string types
- do
- {
-
- int i = 0;
-
- if(param == 0)
- {
- var_32 = numData3;
- }
- else
- {
- var_32 = size5;
- }
-
- if(var_32)
- {
- do
- {
- importScriptStruct* ptrImportData;
- uint8* ptrImportName;
- uint8* ptrData;
-
- int var_22 = 0;
-
- if(param == 0)
- {
- pScript = getOvlData3Entry(ovlIdx, i);
- }
- else
- {
- pScript = scriptFunc1Sub2(ovlIdx, i);
- }
-
- ptrImportData = (importScriptStruct*) (pScript->dataPtr + pScript->offsetToImportData); // import data
- ptrImportName = pScript->dataPtr + pScript->offsetToImportName; // import name
- ptrData = pScript->dataPtr;
-
- var_22 = 0;
-
- if(pScript->numImport > 0)
- {
- int counter = pScript->numImport;
-
- do
- {
- int param2 = ptrImportData->type;
-
- if(param2 != 70)
- {
- exportEntryStruct* ptrDest2;
- int out1;
- int out2;
-
- strcpyuint8(buffer,ptrImportName + ptrImportData->offsetToName);
- ptrDest2 = parseExport(&out1,&out2,buffer);
-
- if(ptrDest2 && out2)
- {
- int temp = ptrImportData->offset;
- if(out1) //is sub function... (ie 'invent.livre:s')
- {
- uint8* ptr = ptrData + temp;
-
- *(ptr+1) = out2;
- *(int16*)(ptr+2) = ptrDest2->idx;
-
- flipShort((int16*)(ptr+2));
- }
- else
- {
- if(param2 == 20 || param2 == 30 || param2 == 40 || param2 == 50 ) // this patch a double push
- {
- uint8* ptr = ptrData + temp;
-
- *(ptr+1) = 0;
- *(ptr+2) = out2; // update the overlay number
-
- *(int16*)(ptr+4) = ptrDest2->idx;
-
- flipShort((int16*)(ptr+4));
- }
- else
- {
- int var_4 = ptrDest2->var4;
-
- if(var_4&1)
- {
- param2 = 8;
- }
- else
- {
- param2 = 16;
- }
-
- if(var_4>=0 && var_4<=3)
- {
- param2 |= 5;
- }
- else
- {
- param2 |= 6;
- }
-
- *(ptrData + temp) = param2;
- *(ptrData + temp + 1 ) = out2;
-
- *(int16*)(ptrData + temp + 2) = ptrDest2->idx;
-
- flipShort((int16*)(ptrData + temp + 2));
- }
- }
- }
- }
-
- ptrImportData++;
- }while(--counter);
- }
-
- }while(++i<var_32);
-
- }
-
- }while(++param<2);
-
- if(ovlData->importDataPtr && ovlData->importNamePtr && numImport)
- {
- int numImport2 = numImport;
- int i;
-
- for(i=0;i<numImport2;i++)
- {
- int out1;
- int foundExportIdx;
- exportEntryStruct* pFoundExport;
- int linkType;
- int linkEntryIdx;
-
- strcpyuint8(buffer,ovlData->importNamePtr + ovlData->importDataPtr[i].nameOffset);
-
- pFoundExport = parseExport(&out1,&foundExportIdx,buffer);
-
- linkType = ovlData->importDataPtr[i].linkType;
- linkEntryIdx = ovlData->importDataPtr[i].linkIdx;
-
- if(pFoundExport && foundExportIdx)
- {
- switch(linkType)
- {
- case 0: // var
- {
- ovlData->linkDataPtr[linkEntryIdx].varIdx = foundExportIdx;
- ovlData->linkDataPtr[linkEntryIdx].varNameOffset = pFoundExport->offsetToName;
- break;
- }
- case 1: // string
- {
- ovlData->linkDataPtr[linkEntryIdx].stringIdx = foundExportIdx;
- ovlData->linkDataPtr[linkEntryIdx].stringNameOffset = pFoundExport->offsetToName;
- break;
- }
- case 2: // proc
- {
- ovlData->linkDataPtr[linkEntryIdx].procIdx = foundExportIdx;
- ovlData->linkDataPtr[linkEntryIdx].procNameOffset = pFoundExport->offsetToName;
- break;
- }
- }
- }
- }
- }
-
- return(0);
+
+ if (!overlayTable[ovlIdx].ovlData)
+ return (-4);
+
+ ovlData = overlayTable[ovlIdx].ovlData;
+
+ numData3 = ovlData->numScripts1;
+ size5 = ovlData->numScripts2;
+ numImport = ovlData->numImport;
+ param = 0;
+
+ // do it for the 2 first string types
+ do {
+
+ int i = 0;
+
+ if (param == 0) {
+ var_32 = numData3;
+ } else {
+ var_32 = size5;
+ }
+
+ if (var_32) {
+ do {
+ importScriptStruct *ptrImportData;
+ uint8 *ptrImportName;
+ uint8 *ptrData;
+
+ int var_22 = 0;
+
+ if (param == 0) {
+ pScript = getOvlData3Entry(ovlIdx, i);
+ } else {
+ pScript = scriptFunc1Sub2(ovlIdx, i);
+ }
+
+ ptrImportData = (importScriptStruct *) (pScript->dataPtr + pScript->offsetToImportData); // import data
+ ptrImportName = pScript->dataPtr + pScript->offsetToImportName; // import name
+ ptrData = pScript->dataPtr;
+
+ var_22 = 0;
+
+ if (pScript->numImport > 0) {
+ int counter = pScript->numImport;
+
+ do {
+ int param2 =
+ ptrImportData->type;
+
+ if (param2 != 70) {
+ exportEntryStruct
+ * ptrDest2;
+ int out1;
+ int out2;
+
+ strcpyuint8(buffer,
+ ptrImportName +
+ ptrImportData->
+ offsetToName);
+ ptrDest2 =
+ parseExport(&out1,
+ &out2, buffer);
+
+ if (ptrDest2 && out2) {
+ int temp =
+ ptrImportData->
+ offset;
+ if (out1) //is sub function... (ie 'invent.livre:s')
+ {
+ uint8 *ptr = ptrData + temp;
+
+ *(ptr +
+ 1)
+ =
+ out2;
+ *(int16
+ *)
+ (ptr
+ +
+ 2)
+ =
+ ptrDest2->
+ idx;
+
+ flipShort
+ (
+ (int16
+ *)
+ (ptr + 2));
+ } else {
+ if (param2 == 20 || param2 == 30 || param2 == 40 || param2 == 50) // this patch a double push
+ {
+ uint8
+ *
+ ptr
+ =
+ ptrData
+ +
+ temp;
+
+ *(ptr + 1) = 0;
+ *(ptr + 2) = out2; // update the overlay number
+
+ *(int16 *) (ptr + 4) = ptrDest2->idx;
+
+ flipShort
+ (
+ (int16
+ *)
+ (ptr + 4));
+ } else {
+ int var_4 = ptrDest2->var4;
+
+ if (var_4 & 1) {
+ param2
+ =
+ 8;
+ } else {
+ param2
+ =
+ 16;
+ }
+
+ if (var_4 >= 0 && var_4 <= 3) {
+ param2
+ |=
+ 5;
+ } else {
+ param2
+ |=
+ 6;
+ }
+
+ *(ptrData + temp) = param2;
+ *(ptrData + temp + 1) = out2;
+
+ *(int16 *) (ptrData + temp + 2) = ptrDest2->idx;
+
+ flipShort
+ (
+ (int16
+ *)
+ (ptrData
+ +
+ temp
+ +
+ 2));
+ }
+ }
+ }
+ }
+
+ ptrImportData++;
+ } while (--counter);
+ }
+
+ } while (++i < var_32);
+
+ }
+
+ } while (++param < 2);
+
+ if (ovlData->importDataPtr && ovlData->importNamePtr && numImport) {
+ int numImport2 = numImport;
+ int i;
+
+ for (i = 0; i < numImport2; i++) {
+ int out1;
+ int foundExportIdx;
+ exportEntryStruct *pFoundExport;
+ int linkType;
+ int linkEntryIdx;
+
+ strcpyuint8(buffer,
+ ovlData->importNamePtr +
+ ovlData->importDataPtr[i].nameOffset);
+
+ pFoundExport =
+ parseExport(&out1, &foundExportIdx, buffer);
+
+ linkType = ovlData->importDataPtr[i].linkType;
+ linkEntryIdx = ovlData->importDataPtr[i].linkIdx;
+
+ if (pFoundExport && foundExportIdx) {
+ switch (linkType) {
+ case 0: // var
+ {
+ ovlData->
+ linkDataPtr[linkEntryIdx].
+ varIdx = foundExportIdx;
+ ovlData->
+ linkDataPtr[linkEntryIdx].
+ varNameOffset =
+ pFoundExport->offsetToName;
+ break;
+ }
+ case 1: // string
+ {
+ ovlData->
+ linkDataPtr[linkEntryIdx].
+ stringIdx = foundExportIdx;
+ ovlData->
+ linkDataPtr[linkEntryIdx].
+ stringNameOffset =
+ pFoundExport->offsetToName;
+ break;
+ }
+ case 2: // proc
+ {
+ ovlData->
+ linkDataPtr[linkEntryIdx].
+ procIdx = foundExportIdx;
+ ovlData->
+ linkDataPtr[linkEntryIdx].
+ procNameOffset =
+ pFoundExport->offsetToName;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return (0);
}
// check that the newly loaded isn't used by the already loaded overlays
-void updateAllScriptsImports(void)
-{
- int i;
-
- for(i=0;i<90;i++)
- {
- if(overlayTable[i].ovlData && overlayTable[i].alreadyLoaded)
- {
- updateScriptImport(i);
- }
- }
+void updateAllScriptsImports(void) {
+ int i;
+
+ for (i = 0; i < 90; i++) {
+ if (overlayTable[i].ovlData && overlayTable[i].alreadyLoaded) {
+ updateScriptImport(i);
+ }
+ }
}
} // End of namespace Cruise