diff options
Diffstat (limited to 'engines/wintermute/Base/scriptables/ScScript.cpp')
-rw-r--r-- | engines/wintermute/Base/scriptables/ScScript.cpp | 189 |
1 files changed, 0 insertions, 189 deletions
diff --git a/engines/wintermute/Base/scriptables/ScScript.cpp b/engines/wintermute/Base/scriptables/ScScript.cpp index 0abd9a1ff9..ebb68654fd 100644 --- a/engines/wintermute/Base/scriptables/ScScript.cpp +++ b/engines/wintermute/Base/scriptables/ScScript.cpp @@ -1339,203 +1339,14 @@ CScScript::TExternalFunction *CScScript::getExternal(char *name) { //////////////////////////////////////////////////////////////////////////
ERRORCODE CScScript::externalCall(CScStack *stack, CScStack *thisStack, CScScript::TExternalFunction *function) {
-#ifndef __WIN32__
-
Game->LOG(0, "External functions are not supported on this platform.");
stack->correctParams(0);
stack->pushNULL();
return STATUS_FAILED;
-
-#else
-
- bool Success = false;
- HMODULE hDll = LoadLibrary(Function->dll_name);
-
- if (hDll) {
- FARPROC pFunc = GetProcAddress(hDll, Function->name);
- if (pFunc) {
- int i;
- Success = true;
- stack->correctParams(Function->nu_params);
- CBDynBuffer *Buffer = new CBDynBuffer(Game, 20 * sizeof(uint32));
-
- for (i = 0; i < Function->nu_params; i++) {
- CScValue *Val = stack->pop();
- switch (Function->params[i]) {
- case TYPE_BOOL:
- buffer->PutDWORD((uint32)Val->getBool());
- break;
- case TYPE_LONG:
- buffer->PutDWORD(Val->getInt());
- break;
- case TYPE_BYTE:
- buffer->PutDWORD((byte)Val->getInt());
- break;
- case TYPE_STRING:
- if (Val->isNULL()) buffer->PutDWORD(0);
- else buffer->PutDWORD((uint32)Val->getString());
- break;
- case TYPE_MEMBUFFER:
- if (Val->isNULL()) buffer->PutDWORD(0);
- else buffer->PutDWORD((uint32)Val->getMemBuffer());
- break;
- case TYPE_FLOAT: {
- float f = Val->getFloat();
- buffer->PutDWORD(*((uint32 *)&f));
- break;
- }
- case TYPE_DOUBLE: {
- double d = Val->getFloat();
- uint32 *pd = (uint32 *)&d;
-
- buffer->PutDWORD(pd[0]);
- buffer->PutDWORD(pd[1]);
- break;
- }
- }
- }
-
- // call
- uint32 ret;
- bool StackCorrupted = false;
- switch (Function->call_type) {
- case CALL_CDECL:
- ret = Call_cdecl(buffer->_buffer, buffer->GetSize(), (uint32)pFunc, &StackCorrupted);
- break;
- default:
- ret = Call_stdcall(buffer->_buffer, buffer->GetSize(), (uint32)pFunc, &StackCorrupted);
- }
- delete Buffer;
-
- // return
- switch (Function->returns) {
- case TYPE_BOOL:
- stack->pushBool((byte)ret != 0);
- break;
- case TYPE_LONG:
- stack->pushInt(ret);
- break;
- case TYPE_BYTE:
- stack->pushInt((byte)ret);
- break;
- break;
- case TYPE_STRING:
- stack->pushString((char *)ret);
- break;
- case TYPE_MEMBUFFER: {
- CSXMemBuffer *Buf = new CSXMemBuffer(Game, (void *)ret);
- stack->pushNative(Buf, false);
- }
- break;
- case TYPE_FLOAT: {
- uint32 dw = GetST0();
- stack->pushFloat(*((float *)&dw));
- break;
- }
- case TYPE_DOUBLE:
- stack->pushFloat(GetST0Double());
- break;
-
- default:
- stack->pushNULL();
- }
-
- if (StackCorrupted) RuntimeError("Warning: Stack corrupted after calling '%s' in '%s'\n Check parameters and/or calling convention.", Function->name, Function->dll_name);
- } else RuntimeError("Exported function '%s' not found in '%s'", Function->name, Function->dll_name);
- } else RuntimeError("Error loading DLL '%s'", Function->dll_name);
-
- if (!Success) {
- stack->correctParams(0);
- stack->pushNULL();
- }
-
- if (hDll) FreeLibrary(hDll);
-
- return Success ? STATUS_OK : STATUS_FAILED;
-#endif
-}
-
-#ifdef __WIN32__
-//////////////////////////////////////////////////////////////////////////
-uint32 CScScript::Call_cdecl(const void *args, size_t sz, uint32 func, bool *StackCorrupt) {
- uint32 rc; // here's our return value...
- uint32 OrigESP;
- bool StkCorrupt = false;
- __asm {
- mov OrigESP, esp
- mov ecx, sz // get size of buffer
- mov esi, args // get buffer
- sub esp, ecx // allocate stack space
- mov edi, esp // start of destination stack frame
- shr ecx, 2 // make it dwords
- rep movsd // copy params to real stack
- call [func] // call the function
- mov rc, eax // save the return value
- add esp, sz // restore the stack pointer
- cmp esp, OrigESP
- jz finish
- mov esp, OrigESP
- mov StkCorrupt, 1
- finish:
- }
-
- if (StackCorrupt) *StackCorrupt = StkCorrupt;
- return rc;
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////
-uint32 CScScript::Call_stdcall(const void *args, size_t sz, uint32 func, bool *StackCorrupt) {
- uint32 rc; // here's our return value...
- uint32 OrigESP;
- bool StkCorrupt = false;
-
- __asm {
- mov OrigESP, esp
- mov ecx, sz // get size of buffer
- mov esi, args // get buffer
- sub esp, ecx // allocate stack space
- mov edi, esp // start of destination stack frame
- shr ecx, 2 // make it dwords
- rep movsd // copy it
- call [func] // call the function
- mov rc, eax // save the return value
- cmp esp, OrigESP
- jz finish
- mov esp, OrigESP
- mov StkCorrupt, 1
- finish:
- }
-
- if (StackCorrupt) *StackCorrupt = StkCorrupt;
- return rc;
}
//////////////////////////////////////////////////////////////////////////
-__declspec(naked) uint32 CScScript::GetST0(void) {
- uint32 f; // temp var
- __asm {
- fstp uint32 ptr [f] // pop ST0 into f
- mov eax, uint32 ptr [f] // copy into eax
- ret // done
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-double CScScript::GetST0Double(void) {
- double d; // temp var
- __asm {
- fstp qword ptr [d] // get ST0 into d
- }
- return d;
-}
-#endif
-
-
-//////////////////////////////////////////////////////////////////////////
ERRORCODE CScScript::copyParameters(CScStack *stack) {
int i;
int NumParams = stack->pop()->getInt();
|