mahlendur/_work/Data/Scripts/Content/LeGo/BinaryMachines.d
Daniel Heße 892a40ff0f Initial commit with Subversion-codebase from 13/05/2022.
Cleaned up the mess, at this time, only viable data get synced (_work directory for Gothic-data, miranda for mdc-scripts.
Need to symlink files to a working directory.
2022-05-13 17:38:52 +02:00

373 lines
No EOL
9.8 KiB
D
Raw Permalink Blame History

/***********************************\
BINARYMACHINES
\***********************************/
/*--------------------
Enginecalls
--------------------*/
const int CREATE_ALWAYS = 2;
const int OPEN_EXISTING = 3;
const int GENERIC_ALL = 1073741824;
const int GENERIC_READ = -2147483648;
const int FILE_SHARE_READ = 1;
const int FILE_SHARE_WRITE = 2;
const int FILE_SHARE_DELETE = 4;
const int FILE_ATTRIBUTE_NORMAL = 128;
func int WIN_GetLastError() {
const int call = 0;
if(CALL_Begin(call)) {
CALL__stdcall(GetLastError);
call = CALL_End();
};
return CALL_RetValAsInt();
};
func int WIN_CreateFile(
var string lpFileName,
var int dwDesiredAccess,
var int dwShareMode,
var int lpSecurityAttributes,
var int dwCreationDisposition,
var int dwFlagsAndAttributes,
var int hTemplateFile) {
const int call = 0;
var zString zstr; zstr = MEM_PtrToInst(_@s(lpFileName));
if(CALL_Begin(call)) {
CALL_IntParam(_@(hTemplateFile));
CALL_IntParam(_@(dwFlagsAndAttributes));
CALL_IntParam(_@(dwCreationDisposition));
CALL_IntParam(_@(lpSecurityAttributes));
CALL_IntParam(_@(dwShareMode));
CALL_IntParam(_@(dwDesiredAccess));
CALL_PtrParam(_@(zstr.ptr));
CALL__stdcall(CreateFileA);
call = CALL_End();
};
return CALL_RetValAsPtr();
};
func void WIN_WriteFile(
var int hFile,
var int lpBuffer,
var int nNumberOfBytesToWrite,
var int lpNumberOfBytesWritten,
var int lpOverlapped) {
const int call = 0;
if(CALL_Begin(call)) {
CALL_IntParam(_@(lpOverlapped));
CALL_IntParam(_@(lpNumberOfBytesWritten));
CALL_IntParam(_@(nNumberOfBytesToWrite));
CALL_IntParam(_@(lpBuffer));
CALL_IntParam(_@(hFile));
CALL__stdcall(WriteFile);
call = CALL_End();
};
};
func void WIN_ReadFile(
var int hFile,
var int lpBuffer,
var int nNumberOfBytesToRead,
var int lpNumberOfBytesRead,
var int lpOverlapped) {
const int call = 0;
if(CALL_Begin(call)) {
CALL_IntParam(_@(lpOverlapped));
CALL_IntParam(_@(lpNumberOfBytesRead));
CALL_IntParam(_@(nNumberOfBytesToRead));
CALL_IntParam(_@(lpBuffer));
CALL_IntParam(_@(hFile));
CALL__stdcall(ReadFile);
call = CALL_End();
};
};
func void WIN_CloseHandle(
var int hObject) {
const int call = 0;
if(CALL_Begin(call)) {
CALL_IntParam(_@(hObject));
CALL__stdcall(CloseHandle);
call = CALL_End();
};
};
func int WIN_GetFileSize(
var int hFile,
var int lpFileSizeHigh) {
const int call = 0;
if(CALL_Begin(call)) {
CALL_IntParam(_@(lpFileSizeHigh));
CALL_IntParam(_@(hFile));
CALL__stdcall(GetFileSize);
call = CALL_End();
};
return CALL_RetValAsInt();
};
/*--------------------
Konstanten
--------------------*/
const int _BIN_BufferLength = 32768;
/*--------------------
Variablen
--------------------*/
var int _bin_open; // Handle des Streams
var int _bin_mode; // Mode (Write/Read)
var int _bin_crsr; // Cursor
var string _bin_prefix; // Debug-Pr<50>fix
const int _bin_ccnt = 0; // Aktueller Content
const int _bin_clen = 0; // Aktuelle Streaml<6D>nge
/*--------------------
Hilfsfunktionen
--------------------*/
func void _BIN_Err(var string msg) {
var int r;
r = MEM_MessageBox(msg, _bin_prefix, MB_OK | MB_ICONERROR);
};
func int _BIN_nRunning() {
if(_bin_open) {
_BIN_Err("Der aktuelle Stream muss zuerst geschlossen werden bevor ein weiterer ge<67>ffnet werden kann.");
return 0;
};
return 1;
};
func int _BIN_Running() {
if(!_bin_open) {
_BIN_Err("Es ist kein Stream aktiv.");
return 0;
};
return 1;
};
func int _BIN_nMode(var int m) {
if(_bin_mode != m) {
_BIN_Err("Falscher Modus.");
return 0;
};
return 1;
};
func void _BIN_StreamLen(var int nlen) {
nlen += _bin_crsr;
if(nlen >= _bin_clen) {
var int len; len = _bin_clen;
var int pos; pos = MEM_StackPos.position;
if(nlen >= len) {
len = len<<1;
pos = MEM_StackPos.position;
};
_bin_ccnt = MEM_Realloc(_bin_ccnt, _bin_clen, len);
_bin_clen = len;
};
};
func int _BIN_EOF(var int len) {
if(_bin_crsr + len > _bin_clen) {
_BIN_Err("Das Ende des Streams wurde bereits erreicht.");
return 1;
};
return 0;
};
/*============
BinaryWriter
============*/
func int BW_NewFile(var string file) {
_bin_prefix = "BW_NewFile";
if(!_BIN_nRunning()) { return 0; };
_bin_open = WIN_CreateFile(file, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(_bin_open==-1) {
_bin_open = 0;
var string err; err = ConcatStrings(file, " - Datei konnte nicht erstellt werden. Fehlercode ");
_BIN_Err(ConcatStrings(err, IntToString(WIN_GetLastError())));
return 0;
};
if(!_bin_ccnt) {
_bin_clen = _BIN_BufferLength;
_bin_ccnt = MEM_Alloc(_bin_clen);
};
_bin_mode = 0;
_bin_crsr = 0;
return 1;
};
func void BW(var int data, var int length) {
_bin_prefix = "BW";
if(!_BIN_Running()||!_BIN_nMode(0)) { return; };
if(length < 1) { length = 1; };
if(length > 4) { length = 4; };
_BIN_StreamLen(4);
MEM_WriteInt(_bin_ccnt + _bin_crsr, data);
_bin_crsr += length;
};
func void BW_Int(var int data) { BW(data, 4); };
func void BW_Byte(var int data) { BW(data, 1); };
func void BW_Char(var string data) { BW(Str_GetCharAt(data, 0), 1); };
func void BW_Text(var string data) {
_bin_prefix = "BW_Text";
if(!_BIN_Running()||!_BIN_nMode(0)) { return; };
var zString zstr; zstr = MEM_PtrToInst(_@s(data));
if(!zstr.len) { return; };
_BIN_StreamLen(zstr.len+4);
MEM_CopyBytes(zstr.ptr, _bin_ccnt + _bin_crsr, zstr.len);
_bin_crsr += zstr.len;
};
func void BW_String(var string data) {
_bin_prefix = "BW_String";
if(!_BIN_Running()||!_BIN_nMode(0)) { return; };
BW(STR_Len(data), 4);
BW_Text(data);
};
func void BW_Bytes(var int dataPtr, var int length) {
_bin_prefix = "BW_Struct";
if(!_BIN_Running()||!_BIN_nMode(0)||!length||!dataPtr) { return; };
_BIN_StreamLen(length);
MEM_CopyBytes(dataPtr, _bin_ccnt + _bin_crsr, length);
_bin_crsr += length;
};
func void BW_NextLine() { BW(2573, 2); };
func void BW_Close() {
_bin_prefix = "BW_Close";
if(!_BIN_Running()||!_BIN_nMode(0)) { return; };
var int ptr;
WIN_WriteFile(_bin_open, _bin_ccnt, _bin_crsr, _@(ptr), 0);
WIN_CloseHandle(_bin_open);
_bin_open = 0;
};
/*============
BinaryReader
============*/
func int BR_OpenFile(var string file) {
_bin_prefix = "BR_OpenFile";
if(!_BIN_nRunning()) { return 0; };
_bin_open = WIN_CreateFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(_bin_open==-1) {
_bin_open = 0;
var string err; err = ConcatStrings(file, " - Datei konnte nicht ge<67>ffnet werden. Fehlercode ");
_BIN_Err(ConcatStrings(err, IntToString(WIN_GetLastError())));
return 0;
};
var int len; len = WIN_GetFileSize(_bin_open, 0);
if(len > _bin_clen) {
if (_bin_ccnt) { MEM_Free(_bin_ccnt); };
_bin_ccnt = MEM_Alloc(len);
_bin_clen = len;
};
var int ptr; ptr = MEM_Alloc(4);
WIN_ReadFile(_bin_open, _bin_ccnt, len, ptr, 0);
MEM_Free(ptr);
WIN_CloseHandle(_bin_open);
_bin_mode = 1;
_bin_crsr = 0;
return 1;
};
func int BR(var int length) {
_bin_prefix = "BR";
if(!_BIN_Running()||!_BIN_nMode(1)) { return 0; };
if(length < 1) { length = 1; };
if(length > 4) { length = 4; };
if(_BIN_EOF(length)) { return 0; };
var int b; b = MEM_ReadInt(_bin_ccnt + _bin_crsr);
if(length < 4) {
b = b&((256<<((length-1)<<3))-1);
};
_bin_crsr += length;
return b;
};
func int BR_Int() { return BR(4); };
func int BR_Byte() { return BR(1); };
func string BR_Char() {
var string str; str = "";
var zString zstr; zstr = MEM_PtrToInst(_@s(str));
zstr.ptr = MEM_Alloc(3)+1;
MEM_WriteByte(zstr.ptr, BR(1));
zstr.len = 1;
zstr.res = 1;
return str;
};
func string BR_Text(var int len) {
_bin_prefix = "BR_Text";
if(!_BIN_Running()||!_BIN_nMode(1)) { return ""; };
var string str; str = "";
var zString zstr; zstr = MEM_PtrToInst(_@s(str));
zstr.ptr = MEM_Alloc(len+2)+1;
MEM_CopyBytes(_bin_ccnt + _bin_crsr, zstr.ptr, len);
_bin_crsr += len;
zstr.len = len;
zstr.res = len;
return str;
};
func string BR_TextLine() {
var int s; s = _bin_crsr;
var int p; p = MEM_StackPos.position;
if(BR(2) != 2573) {
_bin_crsr -= 1;
MEM_StackPos.position = p;
};
var int e; e = _bin_crsr;
_bin_crsr = s;
var string str; str = BR_Text(e-s-2);
_bin_crsr = e;
return str;
};
func void BR_NextLine() {
var int p; p = MEM_StackPos.position;
if(BR(2) != 2573) {
_bin_crsr -= 1;
MEM_StackPos.position = p;
};
};
func string BR_String() {
return BR_Text(BR_Int());
};
func int BR_Bytes(var int length) {
var int ptr;
if(length <= 4) {
ptr = MEM_Alloc(4);
MEM_WriteInt(ptr, BR(length));
return ptr;
};
_bin_prefix = "BR_Bytes";
if(!_BIN_Running()||!_BIN_nMode(1)) { return 0; };
if(_bin_crsr + length > _bin_clen) {
_bin_Err("Die angegebene Struktur ist in dieser Datei nicht vollst<73>ndig enthalten.");
return 0;
};
ptr = MEM_Alloc(length);
MEM_CopyBytes(_bin_ccnt + _bin_crsr, ptr, length);
_bin_crsr += length;
return ptr;
};
func void BR_Close() {
_bin_prefix = "BR_Close";
if(!_BIN_Running()||!_BIN_nMode(1)) { return; };
_bin_open = 0;
};