Foundry
2014-05-26 02:00:23
If I call this procedure too many times I get an out of memory error. I don't really know how to work with files very well so am I not freeing something?
// By Foundry
{==============================================================================]
Updates the FilteredStrings field of the TLog.
[==============================================================================}
procedure TLog.update();
var
StringArray: TStringArray;
Log, i, j, k, l, LineLimit: Integer;
size: LongInt;
EndPathName, MainString: String;
IndexesToDelete: TIntegerArray;
begin
case LogID of
EVENT: //Event Log
begin
EndPathName := '_Event.2014-05';
end;
PM: //Local Log
begin
EndPathName := 'PM__' + PMName + '.2014-05';
end;
COMBAT: //Combat Log
begin
EndPathName := 'DIRECTORY HERE'; // Not yet needed.
end;
end;
if not fileExists(WurmDirectory + 'Wurm\players\' + Charname +'\logs\' + EndPathName + '.txt') then
begin
writeLn('Failed to find the player folder ' + Charname + ' in directory ' + Wurmdirectory);
writeLn(WurmDirectory + 'Wurm\players\' + Charname +'\logs\' + EndPathName + '.txt');
if LogID = PM then
exit
else
terminateScript();
end;
Log := OpenFile(WurmDirectory + 'Wurm\players\' + Charname +'\logs\' + EndPathName + '.txt', True);
size := fileSize(Log);
ReadFileString(Log, MainString, FileSize(Log));
CloseFile(Log);
if size > 900000 then // If it is over 900000 characters
begin
writeLn('Event log is ' + toStr(size) + ' characters. Quitting Wurm and deleting it.');
quit(false);
wait(2000);
if deleteFile(WurmDirectory + 'Wurm\players\' + Charname +'\logs\' + EndPathName + '.txt') then
writeLn('File successfully deleted, please restart the game.')
else
writeLn('Couldn''t delete the file. Something is wrong...');
terminateScript();
end;
StringArray := StrLines(MainString);
if length(StringArray) <= 50 then
LineLimit := length(StringArray);
if LogID = EVENT then
begin
for i := length(StringArray) - LineLimit to high(StringArray) do
begin
if i < 0 then
continue;
for j := 0 to high(IgnoreNames) do
begin
if (pos(IgnoreNames[j], StringArray[i]) > 0) then
begin
setLength(IndexesToDelete, k + 1);
IndexesToDelete[k] := i;
inc(k);
break;
end;
end;
end;
StringArray.deleteIndexes(IndexesToDelete);
end;
if LinesToLog > length(StringArray) then
LineLimit := length(StringArray)
else
LineLimit := LinesToLog;
setLength(FilteredStrings, LineLimit + 1);
for i := 0 to LineLimit - 1 do
begin
l := high(StringArray) - LineLimit + i;
if l < 0 then
l := 0;
try
FilteredStrings[i] := StringArray[l];
except
writeLn(toStr(l) + ' broke it');
break;
end;
end;
setLength(FilteredStrings, i);
MainString := ''; // I don't know why but I tried this.
setLength(StringArray, 0); // and this.
end;
