diff --git a/src/engine/e_log.pas b/src/engine/e_log.pas
index 937730d5d4fd822260f19fbbe9d42861c8ef4192..dbe7b5dc2773f5881427c776d1d66f57e2835e7d 100644 (file)
--- a/src/engine/e_log.pas
+++ b/src/engine/e_log.pas
-(* Copyright (C) DooM 2D:Forever Developers
+(* Copyright (C) Doom 2D: Forever Developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
type
TWriteMode = (WM_NEWFILE, WM_OLDFILE);
- TRecordCategory = (MSG_FATALERROR, MSG_WARNING, MSG_NOTIFY);
+ TMsgType = (Fatal, Warning, Notify);
procedure e_InitLog (fFileName: String; fWriteMode: TWriteMode);
procedure e_SetSafeSlowLog (slowAndSafe: Boolean);
-procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True);
+procedure e_WriteLog (TextLine: String; RecordCategory: TMsgType; WriteTime: Boolean=True);
function DecodeIPV4 (ip: LongWord): string;
// start Write/WriteLn driver. it will write everything to cbuf.
procedure e_InitWritelnDriver ();
-procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
-procedure e_LogWriteln (const s: AnsiString; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
-
-
-var
- e_WriteToStdOut: Boolean = False;
+procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category: TMsgType=TMsgType.Notify; writeTime: Boolean=true; writeConsole: Boolean=true);
+procedure e_LogWriteln (const s: AnsiString; category: TMsgType=TMsgType.Notify; writeTime: Boolean=true);
+procedure e_WriteStackTrace (const msg: AnsiString);
implementation
uses
+ {$IFDEF ANDROID}
+ SDL2,
+ {$ENDIF}
conbuf, utils;
var
function DecodeIPV4 (ip: LongWord): string;
begin
+{$IFDEF FPC_LITTLE_ENDIAN}
Result := Format('%d.%d.%d.%d', [ip and $FF, (ip shr 8) and $FF, (ip shr 16) and $FF, (ip shr 24)]);
+{$ELSE}
+ Result := Format('%d.%d.%d.%d', [(ip shr 24), (ip shr 16) and $FF, (ip shr 8) and $FF, ip and $FF]);
+{$ENDIF}
+end;
+
+
+function consoleAllow (const s: String): Boolean;
+begin
+ Result := False;
+ if Pos('[Chat] ', s) = 1 then
+ Exit;
+ Result := True;
end;
-procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True);
+procedure e_WriteLog (TextLine: String; RecordCategory: TMsgType; WriteTime: Boolean=True);
begin
- e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime);
+ e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime, consoleAllow(TextLine));
end;
-procedure e_LogWriteln (const s: AnsiString; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
+procedure e_LogWriteln (const s: AnsiString; category: TMsgType=TMsgType.Notify; writeTime: Boolean=true);
begin
- e_LogWritefln('%s', [s], category, writeTime);
+ e_LogWritefln('%s', [s], category, writeTime, consoleAllow(s));
end;
ss: ShortString;
slen: Integer;
b: PByte;
+{$IFDEF ANDROID}
+ cstr: PChar;
+{$ENDIF}
begin
if (len < 1) then exit;
b := PByte(@buf);
+
+{$IFDEF ANDROID}
+ cstr := GetMem(len + 1);
+ for slen := 0 to len - 1 do
+ cstr[slen] := Chr(b[slen]);
+ cstr[len] := #0;
+ SDL_Log(cstr, []);
+ Dispose(cstr);
+{$ENDIF}
+
while (len > 0) do
begin
if (len > 255) then slen := 255 else slen := Integer(len);
end;
-procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
+procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category: TMsgType=TMsgType.Notify; writeTime: Boolean=true; writeConsole: Boolean=true);
procedure xwrite (const s: AnsiString);
begin
@@ -173,11 +198,11 @@ procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category:
end;
begin
- if driverInited and (length(fmt) > 0) then
+ if driverInited and (length(fmt) > 0) and writeConsole then
begin
case category of
- MSG_FATALERROR: write('FATAL: ');
- MSG_WARNING: write('WARNING: ');
+ TMsgType.Fatal: write('FATAL: ');
+ TMsgType.Warning: write('WARNING: ');
end;
formatstrf(fmt, args, conwriter);
writeln;
xlogPrefix := '';
if writeTime then begin xlogPrefix += '['; xlogPrefix += TimeToStr(Time); xlogPrefix += '] '; end;
case category of
- MSG_FATALERROR: xlogPrefix += '!!!';
- MSG_WARNING: xlogPrefix += '! ';
- MSG_NOTIFY: xlogPrefix += '***';
+ TMsgType.Fatal: xlogPrefix += '!!!';
+ TMsgType.Warning: xlogPrefix += '! ';
+ TMsgType.Notify: xlogPrefix += '***';
end;
xlogLastWasEOL := true; // to output prefix
xlogWantSpace := true; // after prefix
if xlogFileOpened then CloseFile(xlogFile);
xlogFileOpened := false;
FileName := fFileName;
- if (fWriteMode = WM_NEWFILE) then
+ if (fWriteMode = TWriteMode.WM_NEWFILE) then
begin
try
if FileExists(FileName) then DeleteFile(FileName);
end;
+{$I-}
+procedure e_WriteStackTrace (const msg: AnsiString);
+var
+ tfo: TextFile;
+begin
+ e_LogWriteln(msg, TMsgType.Fatal);
+ if (Length(FileName) > 0) then
+ begin
+ if xlogFileOpened then CloseFile(xlogFile);
+ xlogFileOpened := false;
+ AssignFile(tfo, FileName);
+ Append(tfo);
+ if (IOResult <> 0) then Rewrite(tfo);
+ if (IOResult = 0) then begin writeln(tfo, '====================='); DumpExceptionBackTrace(tfo); CloseFile(tfo); end;
+ end;
+end;
+
+
procedure e_DeinitLog ();
begin
if xlogFileOpened then CloseFile(xlogFile);