X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_log.pas;h=7159c18445614beaff3ba4fc3f534df33d2cf474;hb=96433b6928f0d3de3a7bb69b97008b17bff22b58;hp=523c27f068de6ab6392058a12714edf8bda543ed;hpb=7f60063e21b5764c01cf86883d2e1808af8b04ef;p=d2df-sdl.git diff --git a/src/engine/e_log.pas b/src/engine/e_log.pas index 523c27f..7159c18 100644 --- a/src/engine/e_log.pas +++ b/src/engine/e_log.pas @@ -1,9 +1,8 @@ -(* 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 @@ -25,29 +24,32 @@ uses 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_DeinitLog (); -procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True); +procedure e_SetSafeSlowLog (slowAndSafe: Boolean); + +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); - - -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 @@ -62,58 +64,25 @@ begin end; -procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True); +function consoleAllow (const s: String): Boolean; begin - e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime); + Result := False; + if Pos('[Chat] ', s) = 1 then + Exit; + Result := True; end; -(* -var - LogFile: TextFile; - Prefix: ShortString = ''; - OutStr: String; + + +procedure e_WriteLog (TextLine: String; RecordCategory: TMsgType; WriteTime: Boolean=True); begin - if driverInited and (length(TextLine) > 0) then - begin - case RecordCategory of - MSG_FATALERROR: write('FATAL: '); - MSG_WARNING: write('WARNING: '); - end; - writeln(TextLine); - end; + e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime, consoleAllow(TextLine)); +end; - if FileName = '' then Exit; - Assign(LogFile, FileName); - try - if FileExists(FileName) then - Append(LogFile) - else - Rewrite(LogFile); - try - if FirstRecord then - begin - Writeln(LogFile, '--- Log started at '+TimeToStr(Time)+' ---'); - FirstRecord := False; - end; - case RecordCategory of - MSG_FATALERROR: Prefix := '!!!'; - MSG_WARNING: Prefix := '! '; - MSG_NOTIFY: Prefix := '***'; - end; - if WriteTime then - OutStr := '['+TimeToStr(Time)+'] '+Prefix+' '+TextLine - else - OutStr := Prefix+' '+TextLine; - Writeln(LogFile, OutStr); - if e_WriteToStdOut then - Writeln(OutStr); - finally - Close(LogFile); - end; - except // sorry - end; +procedure e_LogWriteln (const s: AnsiString; category: TMsgType=TMsgType.Notify; writeTime: Boolean=true); +begin + e_LogWritefln('%s', [s], category, writeTime, consoleAllow(s)); end; -*) // returns formatted string if `writerCB` is `nil`, empty string otherwise @@ -125,13 +94,26 @@ var 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); - Move(b^, ss[1], len); + Move(b^, ss[1], slen); ss[0] := AnsiChar(slen); write(ss); b += slen; @@ -146,6 +128,19 @@ var xlogPrefix: AnsiString; xlogLastWasEOL: Boolean = false; xlogWantSpace: Boolean = false; + xlogSlowAndSafe: Boolean = false; + + +procedure e_SetSafeSlowLog (slowAndSafe: Boolean); +begin + xlogSlowAndSafe := slowAndSafe; + if xlogSlowAndSafe and xlogFileOpened then + begin + CloseFile(xlogFile); + xlogFileOpened := false; + end; +end; + procedure logwriter (constref buf; len: SizeUInt); var @@ -164,12 +159,13 @@ begin while (len > 0) do begin slen := 0; - while (slen < len) and (slen < 255) and (b[slen] <> 13) and (b[slen] <> 10) do Inc(slen); + while (slen < len) and (b[slen] <> 13) and (b[slen] <> 10) do Inc(slen); + if (slen > 255) then slen := 255; // print string if (slen > 0) then begin if xlogWantSpace then begin write(xlogFile, ' '); xlogWantSpace := false; end; - Move(b^, ss[1], len); + Move(b^, ss[1], slen); ss[0] := AnsiChar(slen); write(xlogFile, ss); b += slen; @@ -179,16 +175,8 @@ begin // process newline if (len > 0) and ((b[0] = 13) or (b[0] = 10)) then begin - if (len > 1) and (b[0] = 13) and (b[1] = 10) then - begin - len -= 2; - b += 2; - end - else - begin - len -= 1; - b += 1; - end; + if (b[0] = 13) then begin len -= 1; b += 1; end; + if (len > 0) and (b[0] = 10) then begin len -= 1; b += 1; end; xlogLastWasEOL := false; writeln(xlogFile, ''); write(xlogFile, xlogPrefix); @@ -197,7 +185,7 @@ begin 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 @@ -206,11 +194,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; @@ -238,15 +226,21 @@ begin 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 formatstrf(fmt, args, logwriter); if not xlogLastWasEOL then writeln(xlogFile, '') else writeln(xlogFile, xlogPrefix); + if xlogSlowAndSafe and xlogFileOpened then + begin + CloseFile(xlogFile); + xlogFileOpened := false; + end; + //if fopened then CloseFile(xlogFile); end; @@ -256,7 +250,7 @@ begin 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); @@ -267,6 +261,24 @@ begin 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);