X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fengine%2Fe_log.pas;h=3a8d0adc2900ef25e1f3fb3ea896c54320504e3e;hb=ae4069ace642a386dd8651379dbfb0e6330d915b;hp=472bd5762544126e0b60850d48eaf5ae6b7d7bac;hpb=25fd929e92f5bc8dcedc5a39385cf6286b9b91c6;p=d2df-sdl.git diff --git a/src/engine/e_log.pas b/src/engine/e_log.pas index 472bd57..3a8d0ad 100644 --- a/src/engine/e_log.pas +++ b/src/engine/e_log.pas @@ -1,4 +1,19 @@ -{$MODE DELPHI} +(* 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *) +{$INCLUDE ../shared/a_modes.inc} {$R-} { $DEFINE CBLOG} unit e_log; @@ -14,13 +29,19 @@ type procedure e_InitLog (fFileName: String; fWriteMode: TWriteMode); +procedure e_DeinitLog (); + +procedure e_SetSafeSlowLog (slowAndSafe: Boolean); + procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True); -function DecodeIPV4 (ip: LongWord): string; +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; @@ -29,8 +50,7 @@ var implementation uses - conbuf; - + conbuf, utils; var FirstRecord: Boolean; @@ -45,65 +65,178 @@ end; procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True); +begin + e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime); +end; + + +// returns formatted string if `writerCB` is `nil`, empty string otherwise +//function formatstrf (const fmt: AnsiString; args: array of const; writerCB: TFormatStrFCallback=nil): AnsiString; +//TFormatStrFCallback = procedure (constref buf; len: SizeUInt); + +procedure conwriter (constref buf; len: SizeUInt); +var + ss: ShortString; + slen: Integer; + b: PByte; +begin + if (len < 1) then exit; + b := PByte(@buf); + while (len > 0) do + begin + if (len > 255) then slen := 255 else slen := Integer(len); + Move(b^, ss[1], slen); + ss[0] := AnsiChar(slen); + write(ss); + b += slen; + len -= slen; + end; +end; + + var - LogFile: TextFile; - Prefix: ShortString = ''; - OutStr: String; + xlogFile: TextFile; + xlogFileOpened: Boolean = false; + 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 + ss: ShortString; + slen: Integer; + b: PByte; begin - if driverInited and (length(TextLine) > 0) then + if (len < 1) then exit; + b := PByte(@buf); + if xlogLastWasEOL then begin - case RecordCategory of + write(xlogFile, xlogPrefix); + xlogLastWasEOL := false; + xlogWantSpace := true; + end; + while (len > 0) do + begin + slen := 0; + 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], slen); + ss[0] := AnsiChar(slen); + write(xlogFile, ss); + b += slen; + len -= slen; + continue; + end; + // process newline + if (len > 0) and ((b[0] = 13) or (b[0] = 10)) then + begin + 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); + end; + end; +end; + + +procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true); + + procedure xwrite (const s: AnsiString); + begin + if (Length(s) = 0) then exit; + logwriter(PAnsiChar(s)^, Length(s)); + end; + +begin + if driverInited and (length(fmt) > 0) then + begin + case category of MSG_FATALERROR: write('FATAL: '); - MSG_WARNING: write('WARNINIG: '); + MSG_WARNING: write('WARNING: '); end; - writeln(TextLine); + formatstrf(fmt, args, conwriter); + writeln; end; - if FileName = '' then Exit; + if (FileName = '') then exit; - Assign(LogFile, FileName); - try - if FileExists(FileName) then - Append(LogFile) - else - Rewrite(LogFile); + if not xlogFileOpened then + begin + AssignFile(xlogFile, FileName); 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); + if FileExists(FileName) then Append(xlogFile) else Rewrite(xlogFile); + xlogFileOpened := true; + except // sorry + exit; end; - except // sorry end; + + if FirstRecord then + begin + writeln(xlogFile, '--- Log started at ', TimeToStr(Time), ' ---'); + FirstRecord := false; + end; + + xlogPrefix := ''; + if writeTime then begin xlogPrefix += '['; xlogPrefix += TimeToStr(Time); xlogPrefix += '] '; end; + case category of + MSG_FATALERROR: xlogPrefix += '!!!'; + MSG_WARNING: xlogPrefix += '! '; + MSG_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; procedure e_InitLog (fFileName: String; fWriteMode: TWriteMode); begin - FileName := fFileName; - if fWriteMode = WM_NEWFILE then - begin - try - if FileExists(FileName) then DeleteFile(FileName); - except // sorry - end; - end; - FirstRecord := True; + if xlogFileOpened then CloseFile(xlogFile); + xlogFileOpened := false; + FileName := fFileName; + if (fWriteMode = WM_NEWFILE) then + begin + try + if FileExists(FileName) then DeleteFile(FileName); + except // sorry + end; + end; + FirstRecord := true; +end; + + +procedure e_DeinitLog (); +begin + if xlogFileOpened then CloseFile(xlogFile); + xlogFileOpened := false; end; @@ -136,11 +269,6 @@ begin wcr := (tf.userData[udWasCR] <> 0); while count > 0 do begin - if wcr then - begin - wcr := false; - if buf^ = #10 then continue; - end; // look for some special char ep := buf; f := 0; @@ -156,6 +284,7 @@ begin end; if f > 0 then begin + wcr := false; cbufPutChars(buf, f); Inc(buf, f); Dec(count, f); @@ -184,9 +313,12 @@ begin {$IFDEF CBLOG} writeln(stderr); {$ENDIF} - wcr := (ch = #13); - x := 0; - cbufPut(#10); + if not wcr or (ch <> #10) then + begin + wcr := (ch = #13); + x := 0; + cbufPut(#10); + end; continue; end; end; @@ -253,5 +385,5 @@ end; begin - e_InitWritelnDriver(); + //e_InitWritelnDriver(); end.