diff --git a/utilities/mtype.pas b/utilities/mtype.pas new file mode 100644 index 0000000..45b66ca --- /dev/null +++ b/utilities/mtype.pas @@ -0,0 +1,165 @@ +Program MTYPE; + +{$I M_OPS.PAS} + +// Add screen pause option +// Add delay option similar to Mystic +// Processing formatting MCI codes, etc + +Uses + m_Output, + m_Strings, + m_DateTime, + m_Term_Ansi; + +Var + Screen : TOutput; + Terminal : TTermAnsi; + Buffer : Array[1..4096] of Char; + dFile : File; + Ext : String[4]; + Code : String[2]; + dRead : LongInt; + Old : Boolean; + Str : String; + A : Word; + Ch : Char; + Done : Boolean; + + Function GetChar : Char; + Begin + If A = dRead Then Begin + BlockRead (dFile, Buffer, SizeOf(Buffer), dRead); + A := 0; + If dRead = 0 Then Begin + Done := True; + Buffer[1] := #26; + End; + End; + + Inc (A); + GetChar := Buffer[A]; + End; + + Function Ansi_Color (B : Byte) : String; + Var + S : String; + Begin + S := ''; + Ansi_Color := ''; + + Case B of + 00: S := #27 + '[0;30m'; + 01: S := #27 + '[0;34m'; + 02: S := #27 + '[0;32m'; + 03: S := #27 + '[0;36m'; + 04: S := #27 + '[0;31m'; + 05: S := #27 + '[0;35m'; + 06: S := #27 + '[0;33m'; + 07: S := #27 + '[0;37m'; + 08: S := #27 + '[1;30m'; + 09: S := #27 + '[1;34m'; + 10: S := #27 + '[1;32m'; + 11: S := #27 + '[1;36m'; + 12: S := #27 + '[1;31m'; + 13: S := #27 + '[1;35m'; + 14: S := #27 + '[1;33m'; + 15: S := #27 + '[1;37m'; + End; + + If B in [00..07] Then B := (Screen.TextAttr SHR 4) and 7 + 16; + + Case B of + 16: S := S + #27 + '[40m'; + 17: S := S + #27 + '[44m'; + 18: S := S + #27 + '[42m'; + 19: S := S + #27 + '[46m'; + 20: S := S + #27 + '[41m'; + 21: S := S + #27 + '[45m'; + 22: S := S + #27 + '[43m'; + 23: S := S + #27 + '[47m'; + End; + + Ansi_Color := S; + End; + + Procedure OutStr (S: String); + Begin + Terminal.ProcessBuf(S[1], Length(S)); + End; + +Begin + WriteLn; + + If ParamCount <> 1 Then Begin + WriteLn('MTYPE [filename]'); + Exit; + End; + + Assign (dFile, ParamStr(1)); + Reset (dFile, 1); + + If IoResult <> 0 Then Begin + WriteLn('MTYPE: File ' + ParamStr(1) + ' not found.'); + Exit; + End; + + Screen := TOutput.Create(True); + Terminal := TTermAnsi.Create(Screen); + + Done := False; + A := 0; + dRead := 0; + Ch := #0; + + While Not Done Do Begin + Ch := GetChar; + + If Ch = #26 Then + Break + Else + If Ch = #10 Then Begin + Terminal.Process(#10); + End Else + If Ch = '|' Then Begin + Code := GetChar; + Code := Code + GetChar; + + If Code = '00' Then OutStr(Ansi_Color(0)) Else + If Code = '01' Then OutStr(Ansi_Color(1)) Else + If Code = '02' Then OutStr(Ansi_Color(2)) Else + If Code = '03' Then OutStr(Ansi_Color(3)) Else + If Code = '04' Then OutStr(Ansi_Color(4)) Else + If Code = '05' Then OutStr(Ansi_Color(5)) Else + If Code = '06' Then OutStr(Ansi_Color(6)) Else + If Code = '07' Then OutStr(Ansi_Color(7)) Else + If Code = '08' Then OutStr(Ansi_Color(8)) Else + If Code = '09' Then OutStr(Ansi_Color(9)) Else + If Code = '10' Then OutStr(Ansi_Color(10)) Else + If Code = '11' Then OutStr(Ansi_Color(11)) Else + If Code = '12' Then OutStr(Ansi_Color(12)) Else + If Code = '13' Then OutStr(Ansi_Color(13)) Else + If Code = '14' Then OutStr(Ansi_Color(14)) Else + If Code = '15' Then OutStr(Ansi_Color(15)) Else + If Code = '16' Then OutStr(Ansi_Color(16)) Else + If Code = '17' Then OutStr(Ansi_Color(17)) Else + If Code = '18' Then OutStr(Ansi_Color(18)) Else + If Code = '19' Then OutStr(Ansi_Color(19)) Else + If Code = '20' Then OutStr(Ansi_Color(20)) Else + If Code = '21' Then OutStr(Ansi_Color(21)) Else + If Code = '22' Then OutStr(Ansi_Color(22)) Else + If Code = '23' Then OutStr(Ansi_Color(23)) Else + Begin + Terminal.Process('|'); + Dec (A, 2); + Continue; + End; + End Else + Terminal.Process(Ch); + End; + + Close (dFile); + + Terminal.Free; + Screen.Free; +End.