Program TextFX;

Uses Crt,DOS;

{$I style.inc}
{$I upstr.inc}

Const
  VNM='1.00';
  VDT='19-Feb-95';

Var
  IFN,OFN:String;
  IFS,OFS:Text;
  MDE:String[2];
  LCT:Integer;

Procedure About;
Begin
  Style(0,1);
  Style(1,1);
  Style(3,1);
  WriteLn('TextFX v',VNM,' by Zebedee ',#$a9,'1995 Carnage (',VDT,')');
  Style(0,1);
  WriteLn(#$a,'Usage: ',ParamStr(0),' <infile> <outfile> <mode>',#$a);
  WriteLn('Where <mode> is one of...');
  WriteLn('     -b => Backwards print each line in the same order');
  WriteLn('     -r => Reverse print each line backwards');
  WriteLn('     -w => Reverse print each line and each character');
  WriteLn('     -1 => Misc effect 1');
  WriteLn('     -d => Star Trek door closing effect');
  WriteLn('     -s => Stutter each char but print normally (BIG filesize increase!)',#$a);
  WriteLn('Write to: Zebedee, 6 Bridgefield, Ottery St Mary, East Devon, EX11 1HL, UK');
  Halt(20);
  Write('$VER: TextFX v1.00 (19-Feb-95) ');
End;

Procedure GetParams;
Begin
  If ParamStr(1)='?' Then About;
  If ParamCount<>3 Then
  Begin
    WriteLn('Usage: ',ParamStr(0),' <infile> <outfile> <mode>');
    Halt(20);
  End;
  IFN:=ParamStr(1);
  OFN:=ParamStr(2);
  If UpStr(IFN)=UpStr(OFN) Then
  Begin
    WriteLn(ParamStr(0),': Both filenames cannot match');
    Halt(20);
  End;
  MDE:=UpStr(ParamStr(3));
  If (MDE<>'-B') and (MDE<>'-R') and (MDE<>'-S') and (MDE<>'-W') and (MDE<>'-D') and (MDE<>'-1') Then
  Begin
    WriteLn(ParamStr(0),': Invalid mode');
    Halt(20);
  End;
End;

Procedure Backwards;
Var
  CTR,LCT:Integer;
  TXT:Packed Array [1..29] Of String[80];
Begin
  Write(OFS,#$c);
  LCT:=1;
  While not Eof(IFS) Do
  Begin
    ReadLn(IFS,TXT[LCT]);
    Inc(LCT);
  End;
  For CTR:=LCT DownTo 1 Do
    WriteLn(OFS,#$9b,CTR,';1H',TXT[CTR]);
  Write(OFS,#$9b,LCT-1,';1H');
End;

Procedure Misc1;
Var
  CTR,CTC,CTD,LCT:Integer;
  TXT:Packed Array [1..29] Of String[80];
Begin
  Write(OFS,#$c);
  LCT:=1;
  While not Eof(IFS) Do
  Begin
    ReadLn(IFS,TXT[LCT]);
    Inc(LCT);
  End;
  For CTR:=1 To LCT Do
    For CTC:=Length(TXT[CTR]) To 80 Do
      TXT[CTR]:=TXT[CTR]+' ';
  For CTR:=1 To LCT-1 Do
  Begin
    CTC:=1;
    For CTD:=79 DownTo 39 Do
    Begin
      Write(OFS,#$9b,CTR,';',CTD,'H',TXT[CTR][CTD]);
      Write(OFS,#$9b,CTR,';',CTC,'H',TXT[CTR][CTC]);
      Inc(CTC);
    End;
  End;
End;

Procedure StarTrek;
Var
  CTR,CTC,CTD,LCT:Integer;
  TXT:Packed Array [1..29] Of String[80];
Begin
  Write(OFS,#$c);
  LCT:=1;
  While not Eof(IFS) Do
  Begin
    ReadLn(IFS,TXT[LCT]);
    Inc(LCT);
  End;
  For CTR:=1 To LCT Do
    For CTC:=Length(TXT[CTR]) To 80 Do
      TXT[CTR]:=TXT[CTR]+' ';
  CTC:=1;
  For CTD:=79 DownTo 40 Do
  Begin
    For CTR:=1 To LCT-1 Do
    Begin
      Write(OFS,#$9b,CTR,';',CTD,'H',TXT[CTR][CTD]);
      Write(OFS,#$9b,CTR,';',CTC,'H',TXT[CTR][CTC]);
    End;
    Inc(CTC);
  End;
End;

Procedure ReverseAll;
Var
  CTC,LCT,CTR,TXL:Integer;
  TXT:Packed Array [1..29] Of String[80];
  TXB:String[80];
  DMY:Char;
Begin
  Write(OFS,#$c);
  LCT:=1;
  While not Eof(IFS) Do
  Begin
    ReadLn(IFS,TXT[LCT]);
    Inc(LCT);
  End;
  Dec(LCT);
  For CTR:=LCT DownTo 1 Do
  Begin
    TXB:=TXT[CTR];
    For CTC:=Length(TXB) DownTo 1 Do
      Write(OFS,#$9b,CTR,';',CTC,'H',TXB[CTC]);
  End;
  Write(OFS,#$9b,LCT,';1H');
End;

Procedure Reverse;
Var
  LCT,TXL,CTR:Integer;
  TXT:String;
Begin
  LCT:=1;
  Write(OFS,#$c);
  While not Eof(IFS) Do
  Begin
    ReadLn(IFS,TXT);
    TXL:=Length(TXT);
    If TXL>0 Then
    Begin
      For CTR:=TXL DownTo 1 Do
        Write(OFS,#$9b,LCT,';',CTR,'H',TXT[CTR]);
      WriteLn(OFS,'');
    End Else
      WriteLn(OFS,'');
    Inc(LCT);
  End;
End;

Procedure ConvertFile;
Var
  TXT:String[80];
  WHY:Integer;
Begin
  If MDE='-S' Then
  Begin
    WriteLn(ParamStr(0),': Mode not yet implemented');
    Halt(20);
  End;
  Assign(IFS,IFN);
  ReSet(IFS);
  If IOResult<>0 Then
  Begin
    WriteLn(ParamStr(0),': Cannot locate infile');
    Halt(20);
  End;
  Assign(OFS,OFN);
  ReWrite(OFS);
  If IOResult<>0 Then
  Begin
    WriteLn(ParamStr(0),': Cannot create outfile');
    Close(IFS);
    Halt(20);
  End;
  Write(UpStr(ParamStr(0)),':',MDE[2],':Processing file...');
  WHY:=WhereY;
  LCT:=0;
  While not Eof(IFS) Do
  Begin
    ReadLn(IFS,TXT);
    Inc(LCT);
  End;
  Close(IFS);
  If LCT>28 Then
  Begin
    GotoXY(1,WHY);
    WriteLn(ParamStr(0),': Too many lines!    ');
    Close(OFS);
    Halt(20);
  End;
  Assign(IFS,IFN);
  Reset(IFS);
  GotoXY(1,WHY);
  Write(UpStr(ParamStr(0)),':',MDE[2],':Converting file...');
  WHY:=WhereY;
  If MDE='-B' Then Backwards;
  If MDE='-R' Then Reverse;
  If MDE='-W' Then ReverseAll;
  If MDE='-1' Then Misc1;
  If MDE='-D' Then StarTrek;
  WriteLn('done');
  Close(IFS);
  Close(OFS);
End;

Begin
  GetParams;
  ConvertFile;
End.