program Xtools_Convert;

{ Wandelt mit neuen Windows-Xtools erstellte Diagrammfiles in ein }
{ zu der Version 3.0 kompatibles Format um.                       }
{ Hierzu muá der Firmenname um 7 Zeichen verkuerzt werden.        }
{ Bei dieser Gelegenheit wird jedoch gleich der alte Firmenname   }
{ eingetragen. }

uses crt;

const Firmenname:String[15] = ('AiD Nuernberg '+#10);

type Zeile = String[254];
     Str80 = STring[80];

var diain:    File;
    diaout:   File;
    fil:      File;
    Infile:   String[80];
    Outfile:  String[80];
    Bakfile:  String[80];
    Tempfile: String[80];
    Dateibuffer: Array[1..2048] of byte;
    Numread:  word;
    count:    integer;
    testbyte: byte;


Function File_Exists (Filename:Str80):Boolean;
{********************************************}
var Testfile: File;
begin
  Assign (Testfile,Filename);
  {$I-}
  Reset (Testfile);
  {$I+}
  File_Exists:=(IOResult=0);
end;


Function OpenFile(Dateiname: Str80):boolean;
{*********************************************}
begin
  assign(diain,Dateiname);
  {$I-}
  reset(diain,1);
  {$I+}
  if IOResult <> 0 then
    begin
      writeln('File nicht vorhanden...');
      Sound(1000);
      Delay(500);
      NoSound;
      OpenFile := false;
    end
  else OpenFile := true;
end;


Function Check_Firmenname: boolean;
{*********************************}
{ True, wenn File nicht umgewandelt werden muss... }
var check: boolean;
begin
  check := true;
  for count := 1 to 15 do
    begin
      testbyte := ord(Firmenname[count]);
      if Dateibuffer[count] <> testbyte then check := false;
    end;
  Check_Firmenname := check;
end;

Procedure Korrigiere_Bytezaehler;
{*******************************}
var teststring: string[10];
var fehlercode: integer;
var zwiwert: integer;
begin
  teststring[0] := #7;  { Stringlaenge manuell eintragen }
  for count := 1 to 7 do  { Bytezaehler aus Buffer holen }
    begin
      teststring[count] := chr(Dateibuffer[152+count]); { Bytes 153-160 }
      { eigentlich 152-159, jedoch faengt Buffer mit 1 und nicht mit 0 an ! }
    end;
  val(teststring,zwiwert,fehlercode);
  zwiwert := zwiwert - 7;
  str(zwiwert:7,teststring);
  for count := 1 to 7 do  { korrigierten Bytezaehler-Wert eintragen }
    begin
      Dateibuffer[152+count] := ord(teststring[count]);
    end;
end;


begin
  clrscr;
  writeln ('ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿');
  writeln ('³                                                   ³');
  writeln ('³          X T O O L S - K O N V E R T E R          ³');
  writeln ('³                                                   ³');
  writeln ('³           (C)1995 by Ing. Peter ULLRICH           ³');
  writeln ('³                                                   ³');
  writeln ('ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´');
  writeln ('³                                                   ³');
  writeln ('³     Parameter: Diagrammfilename (ohne .DIA !)     ³');
  writeln ('³                                                   ³');
  writeln ('³   Korrigiert das fehlerhafte Diagrammfileformat   ³');
  writeln ('³    der neueren XTOOLS-Versionen und „ndert den    ³');
  writeln ('³     Firmennamen wieder auf "AiD Nuernberg" um.    ³');
  writeln ('³                                                   ³');
  writeln ('ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ');
  writeln;
  writeln;
  Infile := '';
  Tempfile := 'temp_dia.dia';
  if paramstr(1) <> ''
    then begin
           Infile := Paramstr(1);
           Outfile := Infile + '.din';
           Bakfile := Infile + '.bak';
           Infile := Paramstr(1) + '.dia';
         end
    else begin
           write('Enter Diagrammfilename (no extension): ');
           readln(Infile);
           Outfile := Infile + '.din';
           Bakfile := Infile + '.bak';
           Infile := Infile + '.dia';
         end;
  If OpenFile(Infile) then
    begin
      assign(diaout,Tempfile);
      rewrite(diaout,1);   { Recordsize = 1 }
      writeln;
      blockread(diain,Dateibuffer,189,Numread);
      Korrigiere_Bytezaehler;  { Anzahl der Bytes wird korrigiert }
      blockwrite(diaout,Dateibuffer,189);
      for count := 1 to 15 do
        begin
          testbyte := ord(Firmenname[count]);
          Dateibuffer[count]:=testbyte;
        end;
      blockwrite(diaout,Dateibuffer,15); { alten Firmennamen einsetzen }
      blockread(diain,Dateibuffer,22,Numread); { neuen Firmennamen lesen }
                                               { und wegwerfen... }
      If Check_Firmenname = true  { Prueft, ob umgewandelt werden muá... }
       then
        begin
         writeln('Das File ',Infile,' muá nicht korrigiert werden !');
         Close(diain);
         Close(diaout);
         Erase(diaout);  { Temporaerfile wieder loeschen }
         Halt;  { Programmende }
        end
       else
        begin
         writeln('Das File ',Infile,' muá korrigiert werden !');
         writeln;
         write('Umwandeln...Korrektur...');
         blockread(diain,Dateibuffer,2048,Numread);
         repeat
           write('.');
           blockwrite(diaout,Dateibuffer,Numread);
           blockread(diain,Dateibuffer,2048,Numread);
         until Numread = 0;
         writeln;
         writeln('Umwandlung abgeschlossen !');
         Close(diain);
         If File_Exists(Bakfile) then { eventuell vorhandenes Bakfile loeschen }
           begin
             Assign(fil,Bakfile);
             Erase(fil);
           end;
         Rename(diain,Bakfile);
         writeln('Originalfile wurde in ',Bakfile,' umbenannt !');
         Close(diaout);
         Rename(diaout,Infile);
        end;
    end;
end.
