Program ChangeIO;

{[1;31m ======================================================================[0;31m

  ChangeIO.p ,  (C)16|06|1992 by "Diesel" Bernd Künnen

  Zur Benutzung im CLI bzw. in Scripts. Zweck des Ganzen ist es,
  das 640*200-CON-Fenster, das durch das Runtime-System des PCQ-
  Compilers bei einem WB-Start geöffnet wird, auf eine angenehmere
  Größe zu bringen. Und das geht so :

  ChangeIO Myproggy con:10/0/400/50/

  Der neue IO-Kanal darf dabei max. 16 Buchstaben haben. Angewendet
  werden kann das Ganze sowohl auf Objectcodes als auch auf fertige
  Programme.

	Allens chlor ?

							Diesel

[1;31m  ======================================================================[0;31m}


{$I "include:libraries/dos.i"}
{$I "include:utils/stringlib.i"}
{$I "include:utils/parameters.i"}

Const
	PCQ_IO : String = "CON:0/0/640/200/";

	Max    = 1024;

Type
	Memo    = Array[0..Max-1] Of Byte;
	MemoPtr = ^memo;

VAR
    i        : Short;
    x,
    pcq,
    old,
    anz,
    anz2     : Integer;
    myMem    : MemoPtr;
    buf      : Address;
    pFile,
    newIO    : String;
    MyHandle : FileHandle;



Procedure CleanExit(why: String; rt : Integer);
Begin
    IF Myhandle<>NIL then DosClose(MyHandle);

    If why<>NIL then begin
      writeln(why);
      writeln("\nUsage : ChangeIO Filename IOstring(max. 16 chars)\nE.g. changeIO NewProg raw:0/0/99/40/Hi\n");
      Delay(100);
    End;

    Exit(rt);

End;



BEGIN
  { --  ersma` Begrüßung, logo  -- }
  writeln("[1;33mChangeIO 1.0, (C)1992 by Diesel.[0;31m\n");

  { --jetzt die Arbeitsbuffers holen -- }
  pFile  := AllocString(100);
  newIO := AllocString(40);
  New(myMem);

  pcq:=strlen(PCQ_IO);

  { -- das 1. Arg. holen -- }
  GetParam(1,pFile);
  IF StrLen(pFile)=0 THEN Cleanexit("No parameters",5);

  { -- das 2. Arg holen -- }
  GetParam(2,newIO);
  IF StrLen(newIO)=0 THEN Cleanexit("No IO-String",5);
  IF strlen(newIO) > pcq then CleanExit("New IO-String 2 long!",5);

  { -- Jetzt das File öffnen -- }
  MyHandle:=DOSOpen(pFile,Mode_OldFile);
  IF MyHandle=NIL THEN CleanExit("Could not open file",10);

  { -- Suche den alten PCQ-IO-String -- }
  Repeat
    anz:=DOSRead(MyHandle,myMem,Max);

    IF anz>pcq Then
    Begin
      i:=-1;
      Repeat
	i:=i+1;
	buf:=Adr(myMem^[i]);
	x:=strcmp(PCQ_IO,buf);
      until (x=0) or (i=anz-pcq);
    End;

  Until (anz<Max) OR (x=0);

  If x<>0 then cleanexit("Could not find old IO-String",5);

  { -- Ersetze den alten durch den neuen IO-String -- }
  strcpy(buf,newIO);

  { -- geänderten Inhalt in die Datei schreiben -- }
  old:=Seek(MyHandle,-1*anz,Offset_Current);
  anz2:=DosWrite(MyHandle,myMem,anz);
  If anz2<>anz then CleanExit("Error on changing file",10);

  { -- Bye bye GTI -- }
  Cleanexit(NIL,0);

END.
