PROGRAM PPdemo;

{
 **************************************
 ***   powerpacker.library - Demo   ***
 **************************************
 ***  Autor   : Marc Pahlenkämper   ***
 ***  Datum   : 15.7.92             ***
 ***  Sprache : Kickpascal V2.10    ***
 ***  Rechte  : Maxon Computer GmbH ***
 ***            Redaktion Kickstart ***
 **************************************
}

USES Exec;
{$incl "pp.lib","libraries/dos.h"}

 {--------- globale Variablen ---------}

 VAR FileLen,Err : long;
     CrLen       : long;
     FileStart   : ptr;
     CrInfo      : ptr;
     FHandle     : BPTR;
     FName       : String;
BEGIN
   IF FromWB THEN BEGIN
      Assign(input,'Con:20/10/600/180/PPDemo');
      Reset(input);
      Output:=Input;
   END;
   {-----------------------------------}
   {-      Öffnen der Library         -}
   OpenLib(PPBase,PPNAME,PPVERSION);
   Writeln("Demo zur Benutzung der powerpacker.library");

   {-----------------------------------}
   {- Eingabe und  Öffnen des Files   -}
   Write("Bitte Filename eingeben: ");
   Readln(FName);
   FHandle := DosOpen(FName,MODE_OLDFILE);
   IF FHandle=0 THEN BEGIN
      Writeln("Kann ",FName," nicht öffnen.");
      Halt(20);
   END;

   {-----------------------------------}
   {- Die folgenden beiden Zeilen er- -}
   {- mitteln die Länge des File      -}
   FileLen:=DosSeek(FHandle,0,OFFSET_END);
   FileLen:=DosSeek(FHandle,0,OFFSET_BEGINNING);

   {-----------------------------------}
   {-  Speicher für File allozieren   -}
   {- und Daten in den Speicher laden -}
   FileStart:=ptr(Alloc_Mem(FileLen+64,0));
   Err:=DosRead(FHandle,FileStart,FileLen);
   DosClose(FHandle);
   IF Err<>FileLen THEN BEGIN
      Writeln("Fehler beim Lesen von ",FName);
      Halt(20);
   END;

   {-----------------------------------}
   {-    Hier beginnt das Crunchen    -}
   CrInfo := ppAllocCrunchInfo(CRUN_GOOD,SPEEDUP_BUFFMEDIUM,NIL,NIL);
   IF CrInfo=NIL THEN BEGIN
      Writeln("Nicht genug Speicher");
      Halt(20);
   END;
   Writeln("Packe nun ",FName," mit Modus Medium..."#10);
   Writeln("Größe vor dem Packen : ",FileLen);
   CrLen := ppCrunchBuffer(CrInfo,FileStart,FileLen);
   ppFreeCrunchInfo(CrInfo);
   IF CrLen=PP_BUFFEROVERFLOW THEN BEGIN
      Writeln("Buffer overflow !");
      Halt(20);
   END;
   Writeln("Größe nach dem Packen: ",CrLen);

   {-----------------------------------}
   {-   Jetzt werden die gepackten    -}
   {-    Daten zwischengespeichert    -}
   Writeln;Writeln("Speichere das ganze zwischen...");
   FHandle:=DosOpen("ram:temp.pp",MODE_NEWFILE);
   IF FHandle=0 THEN BEGIN
      Writeln("Kann temporäres File nicht öffnen");
      Halt(20);
   END;
   IF NOT ppWriteDataHeader(FHandle,CRUN_GOOD,0,0) THEN BEGIN
      Writeln("Write Error");
      Halt(20);
   END;
   err:=DosWrite(FHandle,FileStart,CrLen);
   DosClose(FHandle);
   IF err<>CrLen THEN BEGIN
      Writeln("Write Error");
      Halt(20);
   END;
   Free_Mem(Long(FileStart),FileLen+64);
   FileStart:=NIL;
   Writeln("File jetzt zwischengespeichert"#10);

   {-----------------------------------}
   {-   nun entpacken wir das Ganze   -}
   {-     wieder mit ppLoadData()     -}
   Writeln("Das entcrunchen geht ganz leicht mit ppLoadData()...");
   err:=ppLoadData("ram:temp.pp",DECR_POINTER,0,^FileStart,^FileLen,NIL);
   IF err<>0 THEN BEGIN
      Writeln(ppErrorMessage(err));
      Halt(20);
   END;
   Writeln("Alles schon geschehen mit einem Funktions-Aufruf !");

   {-----------------------------------}
   {- Speicher muß mit FreeMem wieder -}
   {-       freigegeben werden        -}
   FreeMem(Long(FileStart),FileLen);
   IF FromWB THEN BEGIN
      Writeln("Bitte Return drücken");
      Readln(FName);
      Close(Input);
   END;
END;

