Programmieren mit Pascal & Delphi

Pascal

Organisation der Programme

Beim Entwurf der Programme wurde großer Wert auf Strukturierung und Übersicht gelegt. So ist es ohne weiteres möglich, weitere Optionen und/oder Komprimiermethoden einzubauen. Die Dateien ChipArc.PAS und DeArc.PAS beinhalten jeweils nur die Programmteile, die zur Steuerung der Abläufe benötigt werden. Support-Routinen, die von beiden Programmen genutzt werden, befinden sich in der Includedatei ARCUTIL.PAS.

Die übrigen UNITs sind jeweils korrespondierend aufgegliedert:

- ARCDEF.PAS/DEARCDEF.PAS
grundlegende Operationen auf Archive

- ARCPACK/DEARCUNP
Lesen- und Schreiben von Bytes mit CRC-Check und Packing/UnPacking

- ARCLZW/DEARCLZW
Routinen für LZW-Algorithmus

- DEARCUSQ
Huffman-Routinen für Dekomprimierung (diese Methode wird von ChipArc nicht unterstützt)

 

Besondere Aufmerksamkeit verdient das Handling des Archiv-Updates. Wird ein bereits vorhandenes Archiv erneut geöffnet, um neue Dateien aufzunehmen, muß eine temporäre Archivdatei erzeugt wer­den. Es sind drei Zustände denkbar:

1. aufzunehmende Datei noch nicht im Archiv
2. aufzunehmende Datei ist bereits im Archiv
3. im Archiv vorhandene Dateien ist nicht aufzunehmen

In allen Fällen muß das neu entstehende Archiv alphabetisch geordnet sein. ChipArc stellt dies in drei Schritten sicher:

1.         Suche per FindFirst/FindNext alle neuen Dateien
            Sortiere die Liste
            Markiere alle Dateien als zu komprimieren (COMPRESS)
2.         Markiere alle in der Liste und im Archiv vorhandenen Dateien als UPDATEN
            Markiere alle übrigen Dateien im Archiv als COPYARC und füge sie der Liste an
3.         Liste neu sortieren

In der vorliegenden Version unterscheidet ChipArc nicht zwischen COMPRESS und UPDATEN. Die betreffende Datei wird immer neu komprimiert. Als COPYARC markierte Dateien werden vom Archiv in die temporäre Datei kopiert. Zum Schluß wird das alte Archiv gelöscht und die temporäre Datei um­benannt.

Aus der genanten Vorgehensweise resultieren zwei Einschränkungen für das Archiv:

1. Vorübergehend muß die doppelte Datenmenge auf der Platte Platz haben.
2. Maximal dürfen 2048 Dateien in ein Archiv gepackt werden. Mehr kann die Struktur nicht ver­kraften.

 

Aufgrund eigener Erfahrung - oder sollte ich besser sagen Verärgerung - wurde in DeArc ein völlig neues Feature eigebaut. Auf Wunsch testet das Programm, ob auch wirklich alle Dateien auf das Lauf­werk bzw. den Pfad passen. Kritisch ist hierbei die Tatsache, daß DeArc die bereits vorhandenen Da­teien, die möglicherweise überschrieben werden sollen, nicht berücksichtigen kann. Es wird also immer von der freien Diskkapazität ausgegangen, obwohl die tatsächlich benötigte Speichermenge vielleicht kleiner ist, weil einige Dateien überschrieben werden. Ein Ausweg aus diesem Dilema wäre eine Kop­pelung der Directory-Testmethode mit den Flags -R für Überschreiben bzw. -S für überspringen. Bei Überspringen gilt die freie Diskkapazität, bei Überschreiben wird gegengerechnet: Bedarf := (Benötigte Bytes) - (auf Disk von der Datei belegte Bytes). Da dies aber eine eigenwillige Beschrän­kung ist, wurde das Feature nicht implementiert. Wer möchte, kann es gern nachholen. Es sind nur we­nige Zeilen nötig.

 

SelfExtracting

Lüften wir jetzt das Geheimnis der selbstextrahierenden Archive. Der dafür zuständige Code sieht ganz harmlos aus:

Blockwrite(temparcfile, @sfx^, SfxExelen);

SFX ist eine als EXTERNAL deklarierte Prozedur hinter der sich nichts anderes als eine mittels BINOBJ konvertierte spezielle DeArc-Version verbirgt. Speziell deshalb, weil beim SelfExtracting eine Reihe von Schalter überflüssig werden (man könnte sie natürlich auch drinlassen) und deshalb zu­gunsten der kleineren Codegröße entfernt wurden. Außerdem ist der Name des Archivs fest vorgege­ben: nämlich der Name der EXE-Datei.

Preisfrage: Woher weiß die EXE-Datei wie sie heißt? Antwort: Ab DOS 3.x über ParamStr(0). Dorthin kopiert Turbo-Pascal für DOS-Versionen ab 3.x aus dem Environment das Verzeichnis, aus dem das Programm gestartet wurde. Das selbstentpackende Programm öffnet also seine auf der Diskette lie­gende Kopie und betrachtet sich fortan als Archiv.

Da das Programm SFX.EXE in der vorliegenden Version 15888 Bytes lang ist, beginnt das eigentliche Archiv aber erst ab Byte 15889. Zu Beginn der Dekomprimierung muß also ein arc_seek(15888, 0) durchgeführt werden, damit der Dateizeiger auf dem Start der komprimierten Daten steht. Von da an läuft alles ab wie in DeArc.

Vorsicht: Bei Änderungen der Datei SFX.EXE muß die Konstante SfxExeLen in DeArc und ChipArc auf die korrekte Dateilänge geändert werden!


Anhang:

Abb. 1: Der LZW-Stack

 

 

Eingabe: a b a b c b a b a b a a a a a a a d

Stack:

 

STRING-Tabelle          CODE-Tabelle


Eingaben:               Prefix  Suffix  code

#0     -   0             #0           -   0
      ...                            ...
#255   - 255             #255         - 255
Reset  - 256             Reset        - 256
-------------------       ----------------------
ab     - 257              97     b    - 257
ba     - 258              98     a    - 258
abc    - 259             257     c    - 259
cb     - 260              99     b    - 260
bab    - 261             258     b    - 261
baba   - 262             261     a    - 262
aa     - 263              97     a    - 263
aaa    - 264             263     a    - 264
aaaa   - 265             264     a    - 265
ad     - 266              97     d    - 266





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-02-22 22:11:32 von textarchiv.alojado.de