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 werden. 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 umbenannt.
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 verkraften.
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 Laufwerk bzw. den Pfad passen. Kritisch ist hierbei die Tatsache, daß DeArc die bereits vorhandenen Dateien, 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 Koppelung 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änkung ist, wurde das Feature nicht implementiert. Wer möchte, kann es gern nachholen. Es sind nur wenige 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 zugunsten der kleineren Codegröße entfernt wurden. Außerdem ist der Name des Archivs fest vorgegeben: 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 liegende 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