Format der Indexdateien: Blöcke zu $0800 = 2048 Byte 4 Typen von Blöcken: Typ 1: Übersicht über Typ 2-Blöcke Typ 2: Übersicht über Typ 3-Blöcke Typ 3: Stichwörter mit Verweis auf Typ 4-Blöcke Typ 4: Verweise auf Datensatznummern Jede Datei enthält mindestens je einen Block der Typen 3 und 4. Typ 2 tritt fast immer auf, Typ 1 nur in sehr riesigen Dateien. Blockformat, in Pascal-ähnlichem Syntax beschrieben: TYPE blockhead=RECORD { 10 Bytes } usedbytes: _Word; count1: _Long; count2: _Long; END; TYPE block123=RECORD general: blockhead; parent: _Long; key_in_parent: _Word; prevkeys: _Long; { nur bei Typ 3 } numkeys: _Word; { 22 Bytes bis hier } keyptr: ARRAY[1..numkeys] OF _Word; keys: PACKED ARRAY OF RECORD String; misc; END; END; TYPE block4=RECORD general: blockhead; numentries: _Word; lengths: ARRAY[1..numentries] OF _Word; descriptors: ARRAY[1..numentries] OF RECORD mode: Byte; n: _Long; recs: CASE mode OF 0: ARRAY[1..n] OF RecNum; 32,64: ARRAY[1..n] OF Byte; END; END; END; Zu den einzelnen Einträgen: usedbytes: <= 2048 count1: - für den ersten Block eines Typs $FFFFFFFF - wird für die folgenden Blöcke des gleichen Typs in 2048er- Schritten ab 0 hochgezählt count2: - beim letzten Block eines jeden Typs $FFFFFFFF (leider nicht für den letzten Block der ganzen Datei) - wird für die vorangehenden Blöcke des gleichen Typs in 2048er- Schritten hochgezählt, ab 2048 parent: - verweist auf den übergeordneten Block zurück (in 2048er-Schritten ab 0) - ist $FFFFFFFF für den ersten Block der Datei key_in_parent: - Nummer des verweisenden Stichworts im übergeordneten Block (ab 0) - $FFFF im Typ 1-Block der Datei, sofern vorhanden prevkeys: - ist in Typ 1 und Typ 2 nicht vorhanden, stattdessen geht es dort sofort mit numkeys weiter, sehr praktisch :-( - ist Aufsummierung der numkeys aller vorangehenden Typ 3-Blöcke, darum kann der erste Typ 3 Block daran erkannt werden, daß hier 0 steht! numkeys: Anzahl Stichwörter in diesem Block keyptr: Zeiger auf diese Stichwörter, $0000 bezeichnet dabei das Byte direkt im Anschluß an die keyptr-Tabelle keys: - nullterminierter String (in caps) - ein Tri-Wort: Häufigkeit (>=1) - ein Tri-Wort: laufende Nummer in den Typ 4-Blöcken (etwas verschlüsselt: relative Adresse des Blocks, d. h. 0, 2048 etc., + Nummer des Deskriptors darin), bzw. bei Häufigkeit 1 direkt die Datensatznummer - bei Häufigkeit >1 noch ein Wort 0 - ein Langwort $FFFFFFFF lengths: - der 1. Eintrag steht für ein Stückchen, das vom letzten descriptor des vorigen Blocks herübergezogen werden mußte! descriptors: - man beachte, daß n in Abhängigkeit von mode mal Bytes, mal Recordnummern zählt, letztere können (abhängig vom Wert ART_NO_LEN in der .GLB-Datei) 2 oder 3 Byte lang sein - bei mode=0 enthält recs alle interessierenden Recordnummern als Worte, in aufsteigender Reihenfolge. Ist eine Nummer -1, so folgen zwei Recordnummern, die einen Bereich angeben - bei mode=32 enthält recs ein Bitmuster der gesamten Datei, gesetzte Bits entsprechen selektierten Records. - bei mode=64 ist das oben genannte Bitmuster außerdem noch gepackt. Dazu ist es in Blöcke aufgeteilt, die mit einem Byte anz beginnen, für anz>128 folgen (anz-128) ungepackte Bytes, sonst folgt ein Byte, das anz-mal wiederholt werden muß Bedeutung der Stichwörter in Typ 1/Typ 2-Blöcken: das letzte Stichwort in einem der folgenden Blöcke, auf soviele Buchstaben gekürzt, wie zur Unterscheidung vom ersten Stichwort des nächsten Blocks nötig ist.