Nächste Seite: Bedingte Compilation Aufwärts: Systemspezifische Besonderheiten Vorherige Seite: Initialisierte Variablen

## Tagitems

Die Version 2.0 des Betriebssystems macht intensiven Gebrauch von sogenannten ,,TagItems``.

Deren Deklaration gestaltet sich etwa folgendermassen:

`TYPE
TagItem = RECORD
tag:LONGCARD; (* Kennung, was data bedeuten soll *)
data:ADDRESS (* beliebiges Langwort *)
END;
TagItemPtr = POINTER TO ARRAY [0.. ??] OF TagItem;
`

Die Prozeduren erwarten also als Parameter einen Zeiger auf ein offenes Feld aus Langworten.

In Intuition gibt es z.B. neu die Prozedur:

`PROCEDURE OpenWindowTagList(
nw{R.A0}:NewWindowPtr;
tags{R.A1}: TagItemPtr;
):WindowPtr;
`

Mit Hilfe der Tags können mehr Parameter angegeben werden, als es in der `NewWindow`-Struktur möglich wäre. Hier kann sogar der Zeiger auf `NewWindow` `NIL` sein, womit dann alle Einstellungen über die Tags vorgenommen werden. Jede Eigenschaft -- Breite, Höhe, Flags, und so fort -- des neuen Fensters wir durch ein TagItem festgelegt. Nicht angegebene Eigenschaften bekommen einen Vorgabewert zugewiesen.

In gestaltet sich ein derartiger Aufruf im Gegensatz zur Sprache C sehr aufwendig, was an einem Beispiel demonstriert werden soll:

Um diesen Aufwand zu reduzieren, wurde eine neue Standard Prozedur implementiert:

> `SYSTEM.TAG(VAR x:AnyType;
> val {,val}:ADDRESS):ADDRESS;`

Der erste Parameter ist eine Variable beliebigen Typs, die als Speicherbereich zur Aufnahme der nachfolgenden Langworte dient. Sie muss gross genug sein, um alle Langworte aufnehmen zu können. Sie darf kein offener Feldparameter sein. Falls eine der Bedingungen nicht zutrifft, erfolgt eine Fehlermeldung.

Die nachfolgenden Parameter dürfen beliebigen skalaren Typs oder Mengen sein. Sie werden implizit in den Typ `ADDRESS` konvertiert, also je nach Typ vorzeichenlos oder vorzeichenbehaftet auf Langworte erweitert; Mengen sind in diesem Sinne vorzeichenlos. Der Typ `BOOLEAN` wird wie üblich gehandhabt, d.h. `FALSE` ergibt `ADDRESS(0)`, `TRUE` ergibt `ADDRESS(1)`, wie es das Betriebssystem auch erwartet. Im allgemeinen wird sowieso nur auf 0 getestet.

Der genaue Algorithmus ist:

      (*$ RangeChk:=FALSE OverflowChk:=FALSE *)
      IF valtyp=set THEN valtyp:=SHORTCARD|CARDINAL|LONGCARD END;
      buffer[i]:=ADDRESS(val);
      (*$ POP RangeChk POP OverflowChk *)

Der Rückgabewert der Prozedur `TAG` ist die Adresse der übergebenen Variablen.

Der Aufruf nach obigem Beispiel sieht hiermit nun so aus:

    VAR
      bufferForAllTags: ARRAY [0..50] OF LONGINT;
    ...
      win:=OpenWindowTagList(NIL,SYSTEM.TAG(bufferForAllTags,
            waLeft,              20,
            ...,                 ...,
            waPubScreenFallBack, TRUE,
            waTitle,             ADR("MyWindow"),
            waIDCMP,             IDCMPFlagSet{...},
            tagEnd)); (* niemals vergessen! *)

Obwohl diese Prozedur nur für die TagItems entwickelt wurde, kann sie natürlich auch anderweitig verwendet werden, z.B. um Arrays zu initialisieren oder auch für die Prozedur `Terminal.Format`. Hierbei muss aber bedacht werden, dass sie nur Langworte verarbeitet! Bei der Format-Prozedur muss also immer (bis auf `%s`) das ,,`l``` mit angegeben werden!

Nächste Seite: Bedingte Compilation Aufwärts: Systemspezifische Besonderheiten Vorherige Seite: Initialisierte Variablen