Nächste Seite: Verwendeter Ein- und Ausgabekanal Aufwärts: Bibliotheksmoduln Vorherige Seite: String

# Terminal

Das Bibliotheksmodul `Terminal` bietet einige grundlegende Prozeduren, um Zeichen und Zeichenketten von der Tastatur zu lesen und auf dem Bildschirm auszugeben.

Das Modul `Terminal` berücksichtigt die Unterschiede, die sich aus der Arbeitsumgebung ergeben. Wird das Programm, das das Modul `Terminal` importiert, vom CLI aufgerufen, läuft die Ein- und Ausgabe über das entsprechende CLI-Fenster oder eine vom Benutzer angegebene Umleitung (`Dos.Input`, `Dos.Output`). Wird dasselbe Programm von der Workbench aus gestartet, wird zur Ein- und Ausgabe ein Fenster geöffnet.

`Terminal` verwendet die Methode der gepufferten Ausgabe. Das bedeutet, die Zeichen werden nicht sofort ausgegeben, sondern zunächst in einem internen Puffer zwischengespeichert. Diese Methode erhöht die Geschwindigkeit beträchtlich, da weit weniger Dos-Aufrufe nötig sind. Der Inhalt des Puffers wird ausgegeben, wenn:

- Der Puffer voll ist (fasst 128 Zeichen).
- Ein Zeilenvorschub ausgegeben werden soll (`ASCII.eol`)
- Die Prozedur `Flush` aufgerufen wird
- Die Prozedur `Read` direkt oder indirekt über `ReadLn` oder `BusyRead` aufgerufen wird.
- Das Programm endet.

Die Variable `waitCloseGadget` kann vom Programmierer beliebig verändert werden. Ist sie bei Programmende `TRUE` (Standardeinstellung), und wurde das Programm von der Workbench gestartet, so erscheint im Fenster die Meldung

> `<< RETURN >>`

Das Programm wartet so lange, bis der Bediener die -Taste betätigt hat und schliesst erst dann das Fenster. Ist die Variable `FALSE`, wird das Fenster sofort geschlossen. Beim Start vom CLI hat `waitCloseGadget` keine Bedeutung.

Die Prozedur `Read` liest ein Zeichen ein. Am Ende der Eingabedatei wird das Zeichen `ASCII.eof` zurückgegeben. Dies ist nötig, um das Eingabeende bei Eingabeumleitung zu erkennen. Man beachte, dass von einem Konsolenfenster die Eingabe erst empfangen werden kann, wenn die Zeile mit abgeschlossen wurde!

In einem Konsolenfenster kann `ASCII.eof` durch [] an das Programm übergeben werden. Dies ist sinnvoll, um das Verhalten bei Dateiende zu testen oder zu simulieren.

Die Prozedur `BusyRead` ist aus Gründen der Kompatibilität zur ursprünglichen Definition von Terminal übernommen worden. Der Grundgedanke von `BusyRead` ist die Abfrage, ob im Eingabestrom Zeichen zur Übernahme bereitstehen. In der üblichen Umgebung eines Konsolenfensters ist dies aber nicht möglich. Diese Implementation liest das nächste Zeichen von der Eingabe und weist es der Variablen `ch` zu. Ist kein Zeichen im Eingabestrom vorhanden, erhält `ch` den Wert `ASCII.nul`. Somit ist es nicht möglich, das Dateiende einer interaktiven Datei (Eingabe von []) zu erkennen. Falls die Eingabe mittels Eingabeumlenkung von einer nicht-interaktiven Datei kommt, ist `BusyRead` identisch mit `Read`.

Die Prozedur `ReadLn` liest eine ganze Zeile vom Eingabestrom, d.h. bis das Zeichen `ASCII.eol` oder `ASCII.eof` erreicht wird. Die eingelesenen Zeichen werden in `str` abgelegt. Ist in der Variablen nicht genügend Platz vorhanden, wird der überschüssige Teil ignoriert und ist für das Programm verloren. Die Zeichenkette wird immer mit `ASCII.nul` abgeschlossen. Dürfen keine Zeichen verloren gehen, muss die Prozedur Read verwendet werden. Dem Parameter `len` wird die Länge der Zeichenkette zugewiesen.

`Write` gibt ein einzelnes Zeichen aus.

`WriteLn` gibt das Zeichen `ASCII.eol` aus. Dadurch wird der Cursor auf die erste Spalte der folgenden Zeile gesetzt.

Die Prozedur `WriteString` gibt die übergebene Zeichenkette aus. Die Zeichenkette muss nicht durch das Zeichen `ASCII.nul` abgeschlossen sein.

Die Prozedur `Format` benutzt die Funktion `RawDoFmt` der exec.library. Dabei wird ein Formatstring übergeben, der festlegt, wie die einzelnen Daten formatiert ausgegeben werden sollen, sowie die Adresse der Daten. Die Daten müssen von gleicher Anzahl und in der gleichen Reihenfolge im Speicher liegen wie die Formatangaben. Auch die Anzahl der jeweils belegten Bytes muss übereinstimmen. Diese speziellen Formatangaben beginnen immer mit einem ,,`%```-Zeichen, worauf einige optionale Angaben folgen, und enden mit einem speziellen Zeichen, das die Art der Interpretation der Daten bestimmt.

Die Daten legt man sinnvollerweise in einem Record ab7.6, bei einzelnen Objekten kann auch einfach deren Adresse angegeben werden.

Man sollte sich aber davor hüten, um beispielsweise eine einzelne Zeichenkette mit ,,`%s``` anzugeben, einfach `ADR(str)` zu schreiben. Richtig wäre `ADR(ADR(str))`. Da dies aber nicht möglich ist, sollte man hierzu die Prozedur `FormatS` benutzen!

Syntax der Formatangaben:

> `"%" ["-"] ["0"] [ min ["." max] ] ["l"] "d"|"x"|"c"|"s"`

- Das Zeichen ,,`-``` gibt an, dass der Inhalt linksbündig im angegebenen Feld ausgegeben wird.
- Das Zeichen ,,`0``` bewirkt, dass der Rest des Feldes mit Nullen statt mit Leerzeichen aufgefüllt wird. Da normalerweise rechtsbündig formatiert wird, ergeben sich dadurch also führende Nullen, bei linksbündiger Formatierung macht dies wohl wenig Sinn.
- ,,`min``` ist eine Dezimalzahl und bestimmt die Mindestbreite des Feldes, in dem der Wert ausgegeben wird. Wird kein Minimal-Wert angegeben, so wird das Feld nur so gross wie nötig.
- ,,`max``` ist ebenfalls eine Dezimalzahl, die -- durch einen Punkt von ,,`min``` getrennt -- die maximale Feldbreite angibt. Dieser Wert ist nur bei der Ausgabe von Zeichenketten (%s) sinnvoll und gibt somit an, wieviele Zeichen dieser Zeichenkette höchstens ausgegeben werden.
- ,,`l``` zeigt an, dass der Wert in den Daten als Langwort vorliegt. Andernfalls wird -- mit Ausnahme von Zeichenketten -- immer angenommen, der Wert bestehe aus zwei Byte.

`FormatNr` erlaubt die Ausgabe von berechneten Zahlen über die Format-Prozedur. Dadurch muss der Wert des Ausdrucks nicht in einer Variablen gespeichert werden.

Die Formatangabe für `FormatNr` muss immer ein ,,`l``` enthalten, da der Parameter der Prozedur vom Typ `LONGINT` ist; andernfalls erhält man falsche Ausgaben!

      FormatNr("Das waren %ld Punkte!",v1*4+v2);
      --> "Das waren 234 Punkte!"

Die Prozedur `FormatS` erleichtert die Ausgabe von variablen Zeichenketten innerhalb einer Meldung.

      FormatS("Heute ist %s, der",DayArr[today]);
      --> "Heute ist Dienstag, der"
      FormatS(" - %s\n",fileName);
      --> " - Terminal.mod"
          mit anschliessendem Zeilenvorschub.

`WriteInt` und `WriteHex` geben eine Zahl `x` in einem Feld der Mindest-Breite `ABS(n)` aus. Ist der Wert von `n` negativ, wird die Zahl linksbündig formatiert, andernfalls rechtsbündig. `WriteHex` gibt die Zahl hexadezimal mit führenden Nullen aus, `WriteInt` dezimal mit führenden (oder angehängten) Leerzeichen.

      WriteInt(10,4)
      --> "  10"
      WriteInt(10,-4)
      --> "10  "
      WriteHex(10,4)
      --> "000A"
      WriteHex(10,-4)
      --> "A   "
      WriteInt(10,0)
      --> "10"

Unterabschnitte

- Verwendeter Ein- und Ausgabekanal

Nächste Seite: Verwendeter Ein- und Ausgabekanal Aufwärts: Bibliotheksmoduln Vorherige Seite: String