Nächste Seite: Terminal Aufwärts: Bibliotheksmoduln Vorherige Seite: Storage

# String

Das Modul `String` bietet Manipulationsprozeduren für Zeichenketten an. Alle Prozeduren hängen ein Nullzeichen an die resultierende Zeichenkette an. Ausserdem existieren Prüffunktionen, die es dem Programmierer erlauben, die fehlerfreie Ausführung der entsprechenden Prozeduren zu garantieren.

Dieses Modul stellt die wichtigsten Prozeduren zur Manipulation von Zeichenketten zur Verfügung. Alle entscheidenden Routinen wurden in Assembler programmiert, um möglichst kompakt und schnell zu sein. Die Kompaktheit einer solchen Implementation ist aus der Grösse der Objektdatei leicht ersichtlich.

Die Prozeduren verwenden wenn möglich Werteparameter. Dies ermöglicht die Übergabe konstanter Zeichenketten, was jedoch nicht immer effizient ist:

Entgegen der normalen Behandlung von Werteparametern werden von den übergebenen Zeichenketten keine lokalen Kopien erstellt. Dadurch erreicht man dieselbe Effizienz, die mit Variablen-Parametern erreicht werden kann. Bei den Prozeduren `Copy`, `CopyPos` und `Concat` kann dies aber zu Problemen führen, falls innerhalb der Zeichenkette umkopiert werden soll (siehe untenstehendes Beispiel).

Die Funktionen `Length` und `LLength` geben die Anzahl der Zeichen in `str` zurück. Ein abschliessendes Nullzeichen wird nicht gezählt. Es gilt also immer folgende Ungleichung:

Aufrufe von `CanCopyPos`, `CanCopy`, `CanConcat`, `CanInsert`, `CanCopyPart` und `CanConcatChar` ergeben immer den Wert `TRUE`, wenn die geforderte Prozedur so ausgeführt werden kann, dass in der Zielzeichenkette noch ein abschliessendes Nullzeichen als Abschlusszeichen Platz hat. Dies ist innerhalb der Modula-Umgebung keine Notwendigkeit, ist aber meist für Systemaufrufe zwingend.

Die Prozedur `CopyPos` kopiert die Zeichen aus `src` in die Zeichenreihe `dest`, wobei an der Stelle `dest[destPos]` begonnen wird. Die nachfolgenden Zeichen in `src` werden überschrieben. Ist die resultierende Zeichenkette zu lang, wird der überzählige Rest abgeschnitten.

Die Prozedur `Copy` überschreibt die Zeichenkette `dest` mit dem Inhalt von `src`. Es entspricht einem Aufruf von `CopyPos`, wobei `destPos` zu `0` gesetzt ist.

`Concat` hängt die Zeichenkette `src` an `dest` an. Überzählige Zeichen werden abgeschnitten.

`Compare` vergleicht die Zeichenkette `str1` mit der Zeichenkette `str2`. Ist das Resultat negativ, so ist `str2` kleiner, ist es Null, sind beide gleich, und ist es positiv, so ist `str2` grösser als `str1`. Der Absolutwert des zurückgegebenen Resultats gibt die Zeichenposition, an der sich die beiden Zeichenketten unterscheiden, wobei das erste Zeichen dem Wert eins entspricht.

Die Funktion `FirstPos` sucht nach dem ersten Vorkommen des Zeichens `ch` innerhalb der Zeichenkette `str`, dort startend bei der Position `from`. Zurückgegeben wird die Position des ersten Vorkommens, oder `noOccur` falls das Zeichen nicht gefunden wurde.

Die Funktion `LastPos` sucht nach dem letzten Vorkommen des Zeichens `ch` innerhalb der Zeichenkette `str`. Gesucht wird bis zur Position `to`. Zurückgegeben wird die Position des letzten Vorkommens, oder `noOccur` falls das Zeichen nicht gefunden wurde.

`CapString` wandelt alle Kleinbuchstaben der Zeichenkette `str` in die entsprechenden Grossbuchstaben um. Die Umwandlung entspricht derjenigen der Funktion `CAP()`, wird also nur für die Zeichen ,,`a```-,,`z``` ausgeführt.

Die Funktion `ANSICap` macht den Mangel der vordefinierten Funktion `CAP()` wett: sie wandelt alle Zeichen, also insbesondere auch Umlaute oder andere nationale Sonderzeichen in die entsprechenden Grossbuchstaben um.

In analoger Weise wandelt `ANSICapString` alle Zeichen der übergebenen Zeichenkette in ihre entsprechenden Grossbuchstaben um.

Die Funktion `Occurs` sucht nach dem Vorkommen von `token` in `str`, wobei dort mit dem Zeichen an der Position `from` begonnen wird. Der Resultatswert entspricht der Position des ersten gemeinsamen Zeichens, oder `last` falls `token` in `str` nicht enthalten ist. Ist der Parameter `caseSens` wahr, werden Gross- und Kleinbuchstaben als unterschiedlich betrachtet, sonst als gleichbedeutend. Davon ausgenommen sind alle Zeichen mit einem Ordinalwert grösser 127.

Die Prozedur `Insert` fügt die Zeichenkette `token` links des Zeichens an der Position `at` in `str` ein. Ist die resultierende Zeichenkette zu lang, um abgelegt zu werden, wird diese entsprechend abgeschnitten. Falls notwendig, d.h. falls `at > Length(str)`, werden der Zeichenkette `str` zuerst Leerzeichen angehängt. Ist `at = last`, wird `token` an `str` angehängt.

`Delete` löscht `length` Zeichen aus `str` heraus, beginnend an der Stelle `from`. Die dahinterliegenden Zeichen rutschen nach.

`CopyPart` kopiert eine Teilzeichenkette von `source` nach `str`. Die Teilzeichenkette beginnt an der Stelle `start` und ist `length` Zeichen lang. Zeichen, die hinter dem letzten Zeichen von `source` liegen, werden nicht berücksichtigt. Die sich ergebende Zeichenkette wird analog zur Prozedur `Insert` abgeschnitten, falls der Platz nicht ausreichen sollte.

`ComparePart` vergleicht die Teilzeichenkette von `str`, beginnend an der Stelle `start` und `length` Zeichen lang, mit der gegebenen Zeichenkette `token`. Ist das Resultat negativ, so ist `token` kleiner, ist es Null, sind beide gleich, und ist es positiv, so ist `token` grösser als die Teilzeichenkette. Der Absolutwert des zurückgegebenen Resultats gibt die Zeichenposition, an der sich die beiden Zeichenketten unterscheiden, wobei das erste Zeichen dem Wert eins entspricht.

Die Prozedur `ConcatChar` ermöglicht das einfache Anhängen eines einzelnen Zeichens `ch` an die Zeichenkette `str`.

`DeleteChar` löscht ein einzelnes Zeichen an der Position `pos` aus der Zeichenkette `str`. Es entspricht einen Aufruf `Delete(str, pos, 1)`.

Die beiden letzten Funktion erlauben schliesslich die Umwandlung von ,,Bstrings`` in normale Zeichenketten und umgekehrt. Bstrings sind Zeichenketten, die nicht mit einem Nullzeichen abgeschlossen werden, sondern im ersten Zeichen die Anzahl der gültigen Zeichen angeben. So schiebt die Prozedur `BStrToStr` alle Zeichen um eine Stelle nach links und ergänzt dafür die Zeichenkette um ein Nullzeichen, während `StrToBStr` alle Zeichen um eine Stelle nach hinten rückt und dafür die Länge im ersten Zeichen einträgt.

Nächste Seite: Terminal Aufwärts: Bibliotheksmoduln Vorherige Seite: Storage