next up previous
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:


\begin{example}
\begin{alltt}
\relax{} CONST
\\ halloWelt = Hallo Welt;
\\ (*
\\...
...
\\ Length(halloWelt) = SIZE(halloWelt)
\\ *)
\\ \relax \end{alltt}\end{example}

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:

\begin{displaymath}0 \le {\tt Length(\cmsltt string\/\tt )} \le
{\tt HIGH(\cmsltt string\/\tt )} + 1 \end{displaymath}

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.


\begin{note}
Da auch f\uml {u}r Werteparameter {\em keine\/} lokalen Kopien erst...
...er mit der ersten Kopieraktion \uml {u}berschrieben.
\end{example}\par\end{note}

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.


next up previous
Nächste Seite: Terminal Aufwärts: Bibliotheksmoduln Vorherige Seite: Storage
Claudio Nieder 2000-11-12