home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1994-05-14 | 10.8 KB | 208 lines |
- DEFINITION MODULE cstr;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (*****************************************************************************)
- (* Diese Prozeduren dienen der Bearbeitung von Strings nach 'C'-Konvention, *)
- (* d.h. sie sind IMMER (einzige Ausnahme: "strncpy()") mit einem Nullbyte *)
- (* abgeschlossen und werden durch einen Zeiger auf ihren ersten Buchstaben *)
- (* repraesentiert. Die Prozeduren fangen Zeiger mit dem Wert NULL (nicht NIL)*)
- (* ab. *)
- (* Laengenangaben werden zwar durch den Typ 'sizeT' repraesentiert, es *)
- (* duerfen aber nur Werte im Bereich 'StrRange' benutzt werden. *)
- (* --------------------------------------------------------------------------*)
- (* 05-Mai-94, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM types IMPORT
- (* TYPE *) int, sizeT, StrPtr, StrRange;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- PROCEDURE strlen ((* EIN/ -- *) str : StrPtr ): sizeT;
-
- (*---------------------------------------------------------------------------
- | Liefert die Laenge von <str>^. |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strcpy ((* EIN/ -- *) dst : StrPtr;
- (* EIN/ -- *) src : StrPtr );
-
- PROCEDURE strncpy ((* EIN/ -- *) dst : StrPtr;
- (* EIN/ -- *) src : StrPtr;
- (* EIN/ -- *) len : sizeT );
-
- (*---------------------------------------------------------------------------
- | Zuweisung: <dst>^ := <src>^. |
- | "strncpy()" kopiert im Gegensatz zu "strcpy()" genau <len> Zeichen |
- | nach <dst>^. Falls <src>^ kuerzer als <len> ist, wird <dst>^ mit Nullbytes|
- | auf <len> Zeichen aufgefuellt, falls jedoch <src>^ groesser oder gleich |
- | als <len> Zeichen ist, wird <dst>^ NICHT mit einem Nullbyte abgeschlossen!|
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strlwr ((* EIN/ -- *) str : StrPtr );
-
- PROCEDURE strupr ((* EIN/ -- *) str : StrPtr );
-
- (*---------------------------------------------------------------------------
- | Die Prozeduren wandeln <str>^ in Klein- bzw. Grossbuchstaben. |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strcat ((* EIN/ -- *) dst : StrPtr;
- (* EIN/ -- *) src : StrPtr );
-
- PROCEDURE strncat ((* EIN/ -- *) dst : StrPtr;
- (* EIN/ -- *) src : StrPtr;
- (* EIN/ -- *) len : sizeT );
-
- (*---------------------------------------------------------------------------
- | Konkatenation: <dst>^ := <dst>^ ++ <src>^. |
- | "strncat()" kopiert hoechstens <len> Zeichen von <src>^ ans Ende von |
- | <dst>^, <src>^ wird aber auf jeden Fall mit einem Nullbyte abgeschlossen. |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strcmp ((* EIN/ -- *) str1 : StrPtr;
- (* EIN/ -- *) str2 : StrPtr ): int;
-
- PROCEDURE strncmp ((* EIN/ -- *) str1 : StrPtr;
- (* EIN/ -- *) str2 : StrPtr;
- (* EIN/ -- *) len : sizeT ): int;
-
- PROCEDURE stricmp ((* EIN/ -- *) str1 : StrPtr;
- (* EIN/ -- *) str2 : StrPtr ): int;
-
- PROCEDURE strnicmp ((* EIN/ -- *) str1 : StrPtr;
- (* EIN/ -- *) str2 : StrPtr;
- (* EIN/ -- *) len : sizeT ): int;
-
- (*---------------------------------------------------------------------------
- | Vergleichen <str1>^ und <str2>^ zeichenweise miteinander. Wenn beide |
- | Strings gleich sind, wird Null geliefert; ist ein Zeichen aus <str1>^ |
- | kleiner als das entsprechende Zeichen in <str2>^, wird ein Wert kleiner |
- | Null geliefert; ist ein Zeichen groesser, wird ein Wert groesser Null |
- | geliefert. |
- | "strncmp()" vergleicht hoechstens <len> Zeichen miteinander. |
- | "str[n]icmp()" unterscheidet nicht zwischen Gross- und Kleinschreibung. |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strchr ((* EIN/ -- *) s : StrPtr;
- (* EIN/ -- *) c : CHAR ): StrPtr;
-
- PROCEDURE strrchr ((* EIN/ -- *) s : StrPtr;
- (* EIN/ -- *) c : CHAR ): StrPtr;
-
- (*---------------------------------------------------------------------------
- | Suchen das erste bzw. letzte Auftreten von <c> in <s>^. Falls <c> gefunden|
- | wird, wird ein Zeiger auf die Adresse in <s>^ geliefert, sonst NULL. |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strstr ((* EIN/ -- *) str : StrPtr;
- (* EIN/ -- *) pat : StrPtr ): StrPtr;
-
- (*---------------------------------------------------------------------------
- | Liefert die Adresse des ersten Auftretens von <pat>^ in <str>^, sonst NULL|
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strpbrk ((* EIN/ -- *) str : StrPtr;
- (* EIN/ -- *) brk : StrPtr ): StrPtr;
-
- (*---------------------------------------------------------------------------
- | Liefert die Adresse des ersten Auftretens eines Zeichens aus <brk>^ in |
- | <s>^, sonst NULL. |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE strerror ((* EIN/ -- *) err : int ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Liefert einen Zeiger auf einen statischen String, der den Fehlercode |
- | <err> kurz beschreibt. Die Funktion wird durch das Locale 'LC_MESSAGES' |
- | beeinflusst. |
- | Der Inhalt des Strings bleibt nur bis zum naechsten Aufruf der Funktion |
- | erhalten. Die Funktion ist nicht reentrant. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE strsignal ((* EIN/ -- *) sig : int ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Liefert einen Zeiger auf einen statischen String, der das Signal <sig> |
- | kurz beschreibt. Die Funktion wird durch das Locale 'LC_MESSAGES' |
- | beeinflusst. |
- | Der Inhalt des Strings bleibt nur bis zum naechsten Aufruf der Funktion |
- | erhalten. Die Funktion ist nicht reentrant. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE Token ((* EIN/ -- *) str : StrPtr;
- (* EIN/ -- *) stop : StrPtr;
- (* EIN/AUS *) VAR idx : StrRange;
- (* EIN/AUS *) VAR l1 : StrRange;
- (* EIN/AUS *) VAR l2 : StrRange;
- (* -- /AUS *) VAR tlen : StrRange;
- (* -- /AUS *) VAR token : StrPtr ): BOOLEAN;
-
- (*---------------------------------------------------------------------------
- | <str>^ wird in Token zerlegt, die jeweils durch eins der Zeichen aus |
- | <stop>^ begrenzt sind. Stehen zwei Trennzeichen hintereinander -- |
- | hoechstens durch Leerzeichen voneinander getrennt -- wird als Token ein |
- | Leerstring geliefert (<tlen> = 0). Steht am Anfang oder Ende von <str>^ |
- | ein Trennzeichen, ist das Token ebenfalls ein Leerstring. |
- | <token> zeigt auf den Beginn des jeweiligen Tokens in <str>^ ohne fueh- |
- | rende Leerzeichen. Ohne abschliessende Leerzeichen ist das Token <tlen> |
- | Zeichen lang. Das Token ist nicht durch ein Nullbyte abgeschlossen, da |
- | <str>^ nicht veraendert wird, es muss also auf jeden Fall <tlen> heran- |
- | gezogen werden, um das Token an einen ``sicheren Ort'' umzukopieren. |
- | Ist <str>^ vollstaendig durchsucht, wird als Funktionswert FALSE zurueck- |
- | geliefert, sodass "Token()" z.B. in einer WHILE-Schleife verwendet werden |
- | kann. In <idx>, <l1> und <l2> bewahrt die Prozedur Informationen auf, die |
- | sie fuer den naechsten Aufruf benoetigt; diese sind fuer den Benutzer ohne|
- | Belang und duerfen nicht veraendert werden. Vor dem ERSTEN Aufruf der |
- | Prozedur MUSS jedoch <idx> den Startindex erhalten, ab dem mit der Suche |
- | in <str>^ begonnen werden soll; <l1> MUSS auf Null gesetzt werden. Diese |
- | beiden Initialisierungen muessen genau einmal vor dem ersten Aufruf der |
- | Prozedur gemacht werden! |
- ---------------------------------------------------------------------------*)
-
-
- PROCEDURE AssignM2ToC ((* EIN/ -- *) REF strM2 : ARRAY OF CHAR;
- (* EIN/ -- *) sizeC : StrRange;
- (* EIN/ -- *) strC : StrPtr );
-
- (*---------------------------------------------------------------------------
- | Wandelt einen M2- in einen C-String um. |
- | <strC> muss auf einen Speicherbereich ausreichender Laenge zeigen. Es |
- | werden maximal <sizeC> Zeichen kopiert. Falls <strM2> groesser oder gleich|
- | <sizeC> Zeichen ist, werden genau <sizeC> Zeichen nach <strC> kopiert, |
- | aber NICHT mit einem Nullbyte abgeschlossen. Nur wenn <strM2> kuerzer als |
- | <sizeC> Zeichen ist, wird <strC> mit einem Nullbyte abgeschlossen. Diese |
- | Prozedur entspricht damit "strncpy()". |
- ---------------------------------------------------------------------------*)
-
- PROCEDURE AssignCToM2 ((* EIN/ -- *) strC : StrPtr;
- (* EIN/ -- *) max : StrRange;
- (* -- /AUS *) VAR strM2 : ARRAY OF CHAR );
-
- (*---------------------------------------------------------------------------
- | Wandelt einen C- in einen M2-String um. |
- | Es werden hoechstens <max> Zeichen von <strC>^ nach <strM2> kopiert. |
- | Wenn <max> gleich Null ist, wird versucht, <strC>^ komplett nach <strM2> |
- | zu kopieren. Falls <strM2> nicht gross genug ist, wird entsprechend |
- | gekuerzt. |
- ---------------------------------------------------------------------------*)
-
- END cstr.
-