home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-10-23 | 14.2 KB | 290 lines |
- DEFINITION MODULE lib;
-
- (*****************************************************************************)
- (* Verschiedene Bibliotheksfunktionen *)
- (* --------------------------------------------------------------------------*)
- (* 12-Feb-93, Holger Kleinschmidt *)
- (*****************************************************************************)
-
- FROM SYSTEM IMPORT
- (* TYPE *) ADDRESS;
-
- FROM types IMPORT
- (* TYPE *) UNSIGNEDLONG, SIGNEDLONG;
-
- (*=========================== "rand()" ======================================*)
-
- CONST
- RANDMAX = 7FFFFFFFH;
-
- (*================ "lfind()", "bsearch()", "qsort()" ========================*)
-
- TYPE
- CompareProc = PROCEDURE ((* par1 *) ADDRESS,
- (* par2 *) ADDRESS ): INTEGER;
-
- (* par1^ < par2^ ==> < 0
- * par1^ = par2^ ==> = 0
- * par1^ > par2^ ==> > 0
- *
- *
- * Beispiel:
- *
- * PROCEDURE cmp ((* EIN/ -- *) op1,
- * (* EIN/ -- *) op2 : ADDRESS ): INTEGER;
- * VAR ptr1,
- * ptr2 : POINTER TO REAL; (* je nach Elementtyp *)
- *
- * BEGIN
- * ptr1 := op1;
- * ptr2 := op2;
- *
- * IF ptr1^ < ptr2^ THEN
- * RETURN(-1);
- * ELSIF ptr1^ > ptr2^ THEN
- * RETURN(1);
- * ELSE
- * RETURN(0);
- * END;
- * END cmp;
- *)
-
- (*========================= "fnmatch()" =====================================*)
-
- CONST
- ESCAPECHAR = 134C;
- INVERTCHAR = '!';
-
-
- TYPE
- FNMFlag = (
- fnmPATHNAME, (* Wildcards ('*', '?') und Mengen ('[...]') ``matchen''
- * nicht ueber Verzeichnisgrenzen ('/') hinweg -> (Datei)Namen
- * werden durch '/.../' begrenzt.
- *)
- fnmPERIOD, (* Wildcards ('*', '?') und Mengen ('[...]') ``matchen''
- * kein fuehrendes '.' bei (Datei)Namen.
- *)
- fnmNOESCAPE (* Das Zeichen 'ESCAPECHAR' hebt nicht die Spezialbedeutung
- * von '*', '?', '[', ']' (und ESCAPECHAR) auf.
- *)
- );
-
- FNMFlags = PACKEDSET OF FNMFlag;
-
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
- (* nicht POSIX: *)
- PROCEDURE bcopy ((* EIN/ -- *) src : ADDRESS;
- (* EIN/ -- *) dst : ADDRESS;
- (* EIN/ -- *) len : UNSIGNEDLONG );
-
- (*--------------------------------------------------------------------------
- | Kopiert <len> Bytes von <src> nach <dst>. Die Bereiche duerfen sich |
- | ueberlappen. Wenn beide Adressen gerade oder ungerade sind, wird beson- |
- | ders schnell kopiert. |
- --------------------------------------------------------------------------*)
-
- (* nicht POSIX: *)
- PROCEDURE bzero ((* EIN/ -- *) dst : ADDRESS;
- (* EIN/ -- *) len : UNSIGNEDLONG );
-
- (*--------------------------------------------------------------------------
- | Setzt <len> Bytes ab Adresse <dst> auf Null. |
- --------------------------------------------------------------------------*)
-
- (* nicht POSIX: *)
- PROCEDURE bswap ((* EIN/ -- *) blk1 : ADDRESS;
- (* EIN/ -- *) blk2 : ADDRESS;
- (* EIN/ -- *) len : UNSIGNEDLONG );
-
- (*--------------------------------------------------------------------------
- | Tauscht <len> Bytes ab Adresse <blk1> bzw. <blk2> gegeneinander aus. |
- | Die Speicherbereiche duerfen sich nicht ueberlappen. |
- --------------------------------------------------------------------------*)
-
-
- (* nicht POSIX: *)
- PROCEDURE lfind ((* EIN/ -- *) key : ADDRESS;
- (* EIN/ -- *) base : ADDRESS;
- (* EIN/ -- *) nelems : UNSIGNEDLONG;
- (* EIN/ -- *) size : UNSIGNEDLONG;
- (* EIN/ -- *) compare : CompareProc ): ADDRESS;
-
- (*--------------------------------------------------------------------------
- | Prozedur fuer lineare Suche in einem Feld aus gleichartigen, direkt hin- |
- | tereinander angeordneten Elementen (ACHTUNG: Fuellbytes muessen bei der |
- | Angabe von <size> beruecksichtigt werden!). |
- | Falls das gesuchte Element gefunden wird, ist der Funktionswert dessen |
- | Adresse im Feld, sonst wird NULL zurueckgeliefert. |
- | |
- | <base> ist die Adresse des ersten Elementes des Feldes |
- | <nelems> ist die Anzahl der Feldelemente |
- | <size> ist die Groesse eine Feldelementes in Bytes |
- | <compare> ist die Vergleichsfunktion (siehe Def. 'CompareProc') |
- | <key> ist die Adresse des gesuchten Elementes |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE bsearch ((* EIN/ -- *) key : ADDRESS;
- (* EIN/ -- *) base : ADDRESS;
- (* EIN/ -- *) nelems : UNSIGNEDLONG;
- (* EIN/ -- *) size : UNSIGNEDLONG;
- (* EIN/ -- *) compare : CompareProc ): ADDRESS;
-
-
- (*--------------------------------------------------------------------------
- | Prozedur fuer binaere Suche in einem Feld aus gleichartigen, direkt hin- |
- | tereinander angeordneten Elementen. Die Elemente muessen gemaess der |
- | verwendeten Vergleichsprozedur aufsteigend sortiert sein. |
- | Falls das gesuchte Element gefunden wird, ist der Funktionswert dessen |
- | Adresse im Feld, sonst wird NULL zurueckgeliefert. |
- | |
- | Bedeutung der Parameter siehe: "lfind()" |
- --------------------------------------------------------------------------*)
-
-
-
-
- PROCEDURE qsort ((* EIN/ -- *) base : ADDRESS;
- (* EIN/ -- *) nelems : UNSIGNEDLONG;
- (* EIN/ -- *) size : UNSIGNEDLONG;
- (* EIN/ -- *) compare : CompareProc );
-
- (*--------------------------------------------------------------------------
- | Prozedur fuer Sortierung nach dem ``Quicksort''-Algorithmus in einem Feld|
- | aus gleichartigen, direkt hintereinander angeordneten Elementen. |
- | Die Sortierung ist nicht stabil, d.h. es ist nicht garantiert, dass die |
- | relative Ordnung von Elementen mit gleichem (Neben-)Schluessel erhalten |
- | bleibt. |
- | Stackbelastung: O(log(nelems)) |
- | |
- | Bedeutung der Parameter siehe: "lfind()" |
- --------------------------------------------------------------------------*)
-
-
-
-
- (* nicht POSIX: *)
- PROCEDURE ltoa ((* EIN/ -- *) n : SIGNEDLONG;
- (* -- /AUS *) VAR str : ARRAY OF CHAR;
- (* EIN/ -- *) base : CARDINAL );
-
- PROCEDURE ultoa ((* EIN/ -- *) n : UNSIGNEDLONG;
- (* -- /AUS *) VAR str : ARRAY OF CHAR;
- (* EIN/ -- *) base : CARDINAL );
-
- (*--------------------------------------------------------------------------
- | Wandeln den Wert <n> in eine Stringrepraesentation um. Es wird die kuer- |
- | zest moegliche Darstellung gewaehlt, d.h. es werden keine fuehrenden |
- | Nullen geschrieben, und bei positiven Zahlen wird kein Leerzeichen oder |
- | ein Plus verwendet. <base> bestimmt die Basis der Zahlendarstellung und |
- | muss innerhalb von [2..36] liegen; liegt <base> ausserhalb, wird Zehn |
- | angenommen. |
- --------------------------------------------------------------------------*)
-
-
- (* nicht POSIX: *)
- PROCEDURE strtol ((* EIN/ -- *) REF str : ARRAY OF CHAR;
- (* -- /AUS *) VAR end : CARDINAL;
- (* EIN/ -- *) base : CARDINAL ): SIGNEDLONG;
-
- PROCEDURE strtoul ((* EIN/ -- *) REF str : ARRAY OF CHAR;
- (* -- /AUS *) VAR end : CARDINAL;
- (* EIN/ -- *) base : CARDINAL ): UNSIGNEDLONG;
-
- (*--------------------------------------------------------------------------
- | Wandelt die Stringrepraesentation <str> einer Zahl in ihre interne Dar- |
- | stellung, die als Funktionswert geliefert wird. Die Stringrepraesentation|
- | muss der weiter unten angegebenen Syntax genuegen. |
- | |
- | <end> ist der Index des ersten fuer die Umwandlung nicht mehr benutzten |
- | Zeichens; dieser kann auch ausserhalb von <str> liegen, falls die Reprae-|
- | sentation durch das Stringende begrenzt wurde. |
- | <base> ist die gewuenschte Basis der Zahl. gueltige Werte sind 0 und 2 |
- | bis 36; andere Werte werden zu Null korrigiert. Ist <base> gleich Null, |
- | wird die Basis der Repraesentation entnommen, d.h. es koennen Binaer-, |
- | Oktal- und Sedezimalzahlen erkannt werden; ist der Zahl keine Basis vor- |
- | angestellt, wird eine Dezimalzahl erwartet. Ist <base> gleich 2, 8 oder |
- | 16, so kann trotzdem zusaetzlich eine Basis der Zahl vorangestellt sein, |
- | sie wird aber ignoriert, solange sie dem Wert von <base> entspricht. |
- | |
- | Wenn bei der Umwandlung ein Ueberlauf auftritt, wird als Funktionswert |
- | der jeweils groesst/kleinstmoegliche Wert zurueckgeliefert und 'errno' |
- | auf 'ERANGE' gesetzt. |
- | |
- | Die Syntax: |
- | |
- | whole ::= {SPACE}['+'|'-']('%'bin)|('$'hex)|('0'octHexNull)|(num) |
- | Stringende|keine gueltige Ziffer |
- | octHexNull ::= ('x'|'X')hex|oct| e (* leer, fuer die NULL *) |
- | bin ::= bindigit{bindigit} |
- | oct ::= octdigit{octdigit} |
- | hex ::= hexdigit{hexdigit} |
- | num ::= digit{digit} |
- | bindigit ::= '0'|'1' |
- | octdigit ::= bindigit|'2'..'7' |
- | hexdigit ::= octdigit|'8'|'9'|'a'..'f'|'A'..'F' |
- | digit ::= hexdigit|'g'..'z'|'G'..'Z' |
- --------------------------------------------------------------------------*)
-
-
-
- (* nicht POSIX: *)
- PROCEDURE strerror ((* EIN/ -- *) errnum : INTEGER;
- (* -- /AUS *) VAR errstr : ARRAY OF CHAR );
-
- (*--------------------------------------------------------------------------
- | Wandelt den Fehlercode <errnum> in einen kurzen Fehlertext <errstr>. |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE rand ( ): UNSIGNEDLONG;
-
- PROCEDURE srand ((* EIN/ -- *) seed : UNSIGNEDLONG );
-
- (*--------------------------------------------------------------------------
- | "rand()" liefert eine Pseudozufallszahl im Bereich [0..MAXRAND]. Die |
- | jeweils letzte Zufallszahl wird gemerkt und als Ausgangspunkt fuer die |
- | Berechnung der naechsten verwendet. Mit "srand()" kann dieser Ausgangs- |
- | punkt explizit gesetzt werden, sodass reproduzierbare Zahlenfolgen moeg- |
- | lich sind. Zu Programmstart wird als Ausgangswert die eins verwendet. |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE fnmatch ((* EIN/ -- *) REF str : ARRAY OF CHAR;
- (* EIN/ -- *) REF pat : ARRAY OF CHAR;
- (* EIN/ -- *) flags : FNMFlags ): BOOLEAN;
-
- (*-------------------------------------------------------------------------
- | Testet, ob das Muster <pat> auf den String <str> passt. |
- | Die folgenden Zeichen haben im Muster eine Spezialbedeutung: |
- | |
- | '*': steht fuer beliebig viele (auch Null) Zeichen |
- | '?': steht fuer genau ein beliebiges Zeichen |
- | '[': Leitet eine Mengendefinition ein, d.h das korrespondierende|
- | Zeichen im String muss ein Zeichen aus dieser Menge sein. |
- | '-': Innerhalb einer Mengendefinition wird ein Bereich durch das|
- | unmittelbar davor und unmittelbar dahinter stehende Zeichen|
- | gebildet. Das korrespondierende Zeichen kann innerhalb und |
- | einschliesslich der Grenzen liegen. |
- | Als erstes oder letztes Element einer Menge steht es fuer |
- | sich selbst. |
- | ']': Beendet die Definition einer Menge; als erstes Element |
- | einer Menge oder ohne ein vorausgehendes, noch nicht abge- |
- | schlossenes '[', steht es fuer sich selbst. |
- | INVERTCHAR : Als erstes Zeichen einer Mengendefinition bedeutet es, dass|
- | das korrespondierende Zeichen im String KEIN Zeichen aus |
- | dieser Menge sein darf. |
- | ESCAPECHAR : Hebt die Sonderfunktion der obigen Zeichen und auch von |
- | sich selbst auf; die uebrigen Zeichen werden nicht beein- |
- | flusst. |
- | |
- | Mit <flags> kann die Interpretation der obigen Spezialzeichen beein- |
- | flusst werden (siehe Definition von 'FNMFlag'). |
- -------------------------------------------------------------------------*)
-
- END lib.
-