Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ regexp(5) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

regcmp(1)

regex(3)

regcomp(3C)

regcmp(3G)

regexpr(3G)

expressions(5)

regex(5)

regexp(5)                                                         regexp(5)

NAME
     regexp: compile, step, advance, loc1, loc2, locs - Routinen zum Über-
     setzen und Mustervergleich von regulären Ausdrücken

SYNTAX
     #include <regexp.h>

     #define INIT declarations
     #define GETC(void) getc code
     #define PEEKC(void) peekc code
     #define UNGETC(void) ungetc code
     #define RETURN(ptr) return code
     #define ERROR(val) error code

     int    advance(const char *string, const char *expbuf);

     char  *compile(char *instring, char *expbuf, const char *endbuf,
                   int eof);

     int    step(const char *string, const char *expbuf);

     extern char *loc1, *loc2, *locs;

BESCHREIBUNG
     Bei diesen Funktionen handelt es sich um allgemeine Routinen zum
     Mustervergleich von regulären Ausdrücken, die in Programmen verwendet
     werden, die Mustervergleiche von regulären Ausdrücken durchführen.
     Diese Funktionen sind in der Include-Datei <regexp.h> definiert.

     Die Funktionen step und advance führen den Mustervergleich mit einer
     Zeichenkette und einem übersetzten regulären Ausdruck als Eingabe
     durch.

     Die Funktion compile nimmt als Eingabe einen regulären Ausdruck, wie
     er unten definiert wird, und generiert einen übersetzten Ausdruck, der
     mit step oder advance verwendet werden kann.

     In einem regulären Ausdruck wird eine Menge von Zeichenketten angege-
     ben. Wenn ein Element in dieser Menge liegt, sagt man, daß es zu dem
     regulären Ausdruck paßt. Einige Zeichen haben innerhalb eines regulä-
     ren Ausdrucks eine spezielle Bedeutung, andere Zeichen werden als
     Literale benutzt.

     Bei den regexp-Funktionen werden reguläre Ausdrücke in folgendem For-
     mat benutzt:

     Ausdruck    Bedeutung

     c           Das Zeichen c, wobei c kein Sonderzeichen ist.

     \c          Das Zeichen c, wobei c ein beliebiges Zeichen ist, aber
                 keine Ziffer im Bereich 1-9.



Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

regexp(5)                                                         regexp(5)

     ^           Der Vergleich wird anhand des Zeilenanfangs durchgeführt.

     $           Der Vergleich wird anhand des Zeilenendes durchgeführt.

     .           Ein beliebiges Zeichen in der Eingabe.

     [s]         Ein beliebiges Zeichen aus der Menge s, wobei s eine Folge
                 von Zeichen und/oder ein Bereich von Zeichen ist (z. B.
                 [c-c]).

     [^s]        Ein beliebiges Zeichen, das nicht in der Menge s enthalten
                 ist, wobei s wie oben definiert ist.

     r*          Null oder mehr aufeinanderfolgende Vorkommen des regulären
                 Ausdrucks r. Die längste, am weitesten links stehende,
                 passende Zeichenkette wird verwendet.

     rx          Das Auftreten des regulären Ausdrucks r, gefolgt vom Auf-
                 treten des regulären Ausdrucks x (Konkatenation).

     r\{m,n\}    Eine beliebige Anzahl m bis n aufeinanderfolgender Vorkom-
                 men des regulären Ausdrucks r. Der reguläre Ausdruck
                 r\{m\} paßt exakt zu m Vorkommen; r\{m,\} paßt zu minde-
                 stens m Vorkommen.

     \(r\)\n     Der reguläre Ausdruck r. Wenn \n (wobei n eine Zahl größer
                 Null ist) in einem zusammengesetzten regulären Ausdruck
                 vorkommt, steht es für den regulären Ausdruck x, wobei x
                 der nte in Klammern \( und \) eingeschlossene reguläre
                 Ausdruck ist, der zuvor im zusammengesetzten regulären
                 Ausdruck vorkam. So ist beispielsweise \(r\)x\(y\)z\2 die
                 Konkatenation der regulären Ausdrücke rxyzy.

     Die folgenden Zeichen haben eine Sonderbedeutung, außer wenn sie in
     eckige Klammern ([]) eingeschlossen sind oder ihnen ein Gegenschräg-
     strich (\) vorangestellt ist: ., *, [, \. Andere Sonderzeichen wie z. B.
     $ haben in noch eingeschränkteren Kontexten eine Sonderbedeutung.

     Das Zeichen ^ am Anfang eines Ausdrucks ermöglicht einen Vergleich
     ausschließlich unmittelbar nach einem Zeilenendezeichen, und das Zei-
     chen $ am Ende eines Ausdrucks benötigt ein nachgestelltes Zeilenende-
     zeichen.

     Die folgenden zwei Zeichen haben nur dann eine Sonderbedeutung, wenn
     sie zwischen eckigen Klammern stehen: Das Zeichen - gibt einen Bereich
     [c-c] an, es sei denn, es steht unmittelbar hinter der öffnenden oder
     unmittelbar vor der schließenden Klammer ([-c] oder [c-]); in diesen
     Fällen hat es keine Sonderbedeutung. Wenn das Zeichen ^ innerhalb von
     eckigen Klammern steht, hat es immer dann die Bedeutung Komplement
     von, wenn es auf die öffnende Klammer folgt (Beispiel: [^c]); an jeder
     anderen Position innerhalb der eckigen Klammern (Beispiel: [c^]) steht
     es für das gewöhnliche Zeichen ^.


Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

regexp(5)                                                         regexp(5)

     Die spezielle Bedeutung des Operators \ kann nur aufgehoben werden,
     indem ihm ein weiterer Gegenschrägstrich (\) vorangestellt wird (z. B.
     \\).

     In einem Programm müssen vor der Anweisung #include <regexp.h> die
     folgenden fünf Makros deklariert sein, die durch die Routine compile
     benutzt werden. Die Makros GETC, PEEKC und UNGETC bearbeiten den regu-
     lären Ausdruck, der als Eingabe von compile angegeben wird.

     GETC           Dieses Makro gibt den Wert des nächsten Zeichens
                    (Bytes) innerhalb des Musters des regulären Ausdrucks
                    an. Bei unmittelbar aufeinanderfolgenden Aufrufen von
                    GETC sollten die im regulären Ausdruck unmittelbar auf-
                    einanderfolgenden Zeichen zurückgegeben werden.

     PEEKC          Dieses Makro gibt das nächste Zeichen (Byte) im regulären
                    Ausdruck zurück. Bei unmittelbar aufeinanderfolgenden
                    Aufrufen von PEEKC sollte stets dasselbe Zeichen zurück-
                    gegeben werden, bei dem es sich gleichzeitig um das von
                    GETC zurückgegebene, nächste Zeichen handeln sollte.

     UNGETC         Dieses Makro bewirkt, daß das Argument c durch den
                    nächsten Aufruf von GETC und PEEKC zurückgegeben wird.
                    Es wird stets maximal ein Zeichen zum Zurückschieben
                    benötigt; dabei handelt es sich in jedem Fall um das
                    letzte, von GETC eingelesene Zeichen. Der Rückkehrwert
                    des Makros UNGETC(c) wird in jedem Fall ignoriert.

     RETURN(ptr)    Dieses Makro wird bei der normalen Beendigung der Rou-
                    tine compile benutzt. Der Wert des Arguments ptr ist
                    ein Zeiger auf das Zeichen, das auf das letzte Zeichen
                    des übersetzten regulären Ausdrucks folgt. Dies ist für
                    Programme sinnvoll, die Speicherzuweisungen verwalten
                    müssen.

     ERROR(val)     Dieses Makro ist das nicht normale Zurückkehren der
                    Routine compile. Das Argument val ist eine Fehlernummer
                    (Bedeutung der Fehlernummern siehe DIAGNOSE). Dieser
                    Aufruf sollte nie zurückkehren.

     Die Routine compile hat folgende Syntax:

          char *compile(char *instring, char *expbuf, const char *endbuf,
                        int eof);

     instring, der erste Parameter, wird in keinem Fall explizit von der
     Routine compile benutzt; statt dessen wird er in Programmen benutzt,
     die verschiedene Zeiger auf Eingabezeichen übergeben. Er kann auch in
     der INIT-Deklaration benutzt werden (siehe unten). Programme, die
     Funktionen zur Zeicheneingabe aufrufen oder Zeichen in einem externen
     Array abgespeichert haben, können für diesen Parameter den Wert
     (char *)0 übergeben.


Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

regexp(5)                                                         regexp(5)

     Beim nächsten Parameter expbuf handelt es sich um einen Zeiger auf ein
     Zeichen. Dieser Zeiger zeigt auf die Stelle, an der der übersetzte
     reguläre Ausdruck untergebracht wird.

     Der Wert des Parameters endbuf liegt um eins höher als die höchste
     Adresse, an der der übersetzte reguläre Ausdruck untergebracht werden
     kann. Wenn der übersetzte reguläre Ausdruck nicht in (endbuf-expbuf)
     Bytes untergebracht werden kann, wird ERROR(50) aufgerufen.

     Der Parameter eof ist das Zeichen am Ende des regulären Ausdrucks.
     Hierbei handelt es sich im Normalfall um den Schrägstrich (/).

     Jedes Programm mit der Include-Datei <regexp.h> muß eine #define-
     Anweisung für INIT enthalten. INIT wird für abhängige Deklarationen
     und Initialisierungen benutzt. In den meisten Fällen wird damit eine
     Registervariable eingestellt, mit der auf den Anfang des regulären
     Ausdrucks gezeigt wird, so daß die Registervariable in den Deklaratio-
     nen für GETC, PEEKC und UNGETC benutzt werden kann. Andernfalls wird
     INIT zur Deklaration von externen Variablen benutzt, die möglicher-
     weise von GETC, PEEKC und UNGETC verwendet werden. (Siehe BEISPIELE,
     unten.)

     Der erste Parameter der Funktionen step und advance ist ein Zeiger auf
     eine Zeichenkette, die auf Übereinstimmung überprüft werden soll.
     Diese Zeichenkette sollte mit dem Null-Zeichen abgeschlossen sein.

     expbuf, der zweite Parameter, ist der übersetzte reguläre Ausdruck,
     der bei einem Aufruf der Funktion compile zurückgegeben wurde.

     Die Funktion step gibt einen Wert ungleich Null zurück, wenn eine
     Teilzeichenkette von string zum regulären Ausdruck in expbuf paßt;
     wenn keine Übereinstimmung besteht, gibt sie den Wert Null aus. Bei
     einer Übereinstimmung werden zwei externe Zeichen-Zeiger als Nebenef-
     fekt des Aufrufs von step gesetzt. Die Variable loc1 zeigt auf das
     erste Zeichen, das zum regulären Ausdruck paßte; die Variable loc2
     zeigt auf das Zeichen hinter dem letzten Zeichen, das zum regulären
     Ausdruck paßt. Wenn der reguläre Ausdruck somit zur gesamten Eingabe-
     Zeichenkette paßt, zeigt loc1 auf das erste Zeichen von string und
     loc2 auf das Null-Zeichen am Ende von string.

     Die Funktion advance gibt einen Wert ungleich Null aus, wenn die
     ursprüngliche Teilzeichenkette von string zum regulären Ausdruck in
     expbuf paßt. Wenn eine Übereinstimmung festgestellt wird, wird als
     Nebeneffekt der externe Zeichenzeiger loc2 gesetzt. Die Variable loc2
     zeigt auf das Zeichen in string, das unmittelbar auf das letzte pas-
     sende Zeichen folgt.

     Wenn advance eines der Zeichen * oder \{ \} im regulären Ausdruck fin-
     det, rückt es seinen Zeiger auf die zu vergleichende Zeichenkette so
     weit wie möglich vor und ruft sich selbst rekursiv auf, um den Rest
     der Zeichenkette mit dem Rest des regulären Ausdrucks vergleichen zu
     können. Solange es keine Übereinstimmung gibt, durchsucht advance die


Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

regexp(5)                                                         regexp(5)

     gesamte Zeichenkette in Rückwärtsrichtung, bis es eine Übereinstimmung
     findet oder die Stelle in der Zeichenkette erreicht, die ursprünglich
     zu dem Zeichen * bzw. \{ \} paßte. In manchen Fällen sollte dieses
     Zurückgehen vor dem Erreichen des Ausgangspunkts abgebrochen werden.
     Wenn der externe Zeichen-Zeiger locs zu irgendeinem Zeitpunkt während
     des Zurückgehens gleich diesem Punkt ist, verläßt advance die Schleife
     und gibt den Wert Null zurück.

     Bei den externen Variablen circf, sed und nbra handelt es sich um
     reservierte Variablen.

DIAGNOSE
     Die Funktion compile verwendet bei Erfolg das Makro RETURN und bei
     Mißerfolg das Makro ERROR (siehe oben). Die Funktionen step und
     advance geben einen Wert ungleich Null aus, wenn eine Übereinstimmung
     festgestellt wurde, andernfalls den Wert Null. Es wird zwischen fol-
     genden Fehlern unterschieden:

     11 =  Endpunkt des Bereichs zu groß.

     16 =  Ungültige Zahl.

     25 =  \digit außerhalb des zulässigen Bereichs.

     36 =  Ungültiger oder fehlender Begrenzer.

     41 =  Keine gemerkte Suchfolge.

     42 =  \( \) im Ungleichgewicht.

     43 =  Zu viele \(.

     44 =  Mehr als zwei Zahlen in \{ \}.

     45 =  Nach \ wird } erwartet.

     46 =  Erste Zahl in \{ \} ist größer als die zweite.

     49 =  [ ] im Ungleichgewicht.

     50 =  Zu großer regulärer Ausdruck.

BEISPIELE
     Das nachfolgende Beispiel zeigt, wie die Makros und Aufrufe für regu-
     läre Ausdrücke in einem Anwendungsprogramm definiert werden können:

       #define INIT register char *sp = instring;
       #define GETC   (*sp++)
       #define PEEKC  (*sp)
       #define UNGETC(c)(--sp)
       #define RETURN(*c)return;
       #define ERROR(c) regerr


Seite 5                      Reliant UNIX 5.44               Gedruckt 11/98

regexp(5)                                                         regexp(5)

       #include <regexp.h>

        ...
        (void) compile(*argv, expbuf, &expbuf[ESIZE],'\0');
        ...
          if (step(linebuf, expbuf))
                              succeed;

SIEHE AUCH
     regcmp(1), regex(3), regcomp(3C), regcmp(3G), regexpr(3G),
     expressions(5), regex(5).











































Seite 6                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026