regexpr(3G) regexpr(3G)
NAME
regexpr: compile, step, advance, loc1, loc2, locs, nbra, regerrno,
reglength, braslist, braelist - Regulären Ausdruck übersetzen und
anwenden
SYNTAX
cc [option ...] datei ... -lgen [bibliothek ...]
#include <regexpr.h>
char *compile(const char *instring, char *expbuf, char *endbuf);
int step(const char *string, char *expbuf);
int advance(const char *string, char *expbuf);
extern char *loc1, *loc2, *locs;
extern int nbra, regerrno, reglength;
extern char *braslist[ ], *braelist[ ];
BESCHREIBUNG
Diese Routinen werden verwendet, um reguläre Ausdrücke zu übersetzen
und die übersetzten Ausdrücke mit Zeilen zu vergleichen. Die übersetz-
ten regulären Ausdrücke haben die von ed verwendete Form.
compile() wird wie folgt verwendet:
Der Parameter instring ist eine mit einem Nullzeichen abschließende
Zeichenkette, die einen regulären Ausdruck repräsentiert.
Der Parameter expbuf zeigt auf den Speicherplatz, an den der über-
setzte reguläre Ausdruck gebracht werden soll. Wenn expbuf NULL ist,
verwendet compile() malloc(), um Speicherplatz für den übersetzten
regulären Ausdruck zuzuweisen. Wenn ein Fehler auftritt, wird dieser
Platz wieder freigegeben. Es liegt in der Verantwortung des Benutzers,
den Speicherplatz freizugeben, wenn der übersetzte reguläre Ausdruck
nicht länger benötigt wird.
Der Parameter endbuf zeigt auf einen Speicherplatz über der höchsten
Adresse, an der der übersetzte reguläre Ausdruck untergebracht werden
kann. Dieses Argument wird ignoriert, wenn expbuf NULL ist. Wenn der
übersetzte Ausdruck nicht in (endbuf - expbuf) Bytes paßt, gibt
compile() NULL zurück, und regerrno (siehe unten) wird auf 50 gesetzt.
Wenn compile() Erfolg hat, gibt es einen Zeiger ungleich NULL zurück,
dessen Wert von expbuf abhängt. Wenn expbuf ungleich NULL ist, gibt
compile() einen Zeiger auf das Byte hinter dem letzten Byte in dem
übersetzten regulären Ausdruck zurück. Die Länge des übersetzten regu-
lären Ausdrucks wird in reglength gespeichert. Sonst gibt compile()
einen Zeiger auf den von malloc() zugewiesenen Speicherplatz zurück.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
regexpr(3G) regexpr(3G)
Wenn beim Übersetzen des regulären Ausdrucks ein Fehler entdeckt wird,
wird von compile() ein Nullzeiger zurückgegeben, und regerrno wird auf
einen der unten angezeigten Fehlernummern ungleich Null gesetzt:
FEHLER BEDEUTUNG
11 zu großer Endpunkt des Bereichs
16 falsche Zahl
25 \Ziffer außerhalb des Gültigkeitsbereich
36 ungültiger oder fehlender Begrenzer
41 keine gespeicherte Suchfolge
42 \( \) nicht ausgeglichen
43 zu viele \(
44 mehr als 2 Zahlen in \{ \}\
45 } nach \ erwartet
46 erste Zahl ist größer als zweite in \{ \}
49 [ ] nicht ausgeglichen
50 Überlauf des regulären Ausdrucks
step() wird wie folgt verwendet: Der erste Parameter von step() ist
ein Zeiger auf eine Zeichenkette, die verglichen werden soll. Die Zei-
chenkette sollte mit einem Nullzeichen abschließen.
Der Parameter expbuf ist der übersetzte reguläre Ausdruck, der durch
den Aufruf der Funktion compile() erhalten wird.
Die Funktion step() gibt einen Wert ungleich Null zurück, wenn die
übergebene Zeichenkette auf den regulären Ausdruck paßt, und Null,
wenn das nicht der Fall ist. Wenn der Vergleich paßt, werden zwei
externe Zeichen-Zeiger als Nebeneffekt des step()-Aufrufs gesetzt. Die
in step() gesetzte Variable ist loc1. loc1 ist ein Zeiger auf das
erste Zeichen, das auf den regulären Ausdruck paßt. Die Variable loc2
zeigt auf das Zeichen hinter dem letzten Zeichen, das auf den regulä-
ren Ausdruck paßt. Wenn also der reguläre Ausdruck auf die ganze Zeile
paßt, zeigt loc1 auf das erste Zeichen von string, und loc2 zeigt auf
das Nullzeichen am Ende von string.
Der Zweck von step() besteht darin, schrittweise durch das Argument
string zu laufen, bis ein passendes Zeichen gefunden wird oder bis das
Ende von string erreicht wird. Wenn der reguläre Ausdruck mit ^
beginnt, versucht step() den Vergleich mit dem regulären Ausdruck nur
am Anfang der Zeichenkette.
Die Funktion advance() hat dieselben Argumente und Nebeneffekte wie
step(), aber diese Funktion schränkt den Vergleich immer auf den
Anfang der Zeichenkette ein.
Wenn man nach aufeinanderfolgenden Mustern in derselben Zeichenkette
sucht, sollte locs auf denselben Wert wie loc2 gesetzt werden, und
step() sollte mit string gleich loc2 aufgerufen werden. locs wird von
Kommandos wie ed und sed verwendet, so daß globale Ersetzungen wie
s/y*//g nicht endlos laufen, und ist standardmäßig NULL.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
regexpr(3G) regexpr(3G)
Die externe Variable nbra wird verwendet, um die Anzahl von Unteraus-
drücken in dem übersetzten regulären Ausdruck zu bestimmen. braslist
und braelist sind Felder von Zeigern auf Zeichen, die auf den Anfang
und das Ende der nbra-Unterausdrücke in der passenden Zeichenkette
zeigen. So zeigt zum Beispiel nach dem Aufruf von step() oder
advance() mit der Zeichenkette sabcdefg und dem regulären Ausdruck
\(abcdef\), braslist[0] auf a und braelist[0] auf g. Diese Felder wer-
den von Kommandos wie ed und sed verwendet, um wiederholte Ersetzungen
mit Mustern durchzuführen, die die Notation \n für Unterausdrücke ent-
halten.
Beachten Sie, daß es nicht notwendig ist, die externen Variablen
regerrno, nbra, loc1, loc2, locs, braelist und braslist zu verwenden,
wenn man nur überprüfen möchte, ob eine Zeichenkette auf einen regulä-
ren Ausdruck paßt oder nicht.
BEISPIELE
Folgender Programmauszug entspricht dem regulären Ausdruck von grep:
#include <regexpr.h>
. . .
if(compile(*argv, (char *)0, (char *)0) == (char *)0)
regerr(regerrno);
. . .
if (step(linebuf, expbuf))
succeed();
HINWEISE
Wenn Sie eine dieser Funktionen verwenden, müssen Sie bei der Überset-
zung die Bibliothek libgen dazubinden (cc -lgen).
SIEHE AUCH
ed(1), grep(1), regcmp(1), sed(1), regex(3), regcomp(3C), regcmp(3G),
expressions(5), regex(5), regexp(5).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98