peter@radig.uucp (Peter Radig) (11/07/89)
While porting the `authorise' extension of sendmail to Sys V I had the following problem: How can I change the calls of `re_comp' and `re_exp' to the Sys V functions `regcmp' and `regex'. Any hints would be useful. Peter -- Peter Radig Voice: +49 69 746972 USENET: peter@radig.UUCP or: uunet!unido!radig!peter
gwyn@smoke.BRL.MIL (Doug Gwyn) (11/09/89)
In article <1199@radig.uucp> peter@radig.UUCP (Peter Radig) writes: >How can I change the calls of `re_comp' and `re_exp' to the Sys V functions >`regcmp' and `regex'. Don't do that; use <regexp.h> instead. Here's a BSD emulation for System V: /* BSD-style regular expression interface for UNIX System V last edit: 04-Aug-1989 D A Gwyn */ static struct re_msg { int number; char *message; } re_msgtab[] = { { 11, "range endpoint too large" }, { 16, "bad number" }, { 25, "`\\digit' out of range" }, { 35, "no match" }, { 36, "illegal or missing delimiter" }, { 41, "no remembered search string" }, { 42, "'\\( \\)' imbalance" }, { 43, "too many `\\(' s" }, { 44, "more than 2 numbers given" }, { 45, "'\\}' expected" }, { 46, "first number exceeds second" }, { 49, "'[ ]' imbalance" }, { 50, "regular expression overflow" }, { 51, "regular expression error" }, { 0, "unknown r.e. error" } }; static char *re_err; /* sneak path to error string */ /* Handle error from <regexp.h> */ static void re_error( n ) register int n; /* error number */ { register struct re_msg *mp; for ( mp = re_msgtab; mp->number > 0; ++mp ) if ( mp->number == n ) break; re_err = mp->message; } /* macros for <regexp.h> */ #define INIT register char *re_str = instring; #define GETC() (*re_str == '\0' ? '\0' : (int)*re_str++) #define UNGETC( c ) --re_str #define PEEKC() ((int)*re_str) #define RETURN( c ) return (char *)0 /* compile() doesn't expect ERROR() to return; kludge supplied by Gary Moss: */ #define ERROR( n ) if ( (n) >= 0 ) { re_error( n ); return re_err; } else /* following for safety's sake */ #define sed re_sed #define nbra re_nbra #define loc1 re_loc1 #define loc2 re_loc2 #define locs re_locs #define circf re_circf #define compile re_cmpl /* avoid truncated name collision! */ #define step re_step #define advance re_advance #include <regexp.h> #define ESIZE 512 static char re_buf[ESIZE]; /* compiled r.e. */ /* Compile regular expression */ char * re_comp( s ) /* returns 0 or ptr to error message */ char *s; { re_err = (char *)0; if ( s != (char *)0 && *s != '\0' ) (void)compile( s, re_buf, &re_buf[ESIZE], '\0' ); else if ( re_buf[0] == '\0' ) ERROR( 41 ); /* no remembered search string */ /* else use remembered search string from previous call */ return re_err; } /* Test for match against compiled expression */ int re_exec( s ) /* returns 1 if s matches, else 0 */ char *s; { locs = 0; /* ??? */ return step( s, re_buf ); }