Return to BSD News archive
Newsgroups: comp.os.386bsd.bugs
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!pacbell.com!amdahl!amd!netcomsv!netcom.com!alm
From: alm@netcom.com (Andrew Moore)
Subject: 2nd try - bug fix (was Re: elvis tag bug in FreeBSD-1.0E)
Message-ID: <almCF8r5J.FBw@netcom.com>
Keywords: elvis tags
Organization: Netcom Online Communications Services (408-241-9760 login: guest)
References: <517@irbs.UUCP>
Date: Thu, 21 Oct 1993 09:46:31 GMT
Lines: 79
In article <517@irbs.UUCP> jc@irbs.UUCP (John Capo) writes:
>
>If elvis is compiled with -DREGEX, as in the stock source distribution,
>he can not find a tag with a * in the function return value or in the
>arguments. Remove -DREGEX from the Makefile and all is well again.
>
>Is this a known bug or do I have another problem?
With REGEX, the magic and ignorecase flags weren't being heeded.
This should fix it:
*** regexp.c~ Thu Oct 21 00:19:55 1993
--- regexp.c Thu Oct 21 01:22:14 1993
***************
*** 49,54 ****
--- 49,56 ----
optpat(s)
char *s;
{
+ char *neuter();
+
int n;
if (*s == '\0') {
if (!previous) regerr("RE error: no previous pattern");
***************
*** 60,72 ****
return previous;
}
patlock = 0;
! if (n = regcomp(previous, s, 0)) {
regerr("RE error: %d", n);
free(previous);
return previous = NULL;
}
return previous;
}
#else
static char *previous; /* the previous regexp, used when null regexp is given */
--- 62,100 ----
return previous;
}
patlock = 0;
! if (n = regcomp(previous, *o_magic ? s : neuter(s),
! *o_ignorecase ? REG_ICASE : 0)) {
regerr("RE error: %d", n);
free(previous);
return previous = NULL;
}
return previous;
}
+
+ /* escape BRE meta-characters in a string */
+ char *
+ neuter(s)
+ char *s;
+ {
+ static char *hd = NULL;
+
+ char *t;
+ int n = strlen(s);
+
+ free(hd);
+ if ((hd = t = (char *) malloc(n + n + 1)) == NULL)
+ return NULL;
+ if (*s == '^')
+ *t++ = *s++;
+ while (*s) {
+ if (*s == '.' || *s == '\\' || *s == '[' || *s == '*')
+ *t++ = '\\';
+ *t++ = *s++;
+ }
+ *t = '\0';
+ return hd;
+ }
+
#else
static char *previous; /* the previous regexp, used when null regexp is given */