#ifndef lint
static char sccsid[] = "@(#)ngmatch.c 1.3 (Berkeley) 2/6/88";
#endif
#include "common.h"
/*
* nntpngmatch -- match a list of newsgroup specifiers with a list of
* given newsgroups. A pointer to the routine which determines a match is
* also given. This allows us to do regular expression handling for RFC
* 977's NEWNEWS, and more efficient "strncmps" for the access file, which
* must be checked often.
*
* This is NOT the same routine as ngmatch in the news software. Pity.
*
* Parameters: "nglist" is the list of group specifiers (limited
* regexp) to match against.
* "ngcount" is the number of groups in nglist.
* "matchlist" is the list of newsgroups to match against.
* "matchcount" is number of groups in matchlist.
*
* Returns: 1 if the named newsgroup is in the list.
* 0 otherwise.
*/
int
ngmatch(func, dflt, ngspec, ngspeccount, matchlist, matchcount)
int (*func)();
int dflt;
char **ngspec;
int ngspeccount;
char **matchlist;
int matchcount;
{
register int i, j;
register int match;
register char *cp;
if (ngspeccount == 0)
return (1);
match = dflt;
for (i = 0; i < matchcount; ++i) {
if (cp = index(matchlist[i], '/'))
*cp = '\0';
for (j = 0; j < ngspeccount; ++j) {
if (ngspec[j][0] == '!') { /* Handle negation */
if ((*func)(ngspec[j]+1, matchlist[i])) {
match = 0;
}
} else {
if ((*func)(ngspec[j], matchlist[i])) {
match = 1;
}
}
}
}
return (match);
}
/*
* restreql -- A small regular expression string equivalnce routine.
* Thanks and a tip of the hat to Nick Lai, <lai@shadow.berkeley.edu>
* for this time saving device.
*
* Parameters: "w" is an asterisk-broadened regexp,
* "s" is a non-regexp string.
* Returns: 1 if match, 0 otherwise.
*
* Side effects: None.
*/
int
restreql(w, s)
register char *w;
register char *s;
{
while (*s && *w) {
switch (*w) {
case '*':
for (w++; *s; s++)
if (restreql(w, s))
return 1;
break;
default:
if (*w != *s)
return 0;
w++, s++;
break;
}
}
if (*s)
return 0;
while (*w)
if (*w++ != '*')
return 0;
return 1;
}
/*
* s1strneql -- see if s1 is equivalent to s2 up to the length of s1.
* Return non-zero if so, 0 otherwise.
*/
int
s1strneql(s1, s2)
register char *s1;
register char *s2;
{
register int slen;
if (!strcmp(s1,"all"))
return(1);
if ((slen = strlen(s1)) > 4) {
if (!strcmp(s1+slen-4,".all"))
return(!strncmp(s1, s2, slen-3));
}
return (!strncmp(s1, s2, slen));
}
syntax highlighted by Code2HTML, v. 0.9.1