static char rcsid[] = "@(#)$Id: in_list.c,v 1.4 1995/09/29 17:41:14 wfp5p Exp $";
/*******************************************************************************
* The Elm Mail System - $Revision: 1.4 $ $State: Exp $
*
* Copyright (c) 1988-1995 USENET Community Trust
* Copyright (c) 1986,1987 Dave Taylor
*******************************************************************************
* Bug reports, patches, comments, suggestions should be sent to:
*
* Bill Pemberton, Elm Coordinator
* flash@virginia.edu
*
*******************************************************************************
* $Log: in_list.c,v $
* Revision 1.4 1995/09/29 17:41:14 wfp5p
* Alpha 8 (Chip's big changes)
*
* Revision 1.3 1995/06/12 20:33:06 wfp5p
* Changed improper use of NULL to 0
* Added a missing declaration
*
* Revision 1.2 1995/05/04 15:18:05 wfp5p
* The wildcard '*' is now allowed in the alternatives list.
*
* Revision 1.1.1.1 1995/04/19 20:38:32 wfp5p
* Initial import of elm 2.4 PL0 as base for elm 2.5.
*
******************************************************************************/
/**
**/
#include "elm_defs.h"
int
in_list(list, target)
char *list, *target;
{
/* Returns TRUE iff target is an item in the list - case ignored.
* If target is simple (an atom of an address) match must be exact.
* If target is complex (contains a special character that separates
* address atoms), the target need only match a whole number of atoms
* at the right end of an item in the list. E.g.
* target: item: match:
* joe joe yes
* joe jojoe no (wrong logname)
* joe machine!joe no (similar logname on a perhaps
* different machine - to
* test this sort of item the
* passed target must include
* proper machine name, is
* in next two examples)
* machine!joe diffmachine!joe no "
* machine!joe diffmachine!machine!joe yes
* joe@machine jojoe@machine no (wrong logname)
* joe@machine diffmachine!joe@machine yes
*
* The wildcard * can now also be used. If there is a wildcard, the
* behaviour is changed slightly.
*/
register char *rest_of_list,
*next_item,
ch;
int offset;
char *shift_lower(),
lower_list[VERY_LONG_STRING],
lower_target[SLEN];
rest_of_list = strcpy(lower_list, shift_lower(list));
strcpy(lower_target, shift_lower(target));
while((next_item = strtok(rest_of_list, ", \t\n")) != NULL) {
/* see if target matches the whole item */
if(strcmp(next_item, lower_target) == 0)
return(TRUE);
if (rindex(lower_target, '*') != NULL) /* do something with wildcards */
{
char tmpStr[SLEN];
char *tptr;
strcpy(tmpStr,lower_target);
tptr = rindex(tmpStr, '*');
*tptr = '\0';
if (strncmp(tmpStr,next_item,strlen(tmpStr)) != 0) /* user is different! */
return(FALSE);
tptr++;
strcpy(tmpStr,tptr);
tptr = next_item;
tptr += strlen(next_item)-strlen(tmpStr);
if (strncmp(tmpStr,tptr,strlen(tmpStr)) != 0)
return(FALSE);
else
return(TRUE);
}
else
if(strpbrk(lower_target,"!@%:") != NULL) {
/* Target is complex */
if((offset = strlen(next_item) - strlen(lower_target)) > 0) {
/* compare target against right end of next item */
if(strcmp(&next_item[offset], lower_target) == 0) {
/* make sure we are comparing whole atoms */
ch=next_item[offset-1];
if(ch == '!' || ch == '@' || ch == '%' || ch == ':')
return(TRUE);
}
}
}
rest_of_list = NULL;
}
return(FALSE);
}
syntax highlighted by Code2HTML, v. 0.9.1