home *** CD-ROM | disk | FTP | other *** search
/ ftp.uv.es / 2014.11.ftp.uv.es.tar / ftp.uv.es / pub / unix / elm-2.4-pl20.tar.Z / elm-2.4-pl20.tar / lib / in_list.c < prev    next >
C/C++ Source or Header  |  1992-10-03  |  3KB  |  89 lines

  1. static char rcsid[] = "@(#)$Id: in_list.c,v 5.1 1992/10/03 22:41:36 syd Exp $";
  2.  
  3. /*******************************************************************************
  4.  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
  5.  *
  6.  *            Copyright (c) 1988-1992 USENET Community Trust
  7.  *            Copyright (c) 1986,1987 Dave Taylor
  8.  *******************************************************************************
  9.  * Bug reports, patches, comments, suggestions should be sent to:
  10.  *
  11.  *    Syd Weinstein, Elm Coordinator
  12.  *    elm@DSI.COM            dsinc!elm
  13.  *
  14.  *******************************************************************************
  15.  * $Log: in_list.c,v $
  16.  * Revision 5.1  1992/10/03  22:41:36  syd
  17.  * Initial checkin as of 2.4 Release at PL0
  18.  *
  19.  *
  20.  ******************************************************************************/
  21.  
  22. /** 
  23.  
  24. **/
  25.  
  26. #include "headers.h"
  27.  
  28.  
  29. int
  30. in_list(list, target)
  31. char *list, *target;
  32.  
  33. {
  34.     /* Returns TRUE iff target is an item in the list - case ignored.
  35.      * If target is simple (an atom of an address) match must be exact.
  36.      * If target is complex (contains a special character that separates
  37.      * address atoms), the target need only match a whole number of atoms
  38.      * at the right end of an item in the list. E.g.
  39.      * target:    item:            match:
  40.      * joe        joe            yes
  41.      * joe        jojoe            no (wrong logname)
  42.      * joe        machine!joe        no (similar logname on a perhaps
  43.      *                       different machine - to
  44.      *                       test this sort of item the 
  45.      *                       passed target must include
  46.      *                       proper machine name, is
  47.      *                       in next two examples)
  48.      * machine!joe    diffmachine!joe        no  "
  49.      * machine!joe    diffmachine!machine!joe    yes
  50.      * joe@machine    jojoe@machine        no  (wrong logname)
  51.      * joe@machine    diffmachine!joe@machine    yes
  52.      */
  53.  
  54.     register char    *rest_of_list,
  55.             *next_item,
  56.             ch;
  57.     int        offset;
  58.     char        *shift_lower(),
  59.                 lower_list[VERY_LONG_STRING],
  60.                 lower_target[SLEN];
  61.  
  62.     rest_of_list = strcpy(lower_list, shift_lower(list));
  63.     strcpy(lower_target, shift_lower(target));
  64.     while((next_item = strtok(rest_of_list, ", \t\n")) != NULL) {
  65.         /* see if target matches the whole item */
  66.         if(strcmp(next_item, lower_target) == 0)
  67.         return(TRUE);
  68.  
  69.         if(strpbrk(lower_target,"!@%:") != NULL) {
  70.  
  71.           /* Target is complex */
  72.  
  73.           if((offset = strlen(next_item) - strlen(lower_target)) > 0) {
  74.  
  75.         /* compare target against right end of next item */
  76.         if(strcmp(&next_item[offset], lower_target) == 0) {
  77.  
  78.           /* make sure we are comparing whole atoms */
  79.           ch=next_item[offset-1];
  80.           if(ch == '!' || ch == '@' || ch == '%' || ch == ':')
  81.             return(TRUE);
  82.         }
  83.           }
  84.         }
  85.         rest_of_list = NULL;
  86.     }
  87.     return(FALSE);
  88. }
  89.