home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / N / TCPIP / NETKIT-B.05 / NETKIT-B / NetKit-B-0.05 / rdist / lookup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-07  |  4.2 KB  |  168 lines

  1. /*
  2.  * Copyright (c) 1983, 1993
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. /* from: static char sccsid[] = "@(#)lookup.c    8.1 (Berkeley) 6/9/93"; */
  36. static char *rcsid = "$Id: lookup.c,v 1.3 1994/03/07 05:05:33 cgd Exp $";
  37. #endif /* not lint */
  38.  
  39. #include "defs.h"
  40.  
  41.     /* symbol types */
  42. #define VAR    1
  43. #define CONST    2
  44.  
  45. struct syment {
  46.     int    s_type;
  47.     char    *s_name;
  48.     struct    namelist *s_value;
  49.     struct    syment *s_next;
  50. };
  51.  
  52. static struct syment *hashtab[HASHSIZE];
  53.  
  54. /*
  55.  * Define a variable from a command line argument.
  56.  */
  57. void
  58. define(name)
  59.     char *name;
  60. {
  61.     register char *cp, *s;
  62.     register struct namelist *nl;
  63.     struct namelist *value;
  64.  
  65.     if (debug)
  66.         printf("define(%s)\n", name);
  67.  
  68.     cp = index(name, '=');
  69.     if (cp == NULL)
  70.         value = NULL;
  71.     else if (cp[1] == '\0') {
  72.         *cp = '\0';
  73.         value = NULL;
  74.     } else if (cp[1] != '(') {
  75.         *cp++ = '\0';
  76.         value = makenl(cp);
  77.     } else {
  78.         nl = NULL;
  79.         *cp++ = '\0';
  80.         do
  81.             cp++;
  82.         while (*cp == ' ' || *cp == '\t');
  83.         for (s = cp; ; s++) {
  84.             switch (*s) {
  85.             case ')':
  86.                 *s = '\0';
  87.             case '\0':
  88.                 break;
  89.             case ' ':
  90.             case '\t':
  91.                 *s++ = '\0';
  92.                 while (*s == ' ' || *s == '\t')
  93.                     s++;
  94.                 if (*s == ')')
  95.                     *s = '\0';
  96.                 break;
  97.             default:
  98.                 continue;
  99.             }
  100.             if (nl == NULL)
  101.                 value = nl = makenl(cp);
  102.             else {
  103.                 nl->n_next = makenl(cp);
  104.                 nl = nl->n_next;
  105.             }
  106.             if (*s == '\0')
  107.                 break;
  108.             cp = s;
  109.         }
  110.     }
  111.     (void) lookup(name, REPLACE, value);
  112. }
  113.  
  114. /*
  115.  * Lookup name in the table and return a pointer to it.
  116.  * LOOKUP - just do lookup, return NULL if not found.
  117.  * INSERT - insert name with value, error if already defined.
  118.  * REPLACE - insert or replace name with value.
  119.  */
  120.  
  121. struct namelist *
  122. lookup(name, action, value)
  123.     char *name;
  124.     int action;
  125.     struct namelist *value;
  126. {
  127.     register unsigned n;
  128.     register char *cp;
  129.     register struct syment *s;
  130.     char buf[256];
  131.  
  132.     if (debug)
  133.         printf("lookup(%s, %d, %x)\n", name, action, value);
  134.  
  135.     n = 0;
  136.     for (cp = name; *cp; )
  137.         n += *cp++;
  138.     n %= HASHSIZE;
  139.  
  140.     for (s = hashtab[n]; s != NULL; s = s->s_next) {
  141.         if (strcmp(name, s->s_name))
  142.             continue;
  143.         if (action != LOOKUP) {
  144.             if (action != INSERT || s->s_type != CONST) {
  145.                 (void)sprintf(buf, "%s redefined", name);
  146.                 yyerror(buf);
  147.             }
  148.         }
  149.         return(s->s_value);
  150.     }
  151.  
  152.     if (action == LOOKUP) {
  153.         (void)sprintf(buf, "%s undefined", name);
  154.         yyerror(buf);
  155.         return(NULL);
  156.     }
  157.  
  158.     s = ALLOC(syment);
  159.     if (s == NULL)
  160.         fatal("ran out of memory\n");
  161.     s->s_next = hashtab[n];
  162.     hashtab[n] = s;
  163.     s->s_type = action == INSERT ? VAR : CONST;
  164.     s->s_name = name;
  165.     s->s_value = value;
  166.     return(value);
  167. }
  168.