update cur_host correctly so multiple connections work.
[unix-history] / usr / src / usr.bin / rdist / lookup.c
CommitLineData
837386b3 1#ifndef lint
58157a31 2static char *sccsid = "@(#)lookup.c 4.5 (Berkeley) 84/02/16";
837386b3
RC
3#endif
4
5#include "defs.h"
6
0fccdfef
RC
7 /* symbol types */
8#define VAR 1
9#define CONST 2
10
11struct syment {
12 int s_type;
13 char *s_name;
14 struct namelist *s_value;
15 struct syment *s_next;
16};
17
18static struct syment *hashtab[HASHSIZE];
19
837386b3
RC
20/*
21 * Define a variable from a command line argument.
22 */
23define(name)
24 char *name;
25{
26 register char *cp, *s;
0fccdfef
RC
27 register struct namelist *nl;
28 struct namelist *value;
837386b3
RC
29
30 if (debug)
31 printf("define(%s)\n", name);
32
33 cp = index(name, '=');
3024eb6f 34 if (cp == NULL)
837386b3 35 value = NULL;
3024eb6f 36 else if (cp[1] == '\0') {
0fccdfef 37 *cp = '\0';
3024eb6f
RC
38 value = NULL;
39 } else if (cp[1] != '(') {
837386b3 40 *cp++ = '\0';
58157a31 41 value = makenl(cp);
837386b3 42 } else {
0fccdfef 43 nl = NULL;
837386b3
RC
44 *cp++ = '\0';
45 do
46 cp++;
47 while (*cp == ' ' || *cp == '\t');
48 for (s = cp; ; s++) {
49 switch (*s) {
50 case ')':
51 *s = '\0';
52 case '\0':
53 break;
54 case ' ':
55 case '\t':
56 *s++ = '\0';
57 while (*s == ' ' || *s == '\t')
58 s++;
59 if (*s == ')')
60 *s = '\0';
61 break;
62 default:
63 continue;
64 }
0fccdfef
RC
65 if (nl == NULL)
66 value = nl = makenl(cp);
837386b3 67 else {
0fccdfef
RC
68 nl->n_next = makenl(cp);
69 nl = nl->n_next;
837386b3
RC
70 }
71 if (*s == '\0')
72 break;
73 cp = s;
74 }
75 }
0fccdfef 76 (void) lookup(name, REPLACE, value);
837386b3
RC
77}
78
837386b3
RC
79/*
80 * Lookup name in the table and return a pointer to it.
0fccdfef
RC
81 * LOOKUP - just do lookup, return NULL if not found.
82 * INSERT - insert name with value, error if already defined.
83 * REPLACE - insert or replace name with value.
837386b3
RC
84 */
85
0fccdfef
RC
86struct namelist *
87lookup(name, action, value)
837386b3 88 char *name;
0fccdfef
RC
89 int action;
90 struct namelist *value;
837386b3
RC
91{
92 register unsigned n;
93 register char *cp;
0fccdfef 94 register struct syment *s;
837386b3
RC
95
96 if (debug)
0fccdfef 97 printf("lookup(%s, %d, %x)\n", name, action, value);
837386b3
RC
98
99 n = 0;
100 for (cp = name; *cp; )
101 n += *cp++;
102 n %= HASHSIZE;
103
0fccdfef
RC
104 for (s = hashtab[n]; s != NULL; s = s->s_next) {
105 if (strcmp(name, s->s_name))
837386b3 106 continue;
0fccdfef 107 if (action != LOOKUP) {
58157a31 108 if (action != INSERT || s->s_type != CONST)
837386b3 109 fatal("%s redefined\n", name);
837386b3 110 }
0fccdfef 111 return(s->s_value);
837386b3
RC
112 }
113
0fccdfef 114 if (action == LOOKUP)
837386b3
RC
115 fatal("%s not defined", name);
116
0fccdfef
RC
117 s = ALLOC(syment);
118 if (s == NULL)
837386b3 119 fatal("ran out of memory\n");
0fccdfef
RC
120 s->s_next = hashtab[n];
121 hashtab[n] = s;
122 s->s_type = action == INSERT ? VAR : CONST;
123 s->s_name = name;
124 s->s_value = value;
125 return(value);
837386b3 126}