manual page first distributed with 4.3BSD
[unix-history] / usr / src / usr.bin / rdist / lookup.c
CommitLineData
837386b3 1#ifndef lint
55669d5b 2static char *sccsid = "@(#)lookup.c 4.6 (Berkeley) 85/02/04";
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;
55669d5b 95 char buf[256];
837386b3
RC
96
97 if (debug)
0fccdfef 98 printf("lookup(%s, %d, %x)\n", name, action, value);
837386b3
RC
99
100 n = 0;
101 for (cp = name; *cp; )
102 n += *cp++;
103 n %= HASHSIZE;
104
0fccdfef
RC
105 for (s = hashtab[n]; s != NULL; s = s->s_next) {
106 if (strcmp(name, s->s_name))
837386b3 107 continue;
0fccdfef 108 if (action != LOOKUP) {
55669d5b
RC
109 if (action != INSERT || s->s_type != CONST) {
110 sprintf(buf, "%s redefined", name);
111 yyerror(buf);
112 }
837386b3 113 }
0fccdfef 114 return(s->s_value);
837386b3
RC
115 }
116
55669d5b
RC
117 if (action == LOOKUP) {
118 yyerror(sprintf(buf, "%s undefined", name));
119 return(NULL);
120 }
837386b3 121
0fccdfef
RC
122 s = ALLOC(syment);
123 if (s == NULL)
837386b3 124 fatal("ran out of memory\n");
0fccdfef
RC
125 s->s_next = hashtab[n];
126 hashtab[n] = s;
127 s->s_type = action == INSERT ? VAR : CONST;
128 s->s_name = name;
129 s->s_value = value;
130 return(value);
837386b3 131}