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