Commit | Line | Data |
---|---|---|
761330fe DF |
1 | /* |
2 | * Copyright (c) 1980 Regents of the University of California. | |
0c5f72fb KB |
3 | * All rights reserved. |
4 | * | |
5 | * Redistribution and use in source and binary forms are permitted | |
acfc7e9b KB |
6 | * provided that the above copyright notice and this paragraph are |
7 | * duplicated in all such forms and that any documentation, | |
8 | * advertising materials, and other materials related to such | |
9 | * distribution and use acknowledge that the software was developed | |
10 | * by the University of California, Berkeley. The name of the | |
11 | * University may not be used to endorse or promote products derived | |
12 | * from this software without specific prior written permission. | |
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR | |
14 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED | |
15 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
761330fe DF |
16 | */ |
17 | ||
acfc7e9b KB |
18 | #ifndef lint |
19 | static char sccsid[] = "@(#)vars.c 5.5 (Berkeley) %G%"; | |
20 | #endif /* not lint */ | |
2e4ee99d KS |
21 | |
22 | #include "rcv.h" | |
23 | ||
24 | /* | |
25 | * Mail -- a mail program | |
26 | * | |
27 | * Variable handling stuff. | |
28 | */ | |
29 | ||
2e4ee99d KS |
30 | /* |
31 | * Assign a value to a variable. | |
32 | */ | |
33 | ||
34 | assign(name, value) | |
35 | char name[], value[]; | |
36 | { | |
37 | register struct var *vp; | |
38 | register int h; | |
39 | ||
40 | h = hash(name); | |
41 | vp = lookup(name); | |
42 | if (vp == NOVAR) { | |
43 | vp = (struct var *) calloc(sizeof *vp, 1); | |
44 | vp->v_name = vcopy(name); | |
45 | vp->v_link = variables[h]; | |
46 | variables[h] = vp; | |
47 | } | |
48 | else | |
49 | vfree(vp->v_value); | |
50 | vp->v_value = vcopy(value); | |
51 | } | |
52 | ||
53 | /* | |
54 | * Free up a variable string. We do not bother to allocate | |
55 | * strings whose value is "" since they are expected to be frequent. | |
56 | * Thus, we cannot free same! | |
57 | */ | |
58 | ||
59 | vfree(cp) | |
828615a1 | 60 | char *cp; |
2e4ee99d | 61 | { |
828615a1 EW |
62 | if (*cp) |
63 | free(cp); | |
2e4ee99d KS |
64 | } |
65 | ||
66 | /* | |
67 | * Copy a variable value into permanent (ie, not collected after each | |
68 | * command) space. Do not bother to alloc space for "" | |
69 | */ | |
70 | ||
71 | char * | |
72 | vcopy(str) | |
73 | char str[]; | |
74 | { | |
828615a1 EW |
75 | char *new; |
76 | unsigned len; | |
77 | ||
78 | if (*str == '\0') | |
79 | return ""; | |
80 | len = strlen(str) + 1; | |
81 | if ((new = malloc(len)) == NULL) | |
82 | panic("Out of memory"); | |
83 | bcopy(str, new, (int) len); | |
84 | return new; | |
2e4ee99d KS |
85 | } |
86 | ||
87 | /* | |
88 | * Get the value of a variable and return it. | |
89 | * Look in the environment if its not available locally. | |
90 | */ | |
91 | ||
92 | char * | |
93 | value(name) | |
94 | char name[]; | |
95 | { | |
96 | register struct var *vp; | |
97 | ||
98 | if ((vp = lookup(name)) == NOVAR) | |
99 | return(getenv(name)); | |
100 | return(vp->v_value); | |
101 | } | |
102 | ||
103 | /* | |
104 | * Locate a variable and return its variable | |
105 | * node. | |
106 | */ | |
107 | ||
108 | struct var * | |
109 | lookup(name) | |
828615a1 | 110 | register char name[]; |
2e4ee99d KS |
111 | { |
112 | register struct var *vp; | |
2e4ee99d | 113 | |
828615a1 EW |
114 | for (vp = variables[hash(name)]; vp != NOVAR; vp = vp->v_link) |
115 | if (*vp->v_name == *name && equal(vp->v_name, name)) | |
2e4ee99d KS |
116 | return(vp); |
117 | return(NOVAR); | |
118 | } | |
119 | ||
120 | /* | |
121 | * Locate a group name and return it. | |
122 | */ | |
123 | ||
124 | struct grouphead * | |
125 | findgroup(name) | |
828615a1 | 126 | register char name[]; |
2e4ee99d KS |
127 | { |
128 | register struct grouphead *gh; | |
2e4ee99d | 129 | |
828615a1 EW |
130 | for (gh = groups[hash(name)]; gh != NOGRP; gh = gh->g_link) |
131 | if (*gh->g_name == *name && equal(gh->g_name, name)) | |
2e4ee99d KS |
132 | return(gh); |
133 | return(NOGRP); | |
134 | } | |
135 | ||
136 | /* | |
137 | * Print a group out on stdout | |
138 | */ | |
139 | ||
140 | printgroup(name) | |
141 | char name[]; | |
142 | { | |
143 | register struct grouphead *gh; | |
144 | register struct group *gp; | |
145 | ||
146 | if ((gh = findgroup(name)) == NOGRP) { | |
147 | printf("\"%s\": not a group\n", name); | |
148 | return; | |
149 | } | |
150 | printf("%s\t", gh->g_name); | |
151 | for (gp = gh->g_list; gp != NOGE; gp = gp->ge_link) | |
152 | printf(" %s", gp->ge_name); | |
828615a1 | 153 | putchar('\n'); |
2e4ee99d KS |
154 | } |
155 | ||
156 | /* | |
157 | * Hash the passed string and return an index into | |
158 | * the variable or group hash table. | |
159 | */ | |
160 | ||
161 | hash(name) | |
828615a1 | 162 | register char *name; |
2e4ee99d | 163 | { |
828615a1 EW |
164 | register h = 0; |
165 | ||
166 | while (*name) { | |
167 | h <<= 2; | |
168 | h += *name++; | |
169 | } | |
170 | if (h < 0 && (h = -h) < 0) | |
46691008 | 171 | h = 0; |
828615a1 | 172 | return (h % HSHSIZE); |
2e4ee99d | 173 | } |