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