1 /* $NetBSD: vars.c,v 1.17 2006/11/28 18:45:32 christos Exp $ */
4 * Copyright (c) 1980, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
35 static char sccsid
[] = "@(#)vars.c 8.1 (Berkeley) 6/6/93";
37 __RCSID("$NetBSD: vars.c,v 1.17 2006/11/28 18:45:32 christos Exp $");
47 * Mail -- a mail program
49 * Variable handling stuff.
53 * Free up a variable string. We do not bother to allocate
54 * strings whose value is "" since they are expected to be frequent.
55 * Thus, we cannot free same!
65 * Copy a variable value into permanent (ie, not collected after each
66 * command) space. Do not bother to alloc space for ""
69 vcopy(const char str
[])
76 len
= strlen(str
) + 1;
78 (void)memmove(new, str
, len
);
83 * Hash the passed string and return an index into
84 * the variable or group hash table.
87 hash(const char *name
)
95 if (h
< 0 && (h
= -h
) < 0)
101 * Locate a variable and return its variable
105 lookup(const char name
[])
109 for (vp
= variables
[hash(name
)]; vp
!= NULL
; vp
= vp
->v_link
)
110 if (*vp
->v_name
== *name
&& equal(vp
->v_name
, name
))
116 * Assign a value to a variable.
119 assign(const char name
[], const char values
[])
127 vp
= ecalloc(1, sizeof(*vp
));
128 vp
->v_name
= vcopy(name
);
129 vp
->v_link
= variables
[h
];
134 vp
->v_value
= vcopy(values
);
138 * Get the value of a variable and return it.
139 * Look in the environment if its not available locally.
142 value(const char name
[])
146 if ((vp
= lookup(name
)) == NULL
)
152 * Locate a group name and return it.
154 PUBLIC
struct grouphead
*
155 findgroup(const char name
[])
157 struct grouphead
*gh
;
159 for (gh
= groups
[hash(name
)]; gh
!= NULL
; gh
= gh
->g_link
)
160 if (*gh
->g_name
== *name
&& equal(gh
->g_name
, name
))
166 * Print a group out on stdout
169 printgroup(const char name
[])
171 struct grouphead
*gh
;
174 if ((gh
= findgroup(name
)) == NULL
) {
175 (void)printf("\"%s\": not a group\n", name
);
178 (void)printf("%s\t", gh
->g_name
);
179 for (gp
= gh
->g_list
; gp
!= NULL
; gp
= gp
->ge_link
)
180 (void)printf(" %s", gp
->ge_name
);