1 #pragma ident	"%Z%%M%	%I%	%E% SMI"
2 /*
3  * Copyright 1995 by OpenVision Technologies, Inc.
4  *
5  * Permission to use, copy, modify, distribute, and sell this software
6  * and its documentation for any purpose is hereby granted without fee,
7  * provided that the above copyright notice appears in all copies and
8  * that both that copyright notice and this permission notice appear in
9  * supporting documentation, and that the name of OpenVision not be used
10  * in advertising or publicity pertaining to distribution of the software
11  * without specific, written prior permission. OpenVision makes no
12  * representations about the suitability of this software for any
13  * purpose.  It is provided "as is" without express or implied warranty.
14  *
15  * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17  * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19  * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
20  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21  * PERFORMANCE OF THIS SOFTWARE.
22  */
23 
24 /*
25  * $Id: util_set.c,v 1.1 1996/04/12 00:39:41 marc Exp $
26  */
27 
28 #include <mechglueP.h>
29 #include <gssapiP_generic.h>
30 
31 struct _g_set {
32    void *key;
33    void *value;
34    struct _g_set *next;
35 };
36 
37 int g_set_init(g_set *s)
38 {
39    *s = NULL;
40 
41    return(0);
42 }
43 
44 int g_set_destroy(g_set *s)
45 {
46    g_set next;
47 
48    while (*s) {
49       next = (*s)->next;
50       FREE(*s, sizeof(struct _g_set));
51       *s = next;
52    }
53 
54    return(0);
55 }
56 
57 int g_set_entry_add(g_set *s, void *key, void *value)
58 {
59    g_set first;
60 
61    if ((first = (struct _g_set *) MALLOC(sizeof(struct _g_set))) == NULL)
62       return(ENOMEM);
63 
64    first->key = key;
65    first->value = value;
66    first->next = *s;
67 
68    *s = first;
69 
70    return(0);
71 }
72 
73 int g_set_entry_delete(g_set *s, void *key)
74 {
75    g_set *p;
76 
77    for (p=s; *p; p = &((*p)->next)) {
78       if ((*p)->key == key) {
79 	 g_set next = (*p)->next;
80 	 FREE(*p, sizeof(struct _g_set));
81 	 *p = next;
82 
83 	 return(0);
84       }
85    }
86 
87    return(-1);
88 }
89 
90 int g_set_entry_get(g_set *s, void *key, void **value)
91 {
92    g_set p;
93 
94    for (p = *s; p; p = p->next) {
95       if (p->key == key) {
96 	 *value = p->value;
97 
98 	 return(0);
99       }
100    }
101 
102    *value = NULL;
103 
104    return(-1);
105 }
106