xref: /titanic_41/usr/src/cmd/tnf/prex/set.c (revision c2580b931007758eab8cb5ae8726ebe1588e259b)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1994, by Sun Microsytems, Inc.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 /*
29  * Includes
30  */
31 
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include "queue.h"
36 #include "set.h"
37 #include "new.h"
38 
39 
40 /*
41  * Globals
42  */
43 
44 static queue_node_t g_setlist = {
45 	&g_setlist,
46 &g_setlist};
47 
48 
49 /*
50  * Forward Declarations
51  */
52 
53 static void			set_destroy(set_t * set_p);
54 static void			set_print(FILE * stream, set_t * set_p);
55 
56 
57 /*
58  * set() - creates a set
59  */
60 
61 set_t		  *
62 set(char *setname_p, expr_t * exprlist_p)
63 {
64 	set_t		  *new_p;
65 	set_t		  *old_p;
66 
67 	/* does this setname exist already? */
68 	old_p = set_find(setname_p);
69 	if (old_p)
70 		set_destroy(old_p);
71 
72 	/* create a new set */
73 	new_p = new(set_t);
74 	queue_init(&new_p->qn);
75 	new_p->setname_p = setname_p;
76 	new_p->exprlist_p = exprlist_p;
77 
78 	/* append the new set to the global list */
79 	(void) queue_append(&g_setlist, &new_p->qn);
80 
81 	return (new_p);
82 
83 }				/* end set */
84 
85 
86 /*
87  * set_destroy() - destroys a set and related resources
88  */
89 
90 static void
91 set_destroy(set_t * set_p)
92 {
93 	if (!set_p)
94 		return;
95 
96 	/* remove ourselves from any list */
97 	if (!queue_isempty(&set_p->qn))
98 		(void) queue_remove(&set_p->qn);
99 
100 	if (set_p->setname_p)
101 		free(set_p->setname_p);
102 
103 	/* destroy the exprlist */
104 	expr_destroy(set_p->exprlist_p);
105 
106 	free(set_p);
107 
108 }				/* end set_destroy */
109 
110 
111 /*
112  * set_list() - pretty prints the global setlist
113  */
114 
115 void
116 set_list(void)
117 {
118 	set_t		  *set_p;
119 
120 	set_p = (set_t *) & g_setlist;
121 	while ((set_p = (set_t *) queue_next(&g_setlist, &set_p->qn))) {
122 		(void) printf("$%-8s ", set_p->setname_p);
123 		set_print(stdout, set_p);
124 		(void) printf("\n");
125 	}
126 
127 }				/* end set_list */
128 
129 
130 /*
131  * set_print() - pretty prints a set
132  */
133 
134 static void
135 set_print(FILE * stream, set_t * set_p)
136 {
137 	if (!set_p)
138 		return;
139 
140 	expr_print(stream, set_p->exprlist_p);
141 
142 }				/* end set_print */
143 
144 
145 #ifdef OLD
146 /*
147  * set_match() - discerns whether a probe is in a set
148  */
149 
150 boolean_t
151 set_match(set_t * set_p, const char *name, const char *keys)
152 {
153 	if (!set_p)
154 		return (B_FALSE);
155 
156 	return (expr_match(set_p->exprlist_p, name, keys));
157 
158 }				/* end set_match */
159 #endif
160 
161 
162 /*
163  * set_find() - finds a set by name
164  */
165 
166 set_t		  *
167 set_find(char *setname_p)
168 {
169 	set_t		  *set_p;
170 
171 	if (!setname_p)
172 		return (NULL);
173 
174 	set_p = (set_t *) & g_setlist;
175 	while ((set_p = (set_t *) queue_next(&g_setlist, &set_p->qn)))
176 		if (strcmp(setname_p, set_p->setname_p) == 0)
177 			return (set_p);
178 
179 	return (NULL);
180 
181 }				/* end set_find */
182