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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 /*
27 * Routines for manipulating iidesc_t structures
28 */
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <strings.h>
33
34 #include "ctftools.h"
35 #include "memory.h"
36 #include "list.h"
37 #include "hash.h"
38
39 typedef struct iidesc_find {
40 iidesc_t *iif_tgt;
41 iidesc_t *iif_ret;
42 } iidesc_find_t;
43
44 iidesc_t *
45 iidesc_new(char *name)
46 {
47 iidesc_t *ii;
48
49 ii = xcalloc(sizeof (iidesc_t));
50 if (name)
51 ii->ii_name = xstrdup(name);
52
53 return (ii);
54 }
55
56 int
57 iidesc_hash(int nbuckets, void *arg)
58 {
59 iidesc_t *ii = arg;
60 int h = 0;
61
62 if (ii->ii_name)
63 return (hash_name(nbuckets, ii->ii_name));
64
65 return (h);
66 }
67
68 static int
69 iidesc_cmp(iidesc_t *src, iidesc_find_t *find)
70 {
71 iidesc_t *tgt = find->iif_tgt;
72
73 if (src->ii_type != tgt->ii_type ||
74 !streq(src->ii_name, tgt->ii_name))
75 return (0);
76
77 find->iif_ret = src;
78
79 return (-1);
80 }
81
82 void
83 iidesc_add(hash_t *hash, iidesc_t *new)
84 {
85 iidesc_find_t find;
86
87 find.iif_tgt = new;
88 find.iif_ret = NULL;
89
90 (void) hash_match(hash, new, (int (*)())iidesc_cmp, &find);
91
92 if (find.iif_ret != NULL) {
93 iidesc_t *old = find.iif_ret;
94 iidesc_t tmp;
95 /* replacing existing one */
96 bcopy(old, &tmp, sizeof (tmp));
97 bcopy(new, old, sizeof (*old));
98 bcopy(&tmp, new, sizeof (*new));
99
100 iidesc_free(new);
101 return;
102 }
103
104 hash_add(hash, new);
105 }
106
107 void
108 iter_iidescs_by_name(tdata_t *td, const char *name,
109 int (*func)(iidesc_t *, void *), void *data)
110 {
111 iidesc_t tmpdesc;
112 bzero(&tmpdesc, sizeof (iidesc_t));
113 tmpdesc.ii_name = (char *)name;
114 (void) hash_match(td->td_iihash, &tmpdesc, (int (*)())func, data);
115 }
116
117 iidesc_t *
118 iidesc_dup(iidesc_t *src)
119 {
120 iidesc_t *tgt;
121
122 tgt = xmalloc(sizeof (iidesc_t));
123 bcopy(src, tgt, sizeof (iidesc_t));
124
125 tgt->ii_name = src->ii_name ? xstrdup(src->ii_name) : NULL;
126 tgt->ii_owner = src->ii_owner ? xstrdup(src->ii_owner) : NULL;
127
128 if (tgt->ii_nargs) {
129 tgt->ii_args = xmalloc(sizeof (tdesc_t *) * tgt->ii_nargs);
130 bcopy(src->ii_args, tgt->ii_args,
131 sizeof (tdesc_t *) * tgt->ii_nargs);
132 }
133
134 return (tgt);
135 }
136
137 iidesc_t *
138 iidesc_dup_rename(iidesc_t *src, char const *name, char const *owner)
139 {
140 iidesc_t *tgt = iidesc_dup(src);
141 free(tgt->ii_name);
142 free(tgt->ii_owner);
143
144 tgt->ii_name = name ? xstrdup(name) : NULL;
145 tgt->ii_owner = owner ? xstrdup(owner) : NULL;
146
147 return (tgt);
148 }
149
150 /*ARGSUSED*/
151 void
152 iidesc_free_cb(void *ptr, void *private)
153 {
154 iidesc_t *idp = ptr;
155
156 free(idp->ii_name);
157 free(idp->ii_args);
158 free(idp->ii_owner);
159 free(idp);
160 }
161
162 void
163 iidesc_free(iidesc_t *idp)
164 {
165 iidesc_free_cb(idp, NULL);
166 }
167
168 int
169 iidesc_dump(iidesc_t *ii)
170 {
171 printf("type: %d name %s\n", ii->ii_type,
172 (ii->ii_name ? ii->ii_name : "(anon)"));
173
174 return (0);
175 }
176
177 int
178 iidesc_count_type(void *data, void *private)
179 {
180 iidesc_t *ii = data;
181 iitype_t match = (iitype_t)private;
182
183 return (ii->ii_type == match);
184 }
185
186 void
187 iidesc_stats(hash_t *ii)
188 {
189 printf("GFun: %5d SFun: %5d GVar: %5d SVar: %5d T %5d SOU: %5d\n",
190 hash_iter(ii, iidesc_count_type, (void *)II_GFUN),
191 hash_iter(ii, iidesc_count_type, (void *)II_SFUN),
192 hash_iter(ii, iidesc_count_type, (void *)II_GVAR),
193 hash_iter(ii, iidesc_count_type, (void *)II_SVAR),
194 hash_iter(ii, iidesc_count_type, (void *)II_TYPE),
195 hash_iter(ii, iidesc_count_type, (void *)II_SOU));
196 }