1 /* The IGEN simulator generator for GDB, the GNU Debugger.
3 Copyright 2002 Free Software Foundation, Inc.
5 Contributed by Andrew Cagney.
7 This file is part of GDB.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
48 filter_parse (filter **filters,
51 while (strlen (filt) > 0)
55 /* break out a member of the filter list */
56 const char *flag = filt;
57 unsigned /*size_t*/ len;
58 filt = strchr (filt, ',');
61 filt = strchr (flag, '\0');
69 /* find an insertion point - sorted order */
72 && strncmp (flag, (*last)->member, len) > 0)
73 last = &(*last)->next;
75 && strncmp (flag, (*last)->member, len) == 0
76 && strlen ((*last)->member) == len)
77 continue; /* duplicate */
78 /* create an entry for that member */
79 new_filter = ZALLOC (filter);
80 new_filter->member = NZALLOC (char, len + 1);
81 strncpy (new_filter->member, flag, len);
83 new_filter->next = *last;
90 filter_add (filter **set,
97 cmp = 1; /* set->member > add->member */
99 cmp = strcmp ((*set)->member, add->member);
103 filter *new = ZALLOC (filter);
104 new->member = NZALLOC (char, strlen (add->member) + 1);
105 strcpy (new->member, add->member);
117 /* not reached insertion point */
125 filter_is_subset (filter *superset,
133 if (superset == NULL)
134 return 0; /* subset isn't finished */
135 cmp = strcmp (subset->member, superset->member);
137 return 0; /* not found */
139 subset = subset->next; /* found */
141 superset = superset->next; /* later in list? */
147 filter_is_common (filter *l,
157 cmp = strcmp (l->member, r->member);
161 return 1; /* common member */
169 filter_is_member (filter *filt,
175 if (strcmp (flag, filt->member) == 0)
185 is_filtered_out (filter *filters,
188 while (strlen(flags) > 0) {
190 filter *filt = filters;
191 /* break the string up */
192 char *end = strchr(flags, ',');
194 unsigned /*size_t*/ len;
196 end = strchr(flags, '\0');
203 /* check that it is present */
206 while (filt != NULL) {
207 if (strncmp(flags, filt->member, len) == 0
208 && strlen(filt->member) == len) {
224 it_is (const char *flag,
227 int flag_len = strlen(flag);
228 while (*flags != '\0') {
229 if (!strncmp(flags, flag, flag_len)
230 && (flags[flag_len] == ',' || flags[flag_len] == '\0'))
232 while (*flags != ',') {
245 filter_next (filter *set,
250 if (strcmp (set->member, member) > 0)
259 dump_filter (lf *file,
265 lf_printf (file, "%s", prefix);
266 member = filter_next (set, "");
271 lf_printf (file, "%s", member);
272 member = filter_next (set, member);
275 lf_printf (file, ",");
278 lf_printf (file, "%s", suffix);
284 main(int argc, char **argv)
286 filter *subset = NULL;
287 filter *superset = NULL;
291 printf("Usage: filter <subset> <filter> ...\n");
295 /* load the filter up */
296 filter_parse (&subset, argv[1]);
297 for (i = 2; i < argc; i++)
298 filter_parse (&superset, argv[i]);
300 /* dump various info */
301 l = lf_open ("-", "stdout", lf_omit_references, lf_is_text, "tmp-filter");
303 if (is_filtered_out (argv[1], superset))
304 lf_printf (l, "excluded\n");
306 lf_printf (l, "included\n");
310 dump_filter (l, "{", subset, " }");
311 if (filter_is_subset (superset, subset))
312 lf_printf (l, " subset of ");
314 lf_printf (l, " !subset of ");
315 dump_filter (l, "{", superset, " }");
320 dump_filter (l, "{", subset, " }");
321 if (filter_is_common (subset, superset))
322 lf_printf (l, " intersects ");
324 lf_printf (l, " !intersects ");
325 dump_filter (l, "{", superset, " }");
330 filter *memb = subset;
333 lf_printf (l, "%s", memb->member);
334 if (filter_is_member (superset, memb->member))
335 lf_printf (l, " in ");
337 lf_printf (l, " !in ");
338 dump_filter (l, "{", superset, " }");
346 filter_add (&add, superset);
347 filter_add (&add, subset);
348 dump_filter (l, "{", add, " }");
349 lf_printf (l, " = ");
350 dump_filter (l, "{", subset, " }");
351 lf_printf (l, " + ");
352 dump_filter (l, "{", superset, " }");