1 /* The IGEN simulator generator for GDB, the GNU Debugger.
3 Copyright 2002-2022 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 3 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, see <http://www.gnu.org/licenses/>. */
38 filter_parse (filter **filters, const char *filt)
40 while (strlen (filt) > 0)
44 /* break out a member of the filter list */
45 const char *flag = filt;
46 unsigned /*size_t */ len;
47 filt = strchr (filt, ',');
50 filt = strchr (flag, '\0');
58 /* find an insertion point - sorted order */
60 while (*last != NULL && strncmp (flag, (*last)->member, len) > 0)
61 last = &(*last)->next;
63 && strncmp (flag, (*last)->member, len) == 0
64 && strlen ((*last)->member) == len)
65 continue; /* duplicate */
66 /* create an entry for that member */
67 new_filter = ZALLOC (filter);
68 new_filter->member = NZALLOC (char, len + 1);
69 strncpy (new_filter->member, flag, len);
71 new_filter->next = *last;
78 filter_add (filter **set, const filter *add)
84 cmp = 1; /* set->member > add->member */
86 cmp = strcmp ((*set)->member, add->member);
90 filter *new = ZALLOC (filter);
91 new->member = NZALLOC (char, strlen (add->member) + 1);
92 strcpy (new->member, add->member);
104 /* not reached insertion point */
112 filter_is_subset (const filter *superset, const filter *subset)
119 if (superset == NULL)
120 return 0; /* subset isn't finished */
121 cmp = strcmp (subset->member, superset->member);
123 return 0; /* not found */
125 subset = subset->next; /* found */
127 superset = superset->next; /* later in list? */
133 filter_is_common (const filter *l, const filter *r)
142 cmp = strcmp (l->member, r->member);
146 return 1; /* common member */
154 filter_is_member (const filter *filt, const char *flag)
159 if (strcmp (flag, filt->member) == 0)
169 is_filtered_out (const filter *filters, const char *flags)
171 while (strlen (flags) > 0)
174 const filter *filt = filters;
175 /* break the string up */
176 const char *end = strchr (flags, ',');
178 unsigned /*size_t */ len;
181 end = strchr (flags, '\0');
189 /* check that it is present */
194 if (strncmp (flags, filt->member, len) == 0
195 && strlen (filt->member) == len)
211 filter_next (const filter *set, const char *member)
215 if (strcmp (set->member, member) > 0)
224 dump_filter (lf *file,
230 lf_printf (file, "%s", prefix);
231 member = filter_next (set, "");
236 lf_printf (file, "%s", member);
237 member = filter_next (set, member);
240 lf_printf (file, ",");
243 lf_printf (file, "%s", suffix);
249 main (int argc, char **argv)
251 filter *subset = NULL;
252 filter *superset = NULL;
257 printf ("Usage: filter <subset> <filter> ...\n");
261 /* load the filter up */
262 filter_parse (&subset, argv[1]);
263 for (i = 2; i < argc; i++)
264 filter_parse (&superset, argv[i]);
266 /* dump various info */
267 l = lf_open ("-", "stdout", lf_omit_references, lf_is_text, "tmp-filter");
271 dump_filter (l, "{", subset, " }");
272 if (filter_is_subset (superset, subset))
273 lf_printf (l, " subset of ");
275 lf_printf (l, " !subset of ");
276 dump_filter (l, "{", superset, " }");
281 dump_filter (l, "{", subset, " }");
282 if (filter_is_common (subset, superset))
283 lf_printf (l, " intersects ");
285 lf_printf (l, " !intersects ");
286 dump_filter (l, "{", superset, " }");
291 filter *memb = subset;
294 lf_printf (l, "%s", memb->member);
295 if (filter_is_member (superset, memb->member))
296 lf_printf (l, " in ");
298 lf_printf (l, " !in ");
299 dump_filter (l, "{", superset, " }");
307 filter_add (&add, superset);
308 filter_add (&add, subset);
309 dump_filter (l, "{", add, " }");
310 lf_printf (l, " = ");
311 dump_filter (l, "{", subset, " }");
312 lf_printf (l, " + ");
313 dump_filter (l, "{", superset, " }");