]>
git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/igen/filter.c
1 /* The IGEN simulator generator for GDB, the GNU Debugger.
3 Copyright 2002-2021 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/>. */
41 filter_parse (filter
**filters
, const char *filt
)
43 while (strlen (filt
) > 0)
47 /* break out a member of the filter list */
48 const char *flag
= filt
;
49 unsigned /*size_t */ len
;
50 filt
= strchr (filt
, ',');
53 filt
= strchr (flag
, '\0');
61 /* find an insertion point - sorted order */
63 while (*last
!= NULL
&& strncmp (flag
, (*last
)->member
, len
) > 0)
64 last
= &(*last
)->next
;
66 && strncmp (flag
, (*last
)->member
, len
) == 0
67 && strlen ((*last
)->member
) == len
)
68 continue; /* duplicate */
69 /* create an entry for that member */
70 new_filter
= ZALLOC (filter
);
71 new_filter
->member
= NZALLOC (char, len
+ 1);
72 strncpy (new_filter
->member
, flag
, len
);
74 new_filter
->next
= *last
;
81 filter_add (filter
**set
, filter
*add
)
87 cmp
= 1; /* set->member > add->member */
89 cmp
= strcmp ((*set
)->member
, add
->member
);
93 filter
*new = ZALLOC (filter
);
94 new->member
= NZALLOC (char, strlen (add
->member
) + 1);
95 strcpy (new->member
, add
->member
);
107 /* not reached insertion point */
115 filter_is_subset (filter
*superset
, filter
*subset
)
122 if (superset
== NULL
)
123 return 0; /* subset isn't finished */
124 cmp
= strcmp (subset
->member
, superset
->member
);
126 return 0; /* not found */
128 subset
= subset
->next
; /* found */
130 superset
= superset
->next
; /* later in list? */
136 filter_is_common (filter
*l
, filter
*r
)
145 cmp
= strcmp (l
->member
, r
->member
);
149 return 1; /* common member */
157 filter_is_member (filter
*filt
, const char *flag
)
162 if (strcmp (flag
, filt
->member
) == 0)
172 is_filtered_out (filter
*filters
, const char *flags
)
174 while (strlen (flags
) > 0)
177 filter
*filt
= filters
;
178 /* break the string up */
179 char *end
= strchr (flags
, ',');
181 unsigned /*size_t */ len
;
184 end
= strchr (flags
, '\0');
192 /* check that it is present */
197 if (strncmp (flags
, filt
->member
, len
) == 0
198 && strlen (filt
->member
) == len
)
214 filter_next (filter
*set
, char *member
)
218 if (strcmp (set
->member
, member
) > 0)
227 dump_filter (lf
*file
, char *prefix
, filter
*set
, char *suffix
)
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
, " }");