1 /* This file is part of the program psim.
3 Copyright (C) 1994-1996, Andrew Cagney <cagney@highland.com.au>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
45 filter_parse (filter
**filters
,
48 while (strlen (filt
) > 0)
52 /* break out a member of the filter list */
53 const char *flag
= filt
;
54 unsigned /*size_t*/ len
;
55 filt
= strchr (filt
, ',');
58 filt
= strchr (flag
, '\0');
66 /* find an insertion point - sorted order */
69 && strncmp (flag
, (*last
)->member
, len
) > 0)
70 last
= &(*last
)->next
;
72 && strncmp (flag
, (*last
)->member
, len
) == 0
73 && strlen ((*last
)->member
) == len
)
74 continue; /* duplicate */
75 /* create an entry for that member */
76 new_filter
= ZALLOC (filter
);
77 new_filter
->member
= NZALLOC (char, len
+ 1);
78 strncpy (new_filter
->member
, flag
, len
);
80 new_filter
->next
= *last
;
87 filter_add (filter
**set
,
94 cmp
= 1; /* set->member > add->member */
96 cmp
= strcmp ((*set
)->member
, add
->member
);
100 filter
*new = ZALLOC (filter
);
101 new->member
= NZALLOC (char, strlen (add
->member
) + 1);
102 strcpy (new->member
, add
->member
);
114 /* not reached insertion point */
122 filter_is_subset (filter
*superset
,
130 if (superset
== NULL
)
131 return 0; /* subset isn't finished */
132 cmp
= strcmp (subset
->member
, superset
->member
);
134 return 0; /* not found */
136 subset
= subset
->next
; /* found */
138 superset
= superset
->next
; /* later in list? */
144 filter_is_common (filter
*l
,
154 cmp
= strcmp (l
->member
, r
->member
);
158 return 1; /* common member */
166 filter_is_member (filter
*filt
,
172 if (strcmp (flag
, filt
->member
) == 0)
182 is_filtered_out (filter
*filters
,
185 while (strlen(flags
) > 0) {
187 filter
*filt
= filters
;
188 /* break the string up */
189 char *end
= strchr(flags
, ',');
191 unsigned /*size_t*/ len
;
193 end
= strchr(flags
, '\0');
200 /* check that it is present */
203 while (filt
!= NULL
) {
204 if (strncmp(flags
, filt
->member
, len
) == 0
205 && strlen(filt
->member
) == len
) {
221 it_is (const char *flag
,
224 int flag_len
= strlen(flag
);
225 while (*flags
!= '\0') {
226 if (!strncmp(flags
, flag
, flag_len
)
227 && (flags
[flag_len
] == ',' || flags
[flag_len
] == '\0'))
229 while (*flags
!= ',') {
242 filter_next (filter
*set
,
247 if (strcmp (set
->member
, member
) > 0)
256 dump_filter (lf
*file
,
262 lf_printf (file
, "%s", prefix
);
263 member
= filter_next (set
, "");
268 lf_printf (file
, "%s", member
);
269 member
= filter_next (set
, member
);
272 lf_printf (file
, ",");
275 lf_printf (file
, "%s", suffix
);
281 main(int argc
, char **argv
)
283 filter
*subset
= NULL
;
284 filter
*superset
= NULL
;
288 printf("Usage: filter <subset> <filter> ...\n");
292 /* load the filter up */
293 filter_parse (&subset
, argv
[1]);
294 for (i
= 2; i
< argc
; i
++)
295 filter_parse (&superset
, argv
[i
]);
297 /* dump various info */
298 l
= lf_open ("-", "stdout", lf_omit_references
, lf_is_text
, "tmp-filter");
300 if (is_filtered_out (argv
[1], superset
))
301 lf_printf (l
, "excluded\n");
303 lf_printf (l
, "included\n");
307 dump_filter (l
, "{", subset
, " }");
308 if (filter_is_subset (superset
, subset
))
309 lf_printf (l
, " subset of ");
311 lf_printf (l
, " !subset of ");
312 dump_filter (l
, "{", superset
, " }");
317 dump_filter (l
, "{", subset
, " }");
318 if (filter_is_common (subset
, superset
))
319 lf_printf (l
, " intersects ");
321 lf_printf (l
, " !intersects ");
322 dump_filter (l
, "{", superset
, " }");
327 filter
*memb
= subset
;
330 lf_printf (l
, "%s", memb
->member
);
331 if (filter_is_member (superset
, memb
->member
))
332 lf_printf (l
, " in ");
334 lf_printf (l
, " !in ");
335 dump_filter (l
, "{", superset
, " }");
343 filter_add (&add
, superset
);
344 filter_add (&add
, subset
);
345 dump_filter (l
, "{", add
, " }");
346 lf_printf (l
, " = ");
347 dump_filter (l
, "{", subset
, " }");
348 lf_printf (l
, " + ");
349 dump_filter (l
, "{", superset
, " }");
This page took 0.041037 seconds and 5 git commands to generate.