Add scoped_state() and add_scope_hook().
[smatch.git] / smatch_tracker.c
bloba025119e0fc4a9513ff0d0dd839a9095b6072960
1 #include "smatch.h"
3 ALLOCATOR(tracker, "trackers");
5 struct tracker *alloc_tracker(const char *name, int owner, struct symbol *sym)
7 struct tracker *tmp;
9 tmp = __alloc_tracker(0);
10 tmp->name = alloc_string(name);
11 tmp->owner = owner;
12 tmp->sym = sym;
13 return tmp;
16 void add_tracker(struct tracker_list **list, const char *name, int owner,
17 struct symbol *sym)
19 struct tracker *tmp;
21 if (in_tracker_list(*list, name, owner, sym))
22 return;
23 tmp = alloc_tracker(name, owner, sym);
24 add_ptr_list(list, tmp);
27 void del_tracker(struct tracker_list **list, const char *name, int owner,
28 struct symbol *sym)
30 struct tracker *tmp;
32 FOR_EACH_PTR(*list, tmp) {
33 if (tmp->owner == owner && tmp->sym == sym
34 && !strcmp(tmp->name, name)) {
35 DELETE_CURRENT_PTR(tmp);
36 __free_tracker(tmp);
37 return;
39 } END_FOR_EACH_PTR(tmp);
42 int in_tracker_list(struct tracker_list *list, const char *name, int owner,
43 struct symbol *sym)
45 struct tracker *tmp;
47 FOR_EACH_PTR(list, tmp) {
48 if (tmp->owner == owner && tmp->sym == sym
49 && !strcmp(tmp->name, name))
50 return 1;
51 } END_FOR_EACH_PTR(tmp);
52 return 0;
55 void free_tracker_list(struct tracker_list **list)
57 __free_ptr_list((struct ptr_list **)list);
60 void free_trackers_and_list(struct tracker_list **list)
62 struct tracker *tmp;
64 FOR_EACH_PTR(*list, tmp) {
65 free_string(tmp->name);
66 __free_tracker(tmp);
67 } END_FOR_EACH_PTR(tmp);
68 free_tracker_list(list);