constraints: fix set_equiv()
[smatch.git] / smatch_tracker.c
blob40eb83cf19ec080f266c0a72c2ef74f4902e9536
1 /*
2 * sparse/smatch_tracker.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 #include "smatch.h"
12 ALLOCATOR(tracker, "trackers");
14 struct tracker *alloc_tracker(int owner, const char *name, struct symbol *sym)
16 struct tracker *tmp;
18 tmp = __alloc_tracker(0);
19 tmp->name = alloc_string(name);
20 tmp->owner = owner;
21 tmp->sym = sym;
22 return tmp;
25 void add_tracker(struct tracker_list **list, int owner, const char *name,
26 struct symbol *sym)
28 struct tracker *tmp;
30 if (in_tracker_list(*list, owner, name, sym))
31 return;
32 tmp = alloc_tracker(owner, name, sym);
33 add_ptr_list(list, tmp);
36 void add_tracker_expr(struct tracker_list **list, int owner, struct expression *expr)
38 char *name;
39 struct symbol *sym;
41 name = get_variable_from_expr(expr, &sym);
42 if (!name || !sym)
43 goto free;
44 add_tracker(list, owner, name, sym);
45 free:
46 free_string(name);
49 static void free_tracker(struct tracker *t)
51 free_string(t->name);
52 __free_tracker(t);
56 void del_tracker(struct tracker_list **list, int owner, const char *name,
57 struct symbol *sym)
59 struct tracker *tmp;
61 FOR_EACH_PTR(*list, tmp) {
62 if (tmp->owner == owner && tmp->sym == sym
63 && !strcmp(tmp->name, name)) {
64 DELETE_CURRENT_PTR(tmp);
65 free_tracker(tmp);
66 return;
68 } END_FOR_EACH_PTR(tmp);
71 int in_tracker_list(struct tracker_list *list, int owner, const char *name,
72 struct symbol *sym)
74 struct tracker *tmp;
76 FOR_EACH_PTR(list, tmp) {
77 if (tmp->owner == owner && tmp->sym == sym
78 && !strcmp(tmp->name, name))
79 return 1;
80 } END_FOR_EACH_PTR(tmp);
81 return 0;
84 void free_tracker_list(struct tracker_list **list)
86 __free_ptr_list((struct ptr_list **)list);
89 void free_trackers_and_list(struct tracker_list **list)
91 struct tracker *tmp;
93 FOR_EACH_PTR(*list, tmp) {
94 free_tracker(tmp);
95 } END_FOR_EACH_PTR(tmp);
96 free_tracker_list(list);