sval: delete unused filter_range_list() function
[smatch.git] / smatch_estate.c
blob4fca2d5de768d7093485c3280a02c31c7343e01e
1 /*
2 * smatch/smatch_dinfo.c
4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
11 * smatch_dinfo.c has helper functions for handling data_info structs
15 #include <stdlib.h>
16 #ifndef __USE_ISOC99
17 #define __USE_ISOC99
18 #endif
19 #include <limits.h>
20 #include "parse.h"
21 #include "smatch.h"
22 #include "smatch_slist.h"
23 #include "smatch_extra.h"
25 struct smatch_state estate_undefined = {
26 .name = "unknown"
29 struct data_info *get_dinfo(struct smatch_state *state)
31 if (!state)
32 return NULL;
33 return (struct data_info *)state->data;
36 struct range_list_sval *estate_ranges_sval(struct smatch_state *state)
38 if (!state)
39 return NULL;
40 return get_dinfo(state)->value_ranges;
43 struct related_list *estate_related(struct smatch_state *state)
45 if (!state)
46 return NULL;
47 return get_dinfo(state)->related;
50 sval_t estate_min_sval(struct smatch_state *state)
52 return rl_min_sval(estate_ranges_sval(state));
55 sval_t estate_max_sval(struct smatch_state *state)
57 return rl_max_sval(estate_ranges_sval(state));
60 static int rlists_equiv(struct related_list *one, struct related_list *two)
62 struct relation *one_rel;
63 struct relation *two_rel;
65 PREPARE_PTR_LIST(one, one_rel);
66 PREPARE_PTR_LIST(two, two_rel);
67 for (;;) {
68 if (!one_rel && !two_rel)
69 return 1;
70 if (!one_rel || !two_rel)
71 return 0;
72 if (one_rel->sym != two_rel->sym)
73 return 0;
74 if (strcmp(one_rel->name, two_rel->name))
75 return 0;
76 NEXT_PTR_LIST(one_rel);
77 NEXT_PTR_LIST(two_rel);
79 FINISH_PTR_LIST(two_rel);
80 FINISH_PTR_LIST(one_rel);
82 return 1;
85 int estates_equiv(struct smatch_state *one, struct smatch_state *two)
87 if (one == two)
88 return 1;
89 if (!rlists_equiv(estate_related(one), estate_related(two)))
90 return 0;
91 if (strcmp(one->name, two->name) == 0)
92 return 1;
93 return 0;
96 static struct data_info *alloc_dinfo(void)
98 struct data_info *ret;
100 ret = __alloc_data_info(0);
101 ret->related = NULL;
102 ret->type = DATA_RANGE;
103 ret->value_ranges = NULL;
104 return ret;
107 static struct data_info *alloc_dinfo_range(sval_t min, sval_t max)
109 struct data_info *ret;
111 ret = alloc_dinfo();
112 add_range_sval(&ret->value_ranges, min, max);
113 return ret;
116 static struct data_info *alloc_dinfo_range_list(struct range_list_sval *rl)
118 struct data_info *ret;
120 ret = alloc_dinfo();
121 ret->value_ranges = rl;
122 return ret;
125 static struct data_info *clone_dinfo(struct data_info *dinfo)
127 struct data_info *ret;
129 ret = alloc_dinfo();
130 ret->related = clone_related_list(dinfo->related);
131 ret->value_ranges = clone_range_list_sval(dinfo->value_ranges);
132 return ret;
135 struct smatch_state *clone_estate(struct smatch_state *state)
137 struct smatch_state *ret;
139 ret = __alloc_smatch_state(0);
140 ret->name = state->name;
141 ret->data = clone_dinfo(get_dinfo(state));
142 return ret;
145 struct smatch_state *alloc_estate_empty(void)
147 struct smatch_state *state;
148 struct data_info *dinfo;
150 dinfo = alloc_dinfo();
151 state = __alloc_smatch_state(0);
152 state->data = dinfo;
153 state->name = "";
154 return state;
157 /* We do this because ->value_ranges is a list */
158 struct smatch_state *extra_undefined(void)
160 return &estate_undefined;
163 struct smatch_state *extra_empty(void)
165 struct smatch_state *ret;
167 ret = __alloc_smatch_state(0);
168 ret->name = "empty";
169 ret->data = alloc_dinfo();
170 return ret;
173 struct smatch_state *alloc_estate_sval(sval_t sval)
175 struct smatch_state *state;
177 state = __alloc_smatch_state(0);
178 state->data = alloc_dinfo_range(sval, sval);
179 state->name = show_ranges_sval(get_dinfo(state)->value_ranges);
180 return state;
183 struct smatch_state *alloc_estate_range_sval(sval_t min, sval_t max)
185 struct smatch_state *state;
187 state = __alloc_smatch_state(0);
188 state->data = alloc_dinfo_range(min, max);
189 state->name = show_ranges_sval(get_dinfo(state)->value_ranges);
190 return state;
193 struct smatch_state *alloc_estate_range_list_sval(struct range_list_sval *rl)
195 struct smatch_state *state;
197 if (!rl)
198 return extra_empty();
200 state = __alloc_smatch_state(0);
201 state->data = alloc_dinfo_range_list(rl);
202 state->name = show_ranges_sval(rl);
203 return state;
206 void alloc_estate_undefined(void)
208 static struct data_info dinfo = {
209 .type = DATA_RANGE
212 dinfo.value_ranges = clone_permanent_sval(whole_range_list_sval(&llong_ctype));
213 estate_undefined.data = &dinfo;