ranges: rename get_single_value_from_dinfo() => estate_get_single_value()
[smatch.git] / smatch_estate.c
blob694fd615e8b73650aadd3cb1e1a52ad9a8d1ff15
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 data_range whole_range = {
26 .min = LLONG_MIN,
27 .max = LLONG_MAX,
30 struct data_info *get_dinfo(struct smatch_state *state)
32 if (!state)
33 return NULL;
34 return (struct data_info *)state->data;
38 struct range_list *estate_ranges(struct smatch_state *state)
40 if (!state)
41 return NULL;
42 return get_dinfo(state)->value_ranges;
45 struct related_list *estate_related(struct smatch_state *state)
47 if (!state)
48 return NULL;
49 return get_dinfo(state)->related;
52 long long estate_min(struct smatch_state *state)
54 return rl_min(estate_ranges(state));
57 long long estate_max(struct smatch_state *state)
59 return rl_max(estate_ranges(state));
62 static struct data_info *alloc_dinfo(void)
64 struct data_info *ret;
66 ret = __alloc_data_info(0);
67 ret->related = NULL;
68 ret->type = DATA_RANGE;
69 ret->value_ranges = NULL;
70 return ret;
73 static struct data_info *alloc_dinfo_range(long long min, long long max)
75 struct data_info *ret;
77 ret = alloc_dinfo();
78 add_range(&ret->value_ranges, min, max);
79 return ret;
82 static struct data_info *alloc_dinfo_range_list(struct range_list *rl)
84 struct data_info *ret;
86 ret = alloc_dinfo();
87 ret->value_ranges = rl;
88 return ret;
91 static struct data_info *clone_dinfo(struct data_info *dinfo)
93 struct data_info *ret;
95 ret = alloc_dinfo();
96 ret->related = clone_related_list(dinfo->related);
97 ret->value_ranges = clone_range_list(dinfo->value_ranges);
98 return ret;
101 struct smatch_state *clone_estate(struct smatch_state *state)
103 struct smatch_state *ret;
105 ret = __alloc_smatch_state(0);
106 ret->name = state->name;
107 ret->data = clone_dinfo(get_dinfo(state));
108 return ret;
111 struct smatch_state *alloc_estate_empty(void)
113 struct smatch_state *state;
114 struct data_info *dinfo;
116 dinfo = alloc_dinfo();
117 state = __alloc_smatch_state(0);
118 state->data = dinfo;
119 state->name = "";
120 return state;
123 static struct smatch_state *alloc_estate_no_name(int val)
125 struct smatch_state *state;
127 state = __alloc_smatch_state(0);
128 state->data = (void *)alloc_dinfo_range(val, val);
129 return state;
132 /* We do this because ->value_ranges is a list */
133 struct smatch_state *extra_undefined(void)
135 struct data_info *dinfo;
136 static struct smatch_state *ret;
137 static struct symbol *prev_func;
139 if (prev_func == cur_func_sym)
140 return ret;
141 prev_func = cur_func_sym;
143 dinfo = alloc_dinfo_range(whole_range.min, whole_range.max);
144 ret = __alloc_smatch_state(0);
145 ret->name = "unknown";
146 ret->data = dinfo;
147 return ret;
150 struct smatch_state *extra_empty(void)
152 static struct smatch_state *ret;
153 static struct symbol *prev_func;
155 if (prev_func == cur_func_sym)
156 return ret;
157 prev_func = cur_func_sym;
159 ret = __alloc_smatch_state(0);
160 ret->name = "empty";
161 ret->data = alloc_dinfo();
162 return ret;
165 struct smatch_state *alloc_estate(long long val)
167 struct smatch_state *state;
169 state = alloc_estate_no_name(val);
170 state->name = show_ranges(get_dinfo(state)->value_ranges);
171 return state;
174 struct smatch_state *alloc_estate_range(long long min, long long max)
176 struct smatch_state *state;
178 if (min == whole_range.min && max == whole_range.max)
179 return extra_undefined();
180 state = __alloc_smatch_state(0);
181 state->data = (void *)alloc_dinfo_range(min, max);
182 state->name = show_ranges(get_dinfo(state)->value_ranges);
183 return state;
186 struct smatch_state *alloc_estate_range_list(struct range_list *rl)
188 struct smatch_state *state;
190 if (!rl)
191 return extra_empty();
193 if (is_whole_range_rl(rl))
194 return extra_undefined();
196 state = __alloc_smatch_state(0);
197 state->data = (void *)alloc_dinfo_range_list(rl);
198 state->name = show_ranges(get_dinfo(state)->value_ranges);
199 return state;