Makefile: do not install sparse and cgcc
[smatch.git] / smatch_estate.c
blob22e67fd104fae39fd9da66c9dfd37851cfc9e0f2
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_info *get_dinfo(struct smatch_state *state)
27 if (!state)
28 return NULL;
29 return (struct data_info *)state->data;
33 struct range_list *estate_ranges(struct smatch_state *state)
35 if (!state)
36 return NULL;
37 return get_dinfo(state)->value_ranges;
40 struct related_list *estate_related(struct smatch_state *state)
42 if (!state)
43 return NULL;
44 return get_dinfo(state)->related;
47 long long estate_min(struct smatch_state *state)
49 return rl_min(estate_ranges(state));
52 long long estate_max(struct smatch_state *state)
54 return rl_max(estate_ranges(state));
57 static struct data_info *alloc_dinfo(void)
59 struct data_info *ret;
61 ret = __alloc_data_info(0);
62 ret->related = NULL;
63 ret->type = DATA_RANGE;
64 ret->value_ranges = NULL;
65 return ret;
68 static struct data_info *alloc_dinfo_range(long long min, long long max)
70 struct data_info *ret;
72 ret = alloc_dinfo();
73 add_range(&ret->value_ranges, min, max);
74 return ret;
77 static struct data_info *alloc_dinfo_range_list(struct range_list *rl)
79 struct data_info *ret;
81 ret = alloc_dinfo();
82 ret->value_ranges = rl;
83 return ret;
86 static struct data_info *clone_dinfo(struct data_info *dinfo)
88 struct data_info *ret;
90 ret = alloc_dinfo();
91 ret->related = clone_related_list(dinfo->related);
92 ret->value_ranges = clone_range_list(dinfo->value_ranges);
93 return ret;
96 struct smatch_state *clone_estate(struct smatch_state *state)
98 struct smatch_state *ret;
100 ret = __alloc_smatch_state(0);
101 ret->name = state->name;
102 ret->data = clone_dinfo(get_dinfo(state));
103 return ret;
106 struct smatch_state *alloc_estate_empty(void)
108 struct smatch_state *state;
109 struct data_info *dinfo;
111 dinfo = alloc_dinfo();
112 state = __alloc_smatch_state(0);
113 state->data = dinfo;
114 state->name = "";
115 return state;
118 static struct smatch_state *alloc_estate_no_name(int val)
120 struct smatch_state *state;
122 state = __alloc_smatch_state(0);
123 state->data = (void *)alloc_dinfo_range(val, val);
124 return state;
127 /* We do this because ->value_ranges is a list */
128 struct smatch_state *extra_undefined(void)
130 struct smatch_state *ret;
132 ret = __alloc_smatch_state(0);
133 ret->data = alloc_dinfo_range(whole_range.min, whole_range.max);
134 ret->name = "unknown";
135 return ret;
138 struct smatch_state *extra_empty(void)
140 struct smatch_state *ret;
142 ret = __alloc_smatch_state(0);
143 ret->name = "empty";
144 ret->data = alloc_dinfo();
145 return ret;
148 struct smatch_state *alloc_estate(long long val)
150 struct smatch_state *state;
152 state = alloc_estate_no_name(val);
153 state->name = show_ranges(get_dinfo(state)->value_ranges);
154 return state;
157 struct smatch_state *alloc_estate_range(long long min, long long max)
159 struct smatch_state *state;
161 if (min == whole_range.min && max == whole_range.max)
162 return extra_undefined();
163 state = __alloc_smatch_state(0);
164 state->data = (void *)alloc_dinfo_range(min, max);
165 state->name = show_ranges(get_dinfo(state)->value_ranges);
166 return state;
169 struct smatch_state *alloc_estate_range_list(struct range_list *rl)
171 struct smatch_state *state;
173 if (!rl)
174 return extra_empty();
176 if (is_whole_range_rl(rl))
177 return extra_undefined();
179 state = __alloc_smatch_state(0);
180 state->data = (void *)alloc_dinfo_range_list(rl);
181 state->name = show_ranges(get_dinfo(state)->value_ranges);
182 return state;