2 * sparse/smatch_extra_helper.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 #include "smatch_extra.h"
13 ALLOCATOR(data_info
, "smatch extra data");
14 __DO_ALLOCATOR(long long, sizeof(long long), __alignof__(long long), "numbers", sm_num
);
16 void print_num_list(struct num_list
*list
)
22 FOR_EACH_PTR(list
, tmp
) {
26 } END_FOR_EACH_PTR(tmp
);
30 struct data_info
*alloc_data_info(long long num
)
32 struct data_info
*ret
;
34 ret
= __alloc_data_info(0);
39 add_num(&ret
->values
, num
);
43 void add_num(struct num_list
**list
, long long num
)
48 FOR_EACH_PTR(*list
, tmp
) {
51 else if (*tmp
== num
) {
54 new = __alloc_sm_num(0);
56 INSERT_CURRENT(new, tmp
);
59 } END_FOR_EACH_PTR(tmp
);
60 new = __alloc_sm_num(0);
62 add_ptr_list(list
, new);
65 struct num_list
*num_list_union(struct num_list
*one
, struct num_list
*two
)
68 struct num_list
*ret
= NULL
;
73 FOR_EACH_PTR(one
, tmp
) {
75 } END_FOR_EACH_PTR(tmp
);
76 FOR_EACH_PTR(two
, tmp
) {
78 } END_FOR_EACH_PTR(tmp
);
82 static int num_in_list(struct num_list
*list
, long long num
)
86 FOR_EACH_PTR(list
, tmp
) {
89 } END_FOR_EACH_PTR(tmp
);
93 int num_matches(struct data_info
*dinfo
, long long num
)
95 if (num_in_list(dinfo
->values
, num
))
101 * if it can be only one value return that, else return UNDEFINED
103 long long get_single_value(struct data_info
*dinfo
)
107 long long ret
= UNDEFINED
;
109 if (dinfo
->type
!= DATA_NUM
)
112 FOR_EACH_PTR(dinfo
->values
, tmp
) {
117 } END_FOR_EACH_PTR(tmp
);
121 int possibly_true(int comparison
, struct data_info
*dinfo
, int num
, int left
)
129 FOR_EACH_PTR(dinfo
->values
, tmp
) {
131 ret
= true_comparison(*tmp
, comparison
, num
);
133 ret
= true_comparison(num
, comparison
, *tmp
);
136 } END_FOR_EACH_PTR(tmp
);
140 int possibly_false(int comparison
, struct data_info
*dinfo
, int num
, int left
)
148 FOR_EACH_PTR(dinfo
->values
, tmp
) {
150 ret
= !true_comparison(*tmp
, comparison
, num
);
152 ret
= !true_comparison(num
, comparison
, *tmp
);
155 } END_FOR_EACH_PTR(tmp
);