]> andersk Git - splint.git/blame - src/constraintList.c
Readded files.
[splint.git] / src / constraintList.c
CommitLineData
616915dd 1/*
2** LCLint - annotation-assisted static program checker
3** Copyright (C) 1994-2000 University of Virginia,
4** Massachusetts Institute of Technology
5**
6** This program is free software; you can redistribute it and/or modify it
7** under the terms of the GNU General Public License as published by the
8** Free Software Foundation; either version 2 of the License, or (at your
9** option) any later version.
10**
11** This program is distributed in the hope that it will be useful, but
12** WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14** General Public License for more details.
15**
16** The GNU General Public License is available from http://www.gnu.org/ or
17** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18** MA 02111-1307, USA.
19**
20** For information on lclint: lclint-request@cs.virginia.edu
21** To report a bug: lclint-bug@cs.virginia.edu
22** For more information: http://lclint.cs.virginia.edu
23*/
24/*
25** constraintList.c
26**
27** based on list_template.c
28**
29** where T has T_equal (or change this) and T_unparse
30*/
31
32# include "lclintMacros.nf"
33# include "llbasic.h"
34
35constraintList constraintList_new ()
36{
37 constraintList s = (constraintList) dmalloc (sizeof (*s));
38
39 s->nelements = 0;
40 s->nspace = constraintListBASESIZE;
41 s->elements = (constraint *)
42 dmalloc (sizeof (*s->elements) * constraintListBASESIZE);
43
44 return (s);
45}
46
47static void
48constraintList_grow (constraintList s)
49{
50 int i;
51 constraint *newelements;
52
53 s->nspace += constraintListBASESIZE;
54 newelements = (constraint *) dmalloc (sizeof (*newelements)
55 * (s->nelements + s->nspace));
56
57 for (i = 0; i < s->nelements; i++)
58 {
59 newelements[i] = s->elements[i];
60 }
61
62 sfree (s->elements);
63 s->elements = newelements;
64}
65
66/* void constraintList_exprNodemerge(void) */
67/* { */
68/* } */
69constraintList
70constraintList_add (constraintList s, constraint el)
71{
72 if (resolve (el, s) )
73 return s;
74
75 if (s->nspace <= 0)
76 constraintList_grow (s);
77
78 s->nspace--;
79 s->elements[s->nelements] = el;
80 s->nelements++;
81 return s;
82}
83
84constraintList constraintList_addList (constraintList s, constraintList new)
85{
86 llassert(s);
87 llassert(new);
88
89 if (new == constraintList_undefined)
90 return s;
91
92 constraintList_elements(new, elem)
93 {
94 s = constraintList_add (s, elem);
95 }
96 end_constraintList_elements
97 return s;
98}
99
100cstring
101constraintList_print (constraintList s) /*@*/
102{
103 int i;
104 cstring st = cstring_undefined;
105 bool first = TRUE;
106
107 if (s->nelements == 0)
108 st = cstring_makeLiteral("<List Empty>");
109
110 for (i = 0; i < s->nelements; i++)
111 {
112 cstring type = cstring_undefined;
113 constraint current = s->elements[i];
114
115 if (current != NULL)
116 {
117 cstring temp1 = constraint_print(current);
118 type = message ("%q %q\n", type, temp1 );
119 }
120
121 if (first)
122 {
123 st = type;
124 first = FALSE;
125 }
126 else
127 {
128 st = message ("%q, %q", st, type);
129 }
130 }
131 return st;
132}
133
134void constraintList_printError (constraintList s, fileloc loc)
135{
136
137 constraintList_elements (s, elem)
138 {
139 if (elem != NULL)
140 {
141 constraint_printError (elem, loc);
142 }
143 }
144 end_constraintList_elements;
145 return;
146}
147
148cstring
149constraintList_printDetailed (constraintList s)
150{
151 int i;
152 cstring st = cstring_undefined;
153 bool first = TRUE;
154
155 if (s->nelements == 0)
156 st = cstring_makeLiteral("<List Empty>");
157
158 for (i = 0; i < s->nelements; i++)
159 {
160 cstring type = cstring_undefined;
161 constraint current = s->elements[i];
162
163 if (current != NULL)
164 {
165 cstring temp1 = constraint_printDetailed (current);
166 type = message ("%s %s\n", type, temp1 );
167 }
168
169 if (first)
170 {
171 st = type;
172 first = FALSE;
173 }
174 else
175 {
176 st = message ("%s %s", st, type);
177 }
178 }
179 return st;
180}
181
182/*{ x: constraint | (x in l1 -> resolve (x, l2) || (x in l2 -> resolve (x, l1)
183} */
184
185constraintList
186constraintList_logicalOr (constraintList l1, constraintList l2)
187{
188 constraint temp;
189 constraintList ret;
190 DPRINTF ( (message ("Logical of on %s and %s",
191 constraintList_print(l1),
192 constraintList_print(l2)) ) );
193
194 ret = constraintList_new();
195 constraintList_elements (l1, el)
196 {
197 temp = substitute (el, l2);
198
199 if (resolve (el, l2) || resolve(temp,l2) )
200 { /*avoid redundant constraints*/
201 if (!resolve (el, ret) )
202 ret = constraintList_add (ret, el);
203 }
204 }
205 end_constraintList_elements;
206
207 constraintList_elements (l2, el)
208 {
209 temp = substitute (el, l1);
210
211 if (resolve (el, l1) || resolve(temp,l1) )
212 {
213 /*avoid redundant constraints*/
214 if (!resolve (el, ret) )
215 ret = constraintList_add (ret, el);
216 }
217 }
218 end_constraintList_elements;
219
220
221 return ret;
222}
223
224void
225constraintList_free (constraintList s)
226{
227 int i;
228 for (i = 0; i < s->nelements; i++)
229 {
230 // constraint_free (s->elements[i]);
231 }
232
233 sfree (s->elements);
234 sfree (s);
235}
236
237constraintList
238constraintList_copy (constraintList s)
239{
240 constraintList ret = constraintList_new ();
241
242 constraintList_elements (s, el)
243 {
244 ret = constraintList_add (ret, constraint_copy (el));
245 } end_constraintList_elements;
246
247 return ret;
248}
249
250constraintList constraintList_preserveOrig (constraintList c)
251{
252 constraintList_elements (c, el)
253 {
254 el = constraint_preserveOrig (el);
255 }
256 end_constraintList_elements;
257 return c;
258}
259
260constraintList constraintList_doFixResult (constraintList postconditions, exprNode fcnCall)
261{
262 constraintList ret;
263 ret = constraintList_new();
264 constraintList_elements (postconditions, el)
265 {
266 ret = constraintList_add (ret, constraint_doFixResult (el, fcnCall) );
267 }
268 end_constraintList_elements;
269
270 return ret;
271}
272
273constraintList constraintList_doSRefFixConstraintParam (constraintList preconditions, exprNodeList arglist)
274{
275 constraintList ret;
276 ret = constraintList_new();
277
278 constraintList_elements (preconditions, el)
279 {
280 ret = constraintList_add(ret, constraint_doSRefFixConstraintParam (el, arglist) );
281 }
282 end_constraintList_elements;
283
284 return ret;
285}
286constraintList constraintList_doSRefFixBaseParam (constraintList preconditions,
287 exprNodeList arglist)
288{
289 constraintList ret;
290 ret = constraintList_new();
291
292 constraintList_elements (preconditions, el)
293 {
294 ret = constraintList_add(ret, constraint_doSRefFixBaseParam (el, arglist) );
295 }
296 end_constraintList_elements;
297
298 return ret;
299}
300
301constraintList constraintList_togglePost (/*@returned@*/ constraintList c)
302{
303 constraintList_elements (c, el)
304 {
305 el->post = !el->post;
306 }
307 end_constraintList_elements;
308 return c;
309}
310
311
This page took 0.134295 seconds and 5 git commands to generate.