2 ** Splint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2002 University of Virginia,
4 ** Massachusetts Institute of Technology
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.
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.
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.
20 ** For information on splint: info@splint.org
21 ** To report a bug: splint-bug@splint.org
22 ** For more information: http://www.splint.org
25 ** functionConstraint.c
28 # include "splintMacros.nf"
31 static /*@only@*/ /*@notnull@*/ /*@special@*/ functionConstraint /*@i32 need special? @*/
32 functionConstraint_alloc (functionConstraintKind kind) /*@defines result->kind@*/
34 functionConstraint res = (functionConstraint) dmalloc (sizeof (*res));
40 extern functionConstraint functionConstraint_createBufferConstraint (constraintList buf)
42 functionConstraint res = functionConstraint_alloc (FCT_BUFFER);
43 res->constraint.buffer = buf;
47 extern functionConstraint functionConstraint_createMetaStateConstraint (metaStateConstraint msc)
49 functionConstraint res = functionConstraint_alloc (FCT_METASTATE);
50 res->constraint.metastate = msc;
54 extern functionConstraint functionConstraint_conjoin (functionConstraint f1, functionConstraint f2)
56 functionConstraint res = functionConstraint_alloc (FCT_CONJUNCT);
57 res->constraint.conjunct.op1 = f1;
58 res->constraint.conjunct.op2 = f2;
59 DPRINTF (("Conjoining ==> %s",
60 functionConstraint_unparse (res)));
64 /*@only@*/ cstring functionConstraint_unparse (functionConstraint p)
66 if (functionConstraint_isDefined (p))
71 return constraintList_unparse (p->constraint.buffer);
73 return metaStateConstraint_unparse (p->constraint.metastate);
75 return message ("%q /\\ %q",
76 functionConstraint_unparse (p->constraint.conjunct.op1),
77 functionConstraint_unparse (p->constraint.conjunct.op2));
84 return cstring_makeLiteral ("< empty constraint >");
88 extern constraintList functionConstraint_getBufferConstraints (functionConstraint node)
90 if (functionConstraint_isDefined (node))
92 if (node->kind == FCT_CONJUNCT)
94 return constraintList_addListFree (functionConstraint_getBufferConstraints (node->constraint.conjunct.op1),
95 functionConstraint_getBufferConstraints (node->constraint.conjunct.op2));
99 if (node->kind == FCT_BUFFER)
101 return constraintList_copy (node->constraint.buffer);
105 return constraintList_undefined;
111 return constraintList_undefined;
115 extern metaStateConstraintList functionConstraint_getMetaStateConstraints (functionConstraint node)
117 if (functionConstraint_isDefined (node))
119 if (node->kind == FCT_CONJUNCT)
121 return metaStateConstraintList_append
122 (functionConstraint_getMetaStateConstraints (node->constraint.conjunct.op1),
123 functionConstraint_getMetaStateConstraints (node->constraint.conjunct.op2));
127 if (node->kind == FCT_METASTATE)
129 return metaStateConstraintList_single (node->constraint.metastate);
133 return metaStateConstraintList_undefined;
139 return metaStateConstraintList_undefined;
143 extern bool functionConstraint_hasBufferConstraint (functionConstraint node)
145 if (functionConstraint_isDefined (node))
147 return node->kind == FCT_BUFFER
148 || (node->kind == FCT_CONJUNCT
149 && (functionConstraint_hasBufferConstraint (node->constraint.conjunct.op1)
150 || functionConstraint_hasBufferConstraint (node->constraint.conjunct.op2)));
158 extern bool functionConstraint_hasMetaStateConstraint (functionConstraint node)
160 if (functionConstraint_isDefined (node))
162 return node->kind == FCT_METASTATE
163 || (node->kind == FCT_CONJUNCT
164 && (functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op1)
165 || functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op2)));
173 extern functionConstraint functionConstraint_copy (functionConstraint node)
175 if (functionConstraint_isDefined (node))
180 return functionConstraint_createBufferConstraint (constraintList_copy (node->constraint.buffer));
182 return functionConstraint_createMetaStateConstraint (metaStateConstraint_copy (node->constraint.metastate));
184 return functionConstraint_conjoin (functionConstraint_copy (node->constraint.conjunct.op1),
185 functionConstraint_copy (node->constraint.conjunct.op2));
192 return functionConstraint_undefined;
195 BADBRANCHRET (functionConstraint_undefined);
198 extern void functionConstraint_free (/*@only@*/ functionConstraint node)
200 if (functionConstraint_isDefined (node))
205 constraintList_free (node->constraint.buffer);
208 metaStateConstraint_free (node->constraint.metastate);
211 functionConstraint_free (node->constraint.conjunct.op1);
212 functionConstraint_free (node->constraint.conjunct.op2);