2 ** LCLint - annotation-assisted static program checker
3 ** Copyright (C) 1994-2001 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 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
25 ** functionConstraint.c
28 # include "lclintMacros.nf"
30 # include "mtincludes.h"
32 static /*@only@*/ /*@notnull@*/ /*@special@*/ functionConstraint /*@i32 need special? @*/
33 functionConstraint_alloc (functionConstraintKind kind) /*@defines result->kind@*/
35 functionConstraint res = (functionConstraint) dmalloc (sizeof (*res));
41 extern functionConstraint functionConstraint_createBufferConstraint (constraintList buf)
43 functionConstraint res = functionConstraint_alloc (FCT_BUFFER);
44 res->constraint.buffer = buf;
48 extern functionConstraint functionConstraint_createMetaStateConstraint (metaStateConstraint msc)
50 functionConstraint res = functionConstraint_alloc (FCT_METASTATE);
51 res->constraint.metastate = msc;
55 extern functionConstraint functionConstraint_conjoin (functionConstraint f1, functionConstraint f2)
57 functionConstraint res = functionConstraint_alloc (FCT_CONJUNCT);
58 res->constraint.conjunct.op1 = f1;
59 res->constraint.conjunct.op2 = f2;
60 DPRINTF (("Conjoining ==> %s",
61 functionConstraint_unparse (res)));
65 /*@only@*/ cstring functionConstraint_unparse (functionConstraint p)
67 if (functionConstraint_isDefined (p))
72 return constraintList_unparse (p->constraint.buffer);
74 return metaStateConstraint_unparse (p->constraint.metastate);
76 return message ("%q /\\ %q",
77 functionConstraint_unparse (p->constraint.conjunct.op1),
78 functionConstraint_unparse (p->constraint.conjunct.op2));
85 return cstring_makeLiteral ("< empty constraint >");
89 extern constraintList functionConstraint_getBufferConstraint (functionConstraint node)
91 llassert (functionConstraint_isDefined (node));
93 if (node->kind == FCT_CONJUNCT)
95 if (functionConstraint_hasBufferConstraint (node->constraint.conjunct.op1))
97 return functionConstraint_getBufferConstraint (node->constraint.conjunct.op1);
101 llassert (functionConstraint_hasBufferConstraint (node->constraint.conjunct.op2));
102 return functionConstraint_getBufferConstraint (node->constraint.conjunct.op2);
106 llassert (node->kind == FCT_BUFFER);
107 return node->constraint.buffer;
110 extern metaStateConstraint functionConstraint_getMetaStateConstraint (functionConstraint node)
112 llassert (functionConstraint_isDefined (node));
114 if (node->kind == FCT_CONJUNCT)
116 if (functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op1))
118 return functionConstraint_getMetaStateConstraint (node->constraint.conjunct.op1);
122 llassert (functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op2));
123 return functionConstraint_getMetaStateConstraint (node->constraint.conjunct.op2);
127 llassert (node->kind == FCT_METASTATE);
128 return node->constraint.metastate;
131 extern bool functionConstraint_hasBufferConstraint (functionConstraint node)
133 if (functionConstraint_isDefined (node))
135 return node->kind == FCT_BUFFER
136 || (node->kind == FCT_CONJUNCT
137 && (functionConstraint_hasBufferConstraint (node->constraint.conjunct.op1)
138 || functionConstraint_hasBufferConstraint (node->constraint.conjunct.op2)));
146 extern bool functionConstraint_hasMetaStateConstraint (functionConstraint node)
148 if (functionConstraint_isDefined (node))
150 return node->kind == FCT_METASTATE
151 || (node->kind == FCT_CONJUNCT
152 && (functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op1)
153 || functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op2)));
161 extern functionConstraint functionConstraint_copy (functionConstraint node)
163 if (functionConstraint_isDefined (node))
168 return functionConstraint_createBufferConstraint (constraintList_copy (node->constraint.buffer));
170 return functionConstraint_createMetaStateConstraint (metaStateConstraint_copy (node->constraint.metastate));
172 return functionConstraint_conjoin (functionConstraint_copy (node->constraint.conjunct.op1),
173 functionConstraint_copy (node->constraint.conjunct.op2));
180 return functionConstraint_undefined;
184 extern void functionConstraint_free (/*@only@*/ functionConstraint node)
186 if (functionConstraint_isDefined (node))
191 constraintList_free (node->constraint.buffer);
194 metaStateConstraint_free (node->constraint.metastate);
197 functionConstraint_free (node->constraint.conjunct.op1);
198 functionConstraint_free (node->constraint.conjunct.op2);