7 # include <ctype.h> /* for isdigit */
8 # include "lclintMacros.nf"
10 # include "cgrammar.h"
11 # include "cgrammar_tokens.h"
13 # include "exprChecks.h"
14 # include "aliasChecks.h"
15 # include "exprNodeSList.h"
17 //# include "exprData.i"
21 //#include "constraintExpr.h"
24 constraintTerm new_constraintTermExpr (void)
27 ret = dmalloc (sizeof (* ret ) );
32 bool constraintTerm_isIntLiteral (constraintTerm term)
36 if (term->kind == INTLITERAL)
42 bool constraintTerm_isStringLiteral (constraintTerm c)
45 if (c->kind == EXPRNODE)
47 if (exprNode_knownStringValue(c->value.expr) )
55 cstring constraintTerm_getStringLiteral (constraintTerm c)
58 llassert (constraintTerm_isStringLiteral (c) );
59 llassert (c->kind == EXPRNODE);
61 return ( multiVal_forceString (exprNode_getValue (c->value.expr) ) );
64 constraintTerm constraintTerm_simplify (constraintTerm term)
66 if (term->kind == EXPRNODE)
68 if ( exprNode_knownIntValue (term->value.expr ) )
71 temp = exprNode_getLongValue (term->value.expr);
72 term->value.intlit = temp;
73 term->kind = INTLITERAL;
79 fileloc constraintTerm_getFileloc (constraintTerm t)
81 return (fileloc_copy (t->loc) );
84 constraintTerm constraintTerm_makeExprNode (/*@only@*/ exprNode e)
86 constraintTerm ret = new_constraintTermExpr();
87 ret->loc = exprNode_getfileloc(e);
90 ret = constraintTerm_simplify(ret);
94 constraintTerm constraintTerm_makesRef (/*@only@*/ sRef s)
96 constraintTerm ret = new_constraintTermExpr();
97 ret->loc = fileloc_undefined;
100 ret = constraintTerm_simplify(ret);
104 constraintTerm constraintTerm_copy (constraintTerm term)
107 ret = new_constraintTermExpr();
108 ret->loc = fileloc_copy (term->loc);
109 ret->value= term->value;
110 ret->kind = term->kind;
114 constraintTerm constraintTerm_setFileloc (constraintTerm term, fileloc loc)
117 term->loc = fileloc_copy(loc);
122 cstring constraintTerm_getName (constraintTerm term)
125 s = cstring_undefined;
127 llassert (term != NULL);
133 s = message ("%s", exprNode_unparse (term->value.expr) );
136 s = message (" %d ", term->value.intlit);
140 s = message ("%s", sRef_unparse (term->value.sref) );
149 constraintTerm_doFixResult (constraintExpr e, exprNode fcnCall)
153 constraintExprData data = e->data;
155 constraintExprKind kind = e->kind;
159 llassert(kind == term);
161 t = constraintExprData_termGetTerm (data);
162 llassert (t != NULL);
174 if (s->kind == SK_RESULT)
176 ret = constraintExpr_makeExprNode(fcnCall);
185 constraintTerm_doSRefFixBaseParam (constraintTerm term, exprNodeList arglist)
187 llassert (term != NULL);
193 // s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
194 // fileloc_unparse (term->loc) );
197 // s = message (" %d ", term->value.intlit);
201 term->value.sref = sRef_fixBaseParam (term->value.sref, arglist);
202 // s = message ("%s ", sRef_unparse (term->value.sref) );
211 constraintTerm_doSRefFixConstraintParam (constraintExpr e, exprNodeList arglist)
215 constraintExprData data = e->data;
217 constraintExprKind kind = e->kind;
221 llassert(kind == term);
223 t = constraintExprData_termGetTerm (data);
224 llassert (t != NULL);
231 // s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
232 // fileloc_unparse (term->loc) );
235 // s = message (" %d ", term->value.intlit);
239 ret = sRef_fixConstraintParam (t->value.sref, arglist);
241 // s = message ("%s ", sRef_unparse (term->value.sref) );
249 cstring constraintTerm_print (constraintTerm term) /*@*/
252 s = cstring_undefined;
254 llassert (term != NULL);
260 s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
261 fileloc_unparse (term->loc) );
264 s = message (" %d ", term->value.intlit);
268 s = message ("%s ", sRef_unparseDebug (term->value.sref) );
277 constraintTerm constraintTerm_makeIntLiteral (int i)
279 constraintTerm ret = new_constraintTermExpr();
280 ret->value.intlit = i;
281 ret->kind = INTLITERAL;
282 ret->loc = fileloc_undefined;
286 bool constraintTerm_canGetValue (constraintTerm term)
288 if (term->kind == INTLITERAL)
294 int constraintTerm_getValue (constraintTerm term)
296 llassert (term->kind == INTLITERAL);
297 return term->value.intlit;
302 /* same and similar are similar but not the same*/
304 bool constraintTerm_same (constraintTerm term1, constraintTerm term2)
306 llassert (term1 !=NULL && term2 !=NULL);
308 if ( (term1->kind != term2->kind) || (term1->kind != EXPRNODE) )
314 ("Comparing srefs for %s and %s ", constraintTerm_print(term1), constraintTerm_print(term2)
319 if (sRef_same (term1->value.expr->sref, term2->value.expr->sref) )
321 DPRINTF ((message (" %s and %s are same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));
326 DPRINTF ((message (" %s and %s are not same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));
332 sRef constraintTerm_getsRef (constraintTerm t)
335 if (t->kind == EXPRNODE)
337 return t->value.expr->sref;
342 return t->value.sref;
345 return sRef_undefined;
348 bool constraintTerm_probSame (constraintTerm term1, constraintTerm term2)
352 llassert (term1 !=NULL && term2 !=NULL);
355 ("Comparing srefs for %s and %s ", constraintTerm_print(term1), constraintTerm_print(term2)
360 s1 = constraintTerm_getName (term1);
361 s2 = constraintTerm_getName (term2);
363 if (cstring_equal (s1, s2) )
365 DPRINTF ((message (" %s and %s are same", s1, s2 ) ) );
370 DPRINTF ((message (" %s and %s are not same", s1, s2 ) ) );
375 bool constraintTerm_similar (constraintTerm term1, constraintTerm term2)
379 llassert (term1 !=NULL && term2 !=NULL);
381 s1 = constraintTerm_getsRef (term1);
382 s2 = constraintTerm_getsRef (term2);
390 ("Comparing srefs for %s and %s ", constraintTerm_print(term1), constraintTerm_print(term2)
395 if (sRef_similarRelaxed(s1, s2) || sRef_sameName (s1, s2) )
397 DPRINTF ((message (" %s and %s are same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));
402 DPRINTF ((message (" %s and %s are not same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));