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"
23 /*@access exprNode @*/
25 static/*@out@*/ constraintTerm new_constraintTermExpr (void)
28 ret = dmalloc (sizeof (* ret ) );
33 bool constraintTerm_isIntLiteral (constraintTerm term)
35 llassert(term != NULL);
37 if (term->kind == INTLITERAL)
43 bool constraintTerm_isStringLiteral (constraintTerm c) /*@*/
46 if (c->kind == EXPRNODE)
48 if (exprNode_knownStringValue(c->value.expr) )
56 cstring constraintTerm_getStringLiteral (constraintTerm c)
59 llassert (constraintTerm_isStringLiteral (c) );
60 llassert (c->kind == EXPRNODE);
62 return (cstring_copy ( multiVal_forceString (exprNode_getValue (c->value.expr) ) ) );
65 constraintTerm constraintTerm_simplify (/*@returned@*/ constraintTerm term) /*@modifies term@*/
67 if (term->kind == EXPRNODE)
69 if ( exprNode_knownIntValue (term->value.expr ) )
72 temp = exprNode_getLongValue (term->value.expr);
73 term->value.intlit = (int)temp;
74 term->kind = INTLITERAL;
80 fileloc constraintTerm_getFileloc (constraintTerm t)
82 return (fileloc_copy (t->loc) );
85 constraintTerm constraintTerm_makeExprNode (/*@only@*/ exprNode e)
87 constraintTerm ret = new_constraintTermExpr();
88 ret->loc = exprNode_getfileloc(e);
91 ret = constraintTerm_simplify(ret);
95 /*@only@*/ constraintTerm constraintTerm_makesRef (/*@only@*/ sRef s)
97 constraintTerm ret = new_constraintTermExpr();
98 ret->loc = fileloc_undefined;
101 ret = constraintTerm_simplify(ret);
105 constraintTerm constraintTerm_copy (constraintTerm term)
108 ret = new_constraintTermExpr();
109 ret->loc = fileloc_copy (term->loc);
110 constraintTermValue_copy (ret->value, term->value);
111 ret->kind = term->kind;
115 constraintTerm constraintTerm_setFileloc (/*@returned@*/ constraintTerm term, fileloc loc)
117 llassert(term != NULL);
118 term->loc = fileloc_copy(loc);
123 cstring constraintTerm_getName (constraintTerm term)
126 s = cstring_undefined;
128 llassert (term != NULL);
134 s = message ("%s", exprNode_unparse (term->value.expr) );
137 s = message (" %d ", term->value.intlit);
141 s = message ("%s", sRef_unparse (term->value.sref) );
154 constraintTerm_doSRefFixBaseParam (constraintTerm term, exprNodeList arglist) /*@modifies term->value@*/
156 llassert (term != NULL);
162 // s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
163 // fileloc_unparse (term->loc) );
166 // s = message (" %d ", term->value.intlit);
170 term->value.sref = sRef_fixBaseParam (term->value.sref, arglist);
171 // s = message ("%s ", sRef_unparse (term->value.sref) );
181 cstring constraintTerm_print (constraintTerm term) /*@*/
184 s = cstring_undefined;
186 llassert (term != NULL);
192 s = message ("%s @ %s ", exprNode_unparse (term->value.expr),
193 fileloc_unparse (term->loc) );
196 s = message (" %d ", term->value.intlit);
200 s = message ("%s ", sRef_unparseDebug (term->value.sref) );
211 constraintTerm constraintTerm_makeIntLiteral (int i)
213 constraintTerm ret = new_constraintTermExpr();
214 ret->value.intlit = i;
215 ret->kind = INTLITERAL;
216 ret->loc = fileloc_undefined;
220 bool constraintTerm_canGetValue (constraintTerm term)
222 if (term->kind == INTLITERAL)
228 int constraintTerm_getValue (constraintTerm term)
230 llassert (term->kind == INTLITERAL);
231 return term->value.intlit;
236 /* same and similar are similar but not the same*/
238 bool constraintTerm_same (constraintTerm term1, constraintTerm term2)
240 llassert (term1 !=NULL && term2 !=NULL);
242 if ( (term1->kind != term2->kind) || (term1->kind != EXPRNODE) )
248 ("Comparing srefs for %s and %s ", constraintTerm_print(term1), constraintTerm_print(term2)
253 if (sRef_same (term1->value.expr->sref, term2->value.expr->sref) )
255 DPRINTF ((message (" %s and %s are same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));
260 DPRINTF ((message (" %s and %s are not same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));
266 /*@exposed@*/ sRef constraintTerm_getsRef (constraintTerm t)
268 llassert (t != NULL);
269 if (t->kind == EXPRNODE)
271 return exprNode_getSref(t->value.expr);
276 return t->value.sref;
279 return sRef_undefined;
282 bool constraintTerm_probSame (constraintTerm term1, constraintTerm term2)
286 llassert (term1 !=NULL && term2 !=NULL);
289 ("Comparing srefs for %s and %s ", constraintTerm_print(term1), constraintTerm_print(term2)
294 s1 = constraintTerm_getName (term1);
295 s2 = constraintTerm_getName (term2);
297 if (cstring_equal (s1, s2) )
299 DPRINTF ((message (" %s and %s are same", s1, s2 ) ) );
304 DPRINTF ((message (" %s and %s are not same", s1, s2 ) ) );
309 bool constraintTerm_similar (constraintTerm term1, constraintTerm term2)
313 llassert (term1 !=NULL && term2 !=NULL);
315 if ( (term1->kind == INTLITERAL) && (term2->kind == INTLITERAL) )
318 llassert (constraintTerm_canGetValue(term1) );
319 t1 = constraintTerm_getValue (term1);
321 llassert (constraintTerm_canGetValue(term2) );
322 t2 = constraintTerm_getValue (term2);
329 s1 = constraintTerm_getsRef (term1);
330 s2 = constraintTerm_getsRef (term2);
338 ("Comparing srefs for %s and %s ", constraintTerm_print(term1), constraintTerm_print(term2)
343 if (sRef_similarRelaxed(s1, s2) || sRef_sameName (s1, s2) )
345 DPRINTF ((message (" %s and %s are same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));
350 DPRINTF ((message (" %s and %s are not same", constraintTerm_print(term1), constraintTerm_print(term2) ) ));