]> andersk Git - splint.git/blame - src/constraintExpr.c
do..while control flow fix in exprNode.c
[splint.git] / src / constraintExpr.c
CommitLineData
3aaedf88 1/*
2** constraintExpr.c
3*/
4
b7b694d6 5/* #define DEBUGPRINT 1 */
3aaedf88 6
7# include "lclintMacros.nf"
8# include "basic.h"
9# include "cgrammar.h"
10# include "cgrammar_tokens.h"
11
12# include "exprChecks.h"
3aaedf88 13# include "exprNodeSList.h"
14
3aaedf88 15/*@-czechfcns@*/
16
3aaedf88 17
18
28bf4b0b 19/*@access exprNode constraintExpr@*/
3aaedf88 20
920a3797 21
28bf4b0b 22static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/constraintExpr p_expr, int p_literal);
bb25bea6 23
920a3797 24
d46ce6a4 25/*@only@*/ static constraintExpr
28bf4b0b 26doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr p_e, /*@temp@*/ /*@observer@*/ exprNodeList p_arglist) /*@modifies p_e@*/;
c3e695ff 27
4ab867d6 28static /*@only@*/ constraintExpr
28bf4b0b 29doFixResultTerm (/*@only@*/ constraintExpr p_e, /*@exposed@*/ exprNode p_fcnCall)
30 /*@modifies p_e@*/;
b7b694d6 31
32
33/*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void)
34 /* @allocates result->data @ @sets result->kind @ */ ;
3aaedf88 35
d46ce6a4 36void constraintExpr_free (/*@only@*/ constraintExpr expr)
37{
38 if (constraintExpr_isDefined(expr) )
39 {
40 switch (expr->kind)
41 {
42 case unaryExpr:
43 constraintExprData_freeUnaryExpr(expr->data);
44 break;
45 case binaryexpr:
46 constraintExprData_freeBinaryExpr(expr->data);
47 break;
48 case term:
49 constraintExprData_freeTerm(expr->data);
50 break;
51 default:
52 BADEXIT;
53 }
bb25bea6 54
55 expr->data = NULL;
d46ce6a4 56 free (expr);
57 }
58 else
59 {
60 llcontbug(message("attempted to free null pointer in constraintExpr_free"));
61 }
62}
63
3aaedf88 64bool constraintExpr_isLit (constraintExpr expr)
65{
dc92450f 66 llassert (expr != NULL);
3aaedf88 67
68 if (expr->kind == term)
69 {
70 constraintTerm term = constraintExprData_termGetTerm (expr->data);
71 if (constraintTerm_isIntLiteral (term) )
72 {
73 return TRUE;
74 }
75
76 }
77 return FALSE;
78}
79
7c9c4a67 80static bool isZeroBinaryOp (constraintExpr expr)
81{
82 constraintExpr e2;
83
7272a1c1 84 llassert (expr != NULL); /* evans 2001-07-18 */
85
7c9c4a67 86 if (!constraintExpr_isBinaryExpr (expr) )
87 {
88 return FALSE;
89 }
90
91
92 e2 = constraintExprData_binaryExprGetExpr2(expr->data);
93
7272a1c1 94 llassert (e2 != NULL); /* evans 2001-07-18 */
95
7c9c4a67 96 if (constraintExpr_isBinaryExpr (e2) )
97 {
98 constraintExpr e1;
99 constraintExprBinaryOpKind op;
100
101 op = constraintExprData_binaryExprGetOp (e2->data);
102
103 e1 = constraintExprData_binaryExprGetExpr1(e2->data);
104
105 if (constraintExpr_isLit(e1) )
106 {
107 if (constraintExpr_getValue(e1) == 0 )
108 {
109 return TRUE;
110 }
111 }
112 }
113 return FALSE;
114}
115
116/* change expr + (o - expr) to (expr -expr) */
117
118/*@only@*/ static constraintExpr removeZero (/*@only@*/ /*@returned@*/ constraintExpr expr)
119{
120 constraintExpr expr1, expr2;
121
122 constraintExpr temp;
123
124 constraintExprBinaryOpKind op;
125
126 constraintExprBinaryOpKind tempOp;
127
128 if (!isZeroBinaryOp(expr) )
129 return expr;
130
7272a1c1 131 llassert (expr != NULL); /* evans 2001-07-18 */
7c9c4a67 132
133 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
134 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
135 op = constraintExprData_binaryExprGetOp(expr->data);
136
7272a1c1 137 llassert( constraintExpr_isBinaryExpr(expr2) );
138
7c9c4a67 139 temp = constraintExprData_binaryExprGetExpr2 (expr2->data);
140 temp = constraintExpr_copy (temp);
141
142 tempOp = constraintExprData_binaryExprGetOp (expr2->data);
143
0c91982e 144 if (op == BINARYOP_PLUS)
7c9c4a67 145 op = tempOp;
acfb6ad9 146 else if (op == BINARYOP_MINUS)
7c9c4a67 147 {
0c91982e 148 if (tempOp == BINARYOP_PLUS)
acfb6ad9 149 op = BINARYOP_MINUS;
150 else if (tempOp == BINARYOP_MINUS)
0c91982e 151 op = BINARYOP_PLUS;
7c9c4a67 152 else
153 BADEXIT;
154 }
155 else
156 BADEXIT;
157
7c9c4a67 158 expr->data = constraintExprData_binaryExprSetExpr2(expr->data, temp);
159 expr->data = constraintExprData_binaryExprSetOp(expr->data, op);
160
161 return expr;
162}
163
3aaedf88 164
d46ce6a4 165/*@only@*/ constraintExpr constraintExpr_propagateConstants (/*@only@*/ constraintExpr expr,
3aaedf88 166 /*@out@*/ bool * propagate,
167 /*@out@*/ int *literal)
168{
169 constraintExpr expr1;
170 constraintExpr expr2;
171 bool propagate1, propagate2;
172 int literal1, literal2;
d46ce6a4 173 constraintExprBinaryOpKind op;
3aaedf88 174
175 propagate1 = FALSE;
176 propagate2 = FALSE;
177
178 literal1 = 0;
179 literal2 = 0;
180
181 *propagate = FALSE;
182 *literal = 0;
183
a779b61e 184
dc92450f 185 llassert (expr != NULL);
3aaedf88 186
b7b694d6 187 /* we simplify unaryExpr elsewhere */
d46ce6a4 188 if (expr->kind != binaryexpr)
3aaedf88 189 return expr;
190
d46ce6a4 191 op = constraintExprData_binaryExprGetOp (expr->data);
3aaedf88 192
c3e695ff 193 DPRINTF( (message("constraintExpr_propagateConstants: binaryexpr: %s", constraintExpr_unparse(expr) ) ) );
7c9c4a67 194
195 expr = removeZero(expr);
3aaedf88 196
197 expr1 = constraintExprData_binaryExprGetExpr1(expr->data);
198 expr2 = constraintExprData_binaryExprGetExpr2(expr->data);
199
d46ce6a4 200 expr1 = constraintExpr_copy(expr1);
201 expr2 = constraintExpr_copy(expr2);
202
3aaedf88 203 expr1 = constraintExpr_propagateConstants (expr1, &propagate1, &literal1);
204 expr2 = constraintExpr_propagateConstants (expr2, &propagate2, &literal2);
205
a779b61e 206 expr1 = removeZero(expr1);
207 expr2 = removeZero(expr2);
208
209
3aaedf88 210 *propagate = propagate1 || propagate2;
7c9c4a67 211
0c91982e 212 if (op == BINARYOP_PLUS)
7c9c4a67 213 *literal = literal1 + literal2;
acfb6ad9 214 else if (op == BINARYOP_MINUS)
7c9c4a67 215 *literal = literal1 - literal2;
216 else
217 BADEXIT;
218
3aaedf88 219 if ( constraintExpr_isLit (expr1) && constraintExpr_isLit (expr2) )
220 {
b9904f57 221 long t1, t2;
3aaedf88 222 t1 = constraintExpr_getValue (expr1);
223 t2 = constraintExpr_getValue (expr2);
7c9c4a67 224 llassert(*propagate == FALSE);
3aaedf88 225 *propagate = FALSE;
a8e557d3 226
d46ce6a4 227 constraintExpr_free (expr);
228 constraintExpr_free (expr1);
229 constraintExpr_free (expr2);
230
0c91982e 231 if (op == BINARYOP_PLUS )
3aaedf88 232 return (constraintExpr_makeIntLiteral ( (t1+t2) ));
acfb6ad9 233 else if (op == BINARYOP_MINUS)
3aaedf88 234 return (constraintExpr_makeIntLiteral ( (t1-t2) ));
235 else
d46ce6a4 236 BADEXIT;
3aaedf88 237 }
d46ce6a4 238
239
3aaedf88 240 if (constraintExpr_isLit (expr1) )
241 {
3aaedf88 242 *propagate = TRUE;
d46ce6a4 243
7c9c4a67 244 *literal += constraintExpr_getValue (expr1);
d46ce6a4 245
0c91982e 246 if (op == BINARYOP_PLUS)
7c9c4a67 247 {
248 constraintExpr_free(expr1);
249 constraintExpr_free(expr);
250 return expr2;
251 }
acfb6ad9 252 else if (op == BINARYOP_MINUS)
7c9c4a67 253 {
a779b61e 254
7c9c4a67 255 constraintExpr temp;
256
257 /* this is an ugly kludge to deal with not
258 having a unary minus operation...*/
a779b61e 259
7c9c4a67 260 temp = constraintExpr_makeIntLiteral (0);
261 temp = constraintExpr_makeSubtractExpr (temp, expr2);
262
263 constraintExpr_free(expr1);
264 constraintExpr_free(expr);
265
266 return temp;
267 }
7272a1c1 268 else
269 {
270 BADBRANCH; /* evans 2001-07-18 */
271 }
3aaedf88 272 }
273
3aaedf88 274 if (constraintExpr_isLit (expr2) )
275 {
276 *propagate = TRUE;
a8e557d3 277
0c91982e 278 if ( op == BINARYOP_PLUS )
3aaedf88 279 *literal += constraintExpr_getValue (expr2);
acfb6ad9 280 else if (op == BINARYOP_MINUS)
3aaedf88 281 *literal -= constraintExpr_getValue (expr2);
7c9c4a67 282 else
283 BADEXIT;
284
d46ce6a4 285
286 constraintExpr_free(expr2);
287 constraintExpr_free(expr);
3aaedf88 288 return expr1;
289 }
3aaedf88 290
c3e695ff 291 DPRINTF( (message("constraintExpr_propagateConstants returning: %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 292
d46ce6a4 293 expr->data = constraintExprData_binaryExprSetExpr1 (expr->data, expr1);
294 expr->data = constraintExprData_binaryExprSetExpr2 (expr->data, expr2);
295
7c9c4a67 296 expr = removeZero(expr);
3aaedf88 297 return expr;
298}
299
bb25bea6 300/*@only@*/ static constraintExpr constraintExpr_combineConstants (/*@only@*/ constraintExpr expr ) /*@modifies expr@*/
3aaedf88 301{
302 bool propagate;
303 int literal;
304
c3e695ff 305 DPRINTF ( (message ("Before combine %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 306 expr = constraintExpr_propagateConstants (expr, &propagate, &literal);
307
308
309 if (propagate)
310 {
311 constraintExpr ret;
312
313 if (literal != 0)
314 {
315 ret = constraintExpr_makeBinaryOpConstraintExprIntLiteral (expr, literal);
316 expr = ret;
317 }
318 }
c3e695ff 319 DPRINTF ( (message ("After combine %s", constraintExpr_unparse(expr) ) ) );
3aaedf88 320 return expr;
321}
c3e695ff 322
dc92450f 323/*@special@*/
c3e695ff 324static constraintExpr constraintExpr_alloc (void) /*@post:isnull result->data@*/
3aaedf88 325{
326 constraintExpr ret;
327 ret = dmalloc (sizeof (*ret) );
328 ret->kind = term;
329 ret->data = NULL;
330 return ret;
331}
332
4ab867d6 333/*@only@*/ static constraintExprData copyExprData (/*@observer@*/ constraintExprData data, constraintExprKind kind)
c3e695ff 334{
335 constraintExprData ret;
336 llassert(constraintExprData_isDefined(data));
337
338 switch (kind)
339 {
340 case binaryexpr:
341 ret = constraintExprData_copyBinaryExpr(data);
342 break;
343 case unaryExpr:
344 ret = constraintExprData_copyUnaryExpr(data);
345 break;
346 case term:
347 ret = constraintExprData_copyTerm(data);
348 break;
349 default:
350 BADEXIT;
351 }
352 return ret;
353}
3aaedf88 354
355constraintExpr constraintExpr_copy (constraintExpr expr)
356{
357 constraintExpr ret;
358 ret = constraintExpr_alloc();
359 ret->kind = expr->kind;
c3e695ff 360
361 ret->data = copyExprData (expr->data, expr->kind);
3aaedf88 362 return ret;
363}
364
365
28bf4b0b 366/*@only@*/ static constraintExpr oldconstraintExpr_makeTermExprNode ( /*@dependent@*/ exprNode e)
3aaedf88 367{
368 constraintExpr ret;
369 constraintTerm t;
370 ret = constraintExpr_alloc();
371 ret->kind = term;
372 ret->data = dmalloc (sizeof *(ret->data) );
373 t = constraintTerm_makeExprNode (e);
374 ret->data = constraintExprData_termSetTerm (ret->data, t);
375 return ret;
376}
377
28bf4b0b 378constraintExpr constraintExpr_makeExprNode (exprNode e)
3aaedf88 379{
380 sRef s;
381 constraintExpr ret, ce1, ce2;
382 exprData data;
383 exprNode t, t1, t2;
384 lltok tok;
385
386
dc92450f 387 llassert (e != NULL);
3aaedf88 388
389 data = e->edata;
390
391 switch (e->kind)
392 {
393 case XPR_SIZEOF:
394 t = exprData_getSingle (data);
395 s = exprNode_getSref (t);
396 if (sRef_isFixedArray(s) )
397 {
398 int size;
399
dc92450f 400 size = (int) sRef_getArraySize(s);
3aaedf88 401 ret = constraintExpr_makeIntLiteral (size);
402 }
403 else
404 {
c3e695ff 405 DPRINTF ((message ("could not determine the size of %s", exprNode_unparse (e) ) ) );
3aaedf88 406 ret = oldconstraintExpr_makeTermExprNode (e);
407 }
408 break;
409
410 case XPR_OP:
c3e695ff 411 DPRINTF ((message ("Examining operation %s", exprNode_unparse (e) ) ) );
3aaedf88 412 t1 = exprData_getOpA (data);
413 t2 = exprData_getOpB (data);
414 tok = exprData_getOpTok (data);
415
416 if (lltok_isPlus_Op (tok) || lltok_isMinus_Op (tok) )
417 {
418 ce1 = constraintExpr_makeExprNode (t1);
419 ce2 = constraintExpr_makeExprNode (t2);
420 ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2);
421 }
7edb30e6 422 /*
423 drl 8-11-001
424
425 We handle expressions containing sizeof with the rule
426 (sizeof type ) * Expr = Expr
427
428 This is the total wronge way to do this but...
429 it may be better than nothing
430 */
431 else if (lltok_isMult(tok) )
3aaedf88 432 {
7edb30e6 433 if ((t1->kind == XPR_SIZEOF) || (t1->kind == XPR_SIZEOFT) )
434 {
435 ret = constraintExpr_makeExprNode(t2);
436 }
437 else if ((t2->kind == XPR_SIZEOF) || (t2->kind == XPR_SIZEOFT) )
438 {
439 ret = constraintExpr_makeExprNode(t1);
440 }
441 else
442 {
443 ret = oldconstraintExpr_makeTermExprNode (e);
444 }
3aaedf88 445 }
7edb30e6 446 else
447 ret = oldconstraintExpr_makeTermExprNode (e);
448
3aaedf88 449 break;
450 case XPR_PARENS:
451 t = exprData_getUopNode (data);
452 ret = constraintExpr_makeExprNode (t);
453 break;
454
455 case XPR_PREOP:
456 t = exprData_getUopNode (data);
457 tok = exprData_getUopTok (data);
458 if (lltok_isInc_Op (tok) )
459 {
460 constraintExpr temp;
461 temp = constraintExpr_makeExprNode(t);
462 ret = constraintExpr_makeIncConstraintExpr(temp);
463 }
464 else if (lltok_isDec_Op (tok) )
465 {
466 constraintExpr temp;
467 temp = constraintExpr_makeExprNode(t);
468 ret = constraintExpr_makeDecConstraintExpr(temp);
469 }
470 else
471 ret = oldconstraintExpr_makeTermExprNode (e);
472 break;
473
474 case XPR_POSTOP:
475 t = exprData_getUopNode (data);
476 ret = constraintExpr_makeExprNode (t);
477 break;
470b7798 478 case XPR_CAST:
479 t = exprData_getCastNode (data);
480 ret = constraintExpr_makeExprNode (t);
481 break;
482 case XPR_COMMA:
483 t = exprData_getPairA(data);
c3e695ff 484 ret = constraintExpr_makeExprNode(t);
485 /*@i3434*/ /*I'm not sure if this is right. I'm adding a break to quite LCLint*/
486 break;
3aaedf88 487 default:
488 ret = oldconstraintExpr_makeTermExprNode (e);
489
490 }
491 return ret;
492}
493
b7b694d6 494/*@only@*/ constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e)
3aaedf88 495{
b7b694d6 496 return oldconstraintExpr_makeTermExprNode(e);
3aaedf88 497}
498
28bf4b0b 499static constraintExpr constraintExpr_makeTerm (/*@only@*/ constraintTerm t)
920a3797 500{
501 constraintExpr ret;
502
503 ret = constraintExpr_alloc();
504 ret->kind = term;
505 ret->data = dmalloc (sizeof *(ret->data) );
a779b61e 506 ret->data->term = NULL;
920a3797 507 ret->data = constraintExprData_termSetTerm (ret->data, t);
508
509 return ret;
510}
3aaedf88 511
28bf4b0b 512constraintExpr constraintExpr_makeTermsRef (/*@temp@*/ sRef s)
3aaedf88 513{
514 constraintExpr ret;
515 constraintTerm t;
516 ret = constraintExpr_alloc();
517 ret->kind = term;
518 ret->data = dmalloc (sizeof *(ret->data) );
519 t = constraintTerm_makesRef (s);
520 ret->data = constraintExprData_termSetTerm (ret->data, t);
521 return ret;
522}
523
920a3797 524/*@special@*/ static constraintExpr makeUnaryOpGeneric (void) /*@allocates result->data@*/ /*@defines result->kind@*/
3aaedf88 525{
526 constraintExpr ret;
527 ret = constraintExpr_alloc();
528 ret->kind = unaryExpr;
529 ret->data = dmalloc ( sizeof *(ret->data) );
a779b61e 530 ret->data->unaryOp.expr = constraintExpr_undefined;
3aaedf88 531 return ret;
532}
533
bb25bea6 534/*@only@*/ static constraintExpr constraintExpr_makeUnaryOpConstraintExpr (/*@only@*/ constraintExpr cexpr)
3aaedf88 535{
536 constraintExpr ret;
920a3797 537 ret = makeUnaryOpGeneric();
a8e557d3 538
539 /*@-uniondef@*/
540 /*@-compdef@*/
b7b694d6 541 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
542 ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED);
543
3aaedf88 544 return ret;
b7b694d6 545
a8e557d3 546 /*@=compdef@*/
c3e695ff 547 /*@=uniondef@*/
3aaedf88 548}
549
920a3797 550
551/*@only@*/ static constraintExpr constraintExpr_makeUnaryOp (/*@only@*/ constraintExpr cexpr, constraintExprUnaryOpKind Op )
552{
553 constraintExpr ret;
554 ret = makeUnaryOpGeneric();
555
556 ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr);
557 ret->data = constraintExprData_unaryExprSetOp (ret->data, Op);
558
559 return ret;
560}
561
bb25bea6 562/*@only@*/
563static constraintExpr constraintExpr_makeMaxSetConstraintExpr (/*@only@*/ constraintExpr c)
3aaedf88 564{
565 constraintExpr ret;
920a3797 566 ret = constraintExpr_makeUnaryOp (c, MAXSET);
3aaedf88 567 return ret;
568}
569
bb25bea6 570/*@only@*/
4ab867d6 571static constraintExpr constraintExpr_makeUnaryOpExprNode (/*@exposed@*/ exprNode expr)
3aaedf88 572{
573 constraintExpr ret;
574 constraintExpr sub;
575 sub = constraintExpr_makeExprNode (expr);
576 ret = constraintExpr_makeUnaryOpConstraintExpr(sub);
d46ce6a4 577
3aaedf88 578 return ret;
579}
580
581
582
bb25bea6 583/*@only@*/
28bf4b0b 584static constraintExpr constraintExpr_makeSRefUnaryOp (/*@temp@*/ /*@observer@*/ sRef s, constraintExprUnaryOpKind op)
3aaedf88 585{
586 constraintExpr ret;
587 constraintExpr t;
588
589 t = constraintExpr_makeTermsRef (s);
590 ret = constraintExpr_makeUnaryOpConstraintExpr (t);
591 ret->data = constraintExprData_unaryExprSetOp (ret->data, op);
d46ce6a4 592
3aaedf88 593 return ret;
594}
595
bb25bea6 596/*@only@*/
28bf4b0b 597constraintExpr constraintExpr_makeSRefMaxRead( sRef s)
470b7798 598{
599 return (constraintExpr_makeSRefUnaryOp (s, MAXREAD) );
600}
601
bb25bea6 602/*@only@*/
28bf4b0b 603constraintExpr constraintExpr_makeSRefMaxset ( sRef s)
3aaedf88 604{
605 return (constraintExpr_makeSRefUnaryOp (s, MAXSET) );
606}
607
bb25bea6 608/*@only@*/
3aaedf88 609constraintExpr constraintExpr_parseMakeUnaryOp (lltok op, constraintExpr cexpr)
610{
611 constraintExpr ret;
612 ret = constraintExpr_makeUnaryOpConstraintExpr ( cexpr);
613
614 switch (op.tok)
615 {
616 case QMAXSET:
617 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXSET);
618 break;
619 case QMAXREAD:
620 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
621 break;
622 default:
dc92450f 623 llfatalbug(message("Unhandled Operation in Constraint") );
3aaedf88 624 }
625 return ret;
626}
627
bb25bea6 628/*@only@*/
4ab867d6 629constraintExpr constraintExpr_makeMaxSetExpr (/*@exposed@*/ exprNode expr)
3aaedf88 630{
631 constraintExpr ret;
632 ret = constraintExpr_makeExprNode (expr);
633
634 ret = constraintExpr_makeMaxSetConstraintExpr (ret);
635
dc92450f 636 llassert (ret != NULL);
3aaedf88 637 return ret;
638}
639
bb25bea6 640/*@only@*/
3aaedf88 641constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr)
642{
643 constraintExpr ret;
644 ret = constraintExpr_makeUnaryOpExprNode(expr);
645 ret->data = constraintExprData_unaryExprSetOp (ret->data, MAXREAD);
646 return ret;
647}
648
15b3d2b2 649# if 0
bb25bea6 650/*@only@*/
28bf4b0b 651/*@unused@*/ static constraintExpr constraintExpr_makeMinSetExpr (/*@exposed@*/ exprNode expr)
3aaedf88 652{
653 constraintExpr ret;
654 ret = constraintExpr_makeUnaryOpExprNode(expr);
655 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINSET);
656 return ret;
657}
658
bb25bea6 659/*@only@*/
28bf4b0b 660/*@unused@*/ static constraintExpr constraintExpr_makeMinReadExpr (/*@exposed@*/ exprNode expr)
3aaedf88 661{
662 constraintExpr ret;
663 ret = constraintExpr_makeUnaryOpExprNode(expr);
664 ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD);
665 return ret;
666}
15b3d2b2 667# endif
3aaedf88 668
bb25bea6 669/*@only@*/
4ab867d6 670constraintExpr constraintExpr_makeValueExpr (/*@exposed@*/ exprNode expr)
3aaedf88 671{
672 constraintExpr ret;
673 ret = constraintExpr_makeExprNode (expr);
674 return ret;
675}
676
bb25bea6 677/*@only@*/
b9904f57 678constraintExpr constraintExpr_makeIntLiteral (long i)
3aaedf88 679{
680 constraintExpr ret;
681 constraintTerm t;
682 ret = constraintExpr_alloc();
683 ret->kind = term;
684 ret->data = dmalloc (sizeof *(ret->data) );
685 t = constraintTerm_makeIntLiteral (i);
686 ret->data = constraintExprData_termSetTerm (ret->data, t);
687 return ret;
688}
689
c3e695ff 690/*
3aaedf88 691constraintExpr constraintExpr_makeValueInt (int i)
692{
693 return constraintExpr_makeIntLiteral (i);
694}
c3e695ff 695*/
3aaedf88 696
bb25bea6 697/*@only@*/
28bf4b0b 698 /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void)
699 /*@allocates result->data @*/ /*@sets result->kind @*/
3aaedf88 700{
701 constraintExpr ret;
702 ret = constraintExpr_alloc();
703 ret->kind = binaryexpr;
704 ret->data = dmalloc ( sizeof *(ret->data) );
a779b61e 705
706 ret->data->binaryOp.expr1 = constraintExpr_undefined;
707 ret->data->binaryOp.expr2 = constraintExpr_undefined;
708
3aaedf88 709 return ret;
710}
711
712
bb25bea6 713static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExpr (/*@only@*/constraintExpr expr1, /*@only@*/ constraintExpr expr2)
3aaedf88 714
715{
716 constraintExpr ret;
d46ce6a4 717
3aaedf88 718 ret = constraintExpr_makeBinaryOp();
719 ret->data = constraintExprData_binaryExprSetExpr1 (ret->data, expr1);
720 ret->data = constraintExprData_binaryExprSetExpr2 (ret->data, expr2);
84c9ffbf 721 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED);
3aaedf88 722 return ret;
723}
724
bb25bea6 725/*@only@*/
d46ce6a4 726constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1, lltok op,/*@only@*/ constraintExpr expr2)
3aaedf88 727{
728 constraintExpr ret;
729 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
730 if (op.tok == TPLUS)
0c91982e 731 ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS);
3aaedf88 732 else if (op.tok == TMINUS)
acfb6ad9 733 ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_MINUS);
3aaedf88 734 else
735 {
736 llassert(FALSE);
737 }
738 return ret;
739}
740
15b3d2b2 741# if 0
bb25bea6 742/*@only@*/
28bf4b0b 743/*@unused@*/ static constraintExpr constraintExpr_makeBinaryOpExprNode (/*@exposed@*/ exprNode expr1, /*@exposed@*/ exprNode expr2)
3aaedf88 744{
745 constraintExpr ret;
746 constraintExpr sub1, sub2;
747 sub1 = constraintExpr_makeTermExprNode (expr1);
748 sub2 = constraintExpr_makeTermExprNode (expr2);
749 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2);
750 return ret;
751}
15b3d2b2 752# endif
3aaedf88 753
920a3797 754static /*@only@*/
d46ce6a4 755constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal)
3aaedf88 756{
757 constraintExpr ret;
758 constraintExpr constExpr;
759
760 constExpr = constraintExpr_makeIntLiteral (literal);
761 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr);
0c91982e 762 ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS);
3aaedf88 763 return ret;
764}
765
bb25bea6 766/*@only@*/
d46ce6a4 767constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr expr)
3aaedf88 768{
769 constraintExpr ret;
770 constraintExpr inc;
771
772 inc = constraintExpr_makeIntLiteral (1);
773 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
acfb6ad9 774 ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_MINUS);
3aaedf88 775 return ret;
776}
777
2934b455 778
779/*@only@*/ constraintExpr constraintExpr_makeSubtractExpr (/*@only@*/ constraintExpr expr, /*@only@*/ constraintExpr addent)
780{
28bf4b0b 781 constraintExpr ret;
2934b455 782
783 DPRINTF ( (message ("Making subtract expression") ) );
784
28bf4b0b 785 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
acfb6ad9 786 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_MINUS);
28bf4b0b 787 return ret;
2934b455 788}
789
bb25bea6 790/*@only@*/
2934b455 791constraintExpr constraintExpr_makeAddExpr (/*@only@*/
bb25bea6 792constraintExpr expr, /*@only@*/
2934b455 793constraintExpr addent)
3aaedf88 794{
28bf4b0b 795 constraintExpr ret;
3aaedf88 796
2934b455 797 DPRINTF ( (message ("Doing addTerm simplification") ) );
3aaedf88 798
28bf4b0b 799 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, addent);
0c91982e 800 ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_PLUS);
28bf4b0b 801 return ret;
3aaedf88 802}
803
2934b455 804
bb25bea6 805/*@only@*/
d46ce6a4 806constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr expr)
3aaedf88 807{
808 constraintExpr ret;
809 constraintExpr inc;
810
811 inc = constraintExpr_makeIntLiteral (1);
812 ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc);
0c91982e 813 ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS);
3aaedf88 814 return ret;
815}
816
bb25bea6 817/*@only@*/
818static cstring constraintExprUnaryOpKind_print (constraintExprUnaryOpKind op)
3aaedf88 819{
820 switch (op)
821 {
822 case MAXSET:
03d670b6 823 return message("maxSet");
3aaedf88 824 case MINSET:
03d670b6 825 return message("minSet");
3aaedf88 826 case MAXREAD:
03d670b6 827 return message("maxRead");
3aaedf88 828 case MINREAD:
03d670b6 829 return message("minRead");
3aaedf88 830 default:
831 llassert(FALSE);
832 return message ("<(Unary OP OTHER>");
833 }
834}
835
836
bb25bea6 837/*@only@*/
838static cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op)
3aaedf88 839{
840
841 switch (op)
842 {
0c91982e 843 case BINARYOP_PLUS:
3aaedf88 844 return message("+");
acfb6ad9 845 case BINARYOP_MINUS:
3aaedf88 846 return message("-");
dc92450f 847
848 default:
849 llassert(FALSE);
850 return message ("<binary OP Unknown>");
3aaedf88 851 }
3aaedf88 852}
853
854bool constraintExpr_similar (constraintExpr expr1, constraintExpr expr2)
855{
856 constraintExprKind kind;
857
858 llassert (expr1 != NULL);
859 llassert (expr2 != NULL);
860 if (expr1->kind != expr2->kind)
861 return FALSE;
862
863 kind = expr1->kind;
864
865 switch (kind)
866 {
867 case term:
868 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
869 constraintExprData_termGetTerm(expr2->data) );
c3e695ff 870 /*@notreached@*/ break;
3aaedf88 871
872 case unaryExpr:
873 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
874 return FALSE;
875
876 return (constraintExpr_similar (
877 constraintExprData_unaryExprGetExpr (expr1->data),
878 constraintExprData_unaryExprGetExpr (expr2->data)
879 ));
880
881 case binaryexpr:
882 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
883 return FALSE;
884
885 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr1 (expr1->data),
886 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
887 return FALSE;
888
889 if (! constraintExpr_similar (constraintExprData_binaryExprGetExpr2 (expr1->data),
890 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
891 return FALSE;
892 else
893 return TRUE;
894 /*@notreached@*/
895 break;
896
897 default:
898 llassert(FALSE);
899 return FALSE;
900 }
901 /*@notreached@*/
902 return FALSE;
903}
904
905bool constraintExpr_same (constraintExpr expr1, constraintExpr expr2)
906{
907 constraintExprKind kind;
908
909 llassert (expr1 != NULL);
910 llassert (expr2 != NULL);
911 if (expr1->kind != expr2->kind)
912 return FALSE;
913
914 kind = expr1->kind;
915
916 switch (kind)
917 {
918 case term:
919 return constraintTerm_similar (constraintExprData_termGetTerm(expr1->data),
920 constraintExprData_termGetTerm(expr2->data) );
dc92450f 921 /*@notreached@*/ break;
3aaedf88 922
923 case unaryExpr:
924 if (constraintExprData_unaryExprGetOp (expr1->data) != constraintExprData_unaryExprGetOp (expr2->data) )
925 return FALSE;
926
927 return (constraintExpr_same (
928 constraintExprData_unaryExprGetExpr (expr1->data),
929 constraintExprData_unaryExprGetExpr (expr2->data)
930 ));
931
932
933 case binaryexpr:
934 if (constraintExprData_binaryExprGetOp (expr1->data) != constraintExprData_binaryExprGetOp (expr2->data) )
935 return FALSE;
936
937 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr1 (expr1->data),
938 constraintExprData_binaryExprGetExpr1 (expr2->data)) )
939 return FALSE;
940
941 if (! constraintExpr_same (constraintExprData_binaryExprGetExpr2 (expr1->data),
942 constraintExprData_binaryExprGetExpr2 (expr2->data)) )
943 return FALSE;
944 else
945 return TRUE;
dc92450f 946 /*@notreached@*/ break;
3aaedf88 947
948 default:
949 llassert(FALSE);
950 return FALSE;
951 }
952
953 /*@notreached@*/
954 BADEXIT;
955}
956
bb25bea6 957bool constraintExpr_search (/*@observer@*/ constraintExpr c, /*@observer@*/ constraintExpr old)
3aaedf88 958{
959 bool ret = FALSE;
960 constraintExprKind kind;
961 constraintExpr temp;
962
963 if ( constraintExpr_similar (c, old) )
964 {
bb25bea6 965 DPRINTF((message ("Found %q",
3aaedf88 966 constraintExpr_unparse(old)
967 )));
968 return TRUE;
969 }
970
971 kind = c->kind;
972
973 switch (kind)
974 {
975 case term:
976 break;
977 case unaryExpr:
978 temp = constraintExprData_unaryExprGetExpr (c->data);
979 ret = ret || constraintExpr_search (temp, old);
980 break;
981 case binaryexpr:
982
983 temp = constraintExprData_binaryExprGetExpr1 (c->data);
984 ret = ret || constraintExpr_search(temp, old);
985
986 temp = constraintExprData_binaryExprGetExpr2 (c->data);
987 ret = ret || constraintExpr_search(temp, old);
988 break;
989 default:
990 llassert(FALSE);
991 }
992 return ret;
993
994}
995
996
28bf4b0b 997/*@only@*/ constraintExpr constraintExpr_searchandreplace (/*@only@*/ /*@unique@*/ constraintExpr c, /*@temp@*/ constraintExpr old, /*@temp@*/ constraintExpr newExpr )
3aaedf88 998{
999 constraintExprKind kind;
1000 constraintExpr temp;
1001
1002 if ( constraintExpr_similar (c, old) )
1003 {
bb25bea6 1004
470b7798 1005 DPRINTF((message ("Replacing %s with %s",
28bf4b0b 1006 constraintExpr_unparse(old), constraintExpr_unparse(newExpr)
3aaedf88 1007 )));
bb25bea6 1008 constraintExpr_free(c);
28bf4b0b 1009 return constraintExpr_copy (newExpr);
3aaedf88 1010 }
1011
1012 kind = c->kind;
1013
1014 switch (kind)
1015 {
1016 case term:
1017 break;
1018 case unaryExpr:
1019 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 1020 temp = constraintExpr_copy(temp);
28bf4b0b 1021 temp = constraintExpr_searchandreplace (temp, old, newExpr);
3aaedf88 1022 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1023 break;
1024 case binaryexpr:
1025
1026 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 1027 temp = constraintExpr_copy(temp);
28bf4b0b 1028 temp = constraintExpr_searchandreplace (temp, old, newExpr);
3aaedf88 1029 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1030
1031 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 1032 temp = constraintExpr_copy(temp);
28bf4b0b 1033 temp = constraintExpr_searchandreplace (temp, old, newExpr);
3aaedf88 1034 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1035 break;
1036 default:
1037 llassert(FALSE);
1038 }
1039 return c;
1040
1041}
1042
bb25bea6 1043static constraintExpr constraintExpr_simplifyChildren (/*@returned@*/ constraintExpr c)
3aaedf88 1044{
1045 constraintExprKind kind;
1046 constraintExpr temp;
1047
1048 kind = c->kind;
1049
1050 switch (kind)
1051 {
1052 case term:
1053 break;
1054 case unaryExpr:
1055 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 1056 temp = constraintExpr_copy(temp);
3aaedf88 1057 temp = constraintExpr_simplify (temp);
1058 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1059 break;
1060 case binaryexpr:
c3e695ff 1061 DPRINTF((message("constraintExpr_simplfiyChildren: simplify binary expression: %s",constraintExpr_unparse(c) ) ) );
3aaedf88 1062 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 1063 temp = constraintExpr_copy(temp);
3aaedf88 1064 temp = constraintExpr_simplify (temp);
1065
1066 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1067
1068 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 1069 temp = constraintExpr_copy(temp);
3aaedf88 1070 temp = constraintExpr_simplify (temp);
1071
1072 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1073 break;
1074 default:
1075 llassert(FALSE);
1076 }
1077 return c;
1078
1079}
1080
1081
28bf4b0b 1082constraintExpr constraintExpr_setFileloc (/*@returned@*/ constraintExpr c, fileloc loc) /*@modifies c @*/
3aaedf88 1083{
1084 constraintTerm t;
1085 constraintExpr temp;
1086
dc92450f 1087 llassert(c != NULL);
3aaedf88 1088
1089 switch (c->kind)
1090 {
1091 case term:
1092 t = constraintExprData_termGetTerm (c->data);
d46ce6a4 1093 t = constraintTerm_copy(t);
3aaedf88 1094 t = constraintTerm_setFileloc (t, loc);
1095 c->data = constraintExprData_termSetTerm (c->data, t);
1096 break;
1097 case binaryexpr:
1098
1099 temp = constraintExprData_binaryExprGetExpr1 (c->data);
d46ce6a4 1100 temp = constraintExpr_copy(temp);
3aaedf88 1101 temp = constraintExpr_setFileloc (temp, loc);
1102 c->data = constraintExprData_binaryExprSetExpr1 (c->data, temp);
1103
1104 temp = constraintExprData_binaryExprGetExpr2 (c->data);
d46ce6a4 1105 temp = constraintExpr_copy(temp);
3aaedf88 1106 temp = constraintExpr_setFileloc (temp, loc);
1107 c->data = constraintExprData_binaryExprSetExpr2 (c->data, temp);
1108 break;
1109 case unaryExpr:
1110 temp = constraintExprData_unaryExprGetExpr (c->data);
d46ce6a4 1111 temp = constraintExpr_copy(temp);
3aaedf88 1112 temp = constraintExpr_setFileloc (temp, loc);
1113 c->data = constraintExprData_unaryExprSetExpr (c->data, temp);
1114 break;
1115 }
1116 return c;
1117}
1118
bb25bea6 1119static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/constraintExpr c)
3aaedf88 1120{
1121 constraintExpr e1, e2;
7c9c4a67 1122 constraintExprBinaryOpKind op;
1123
3aaedf88 1124 e1 = constraintExprData_binaryExprGetExpr1 (c->data);
1125 e2 = constraintExprData_binaryExprGetExpr2 (c->data);
1126
1127 if (constraintExpr_canGetValue (e1) && constraintExpr_canGetValue(e2) )
1128 {
b9904f57 1129 long i;
3aaedf88 1130
1131 i = constraintExpr_getValue(e1) + constraintExpr_getValue (e2);
d46ce6a4 1132 constraintExpr_free(c);
3aaedf88 1133 c = constraintExpr_makeIntLiteral (i);
3aaedf88 1134 }
7c9c4a67 1135 else
1136 {
1137 op = constraintExprData_binaryExprGetOp (c->data);
acfb6ad9 1138 if (op == BINARYOP_MINUS)
7c9c4a67 1139 if (constraintExpr_similar(e1, e2) )
1140 {
1141 constraintExpr_free(c);
1142 c = constraintExpr_makeIntLiteral (0);
1143 }
1144 }
1145
3aaedf88 1146 return c;
1147}
1148
bb25bea6 1149/*
1150 this thing takes the lexpr and expr of a constraint and modifies lexpr
1151 and returns a (possiblly new) value for expr
1152*/
1153/* if lexpr is a binary express say x + y, we set lexpr to x and return a value for expr such as expr_old - y */
1154
1155/* the approach is a little Kludgy but seems to work. I should probably use something cleaner at some point ... */
1156
1157
1158/*@only@*/ constraintExpr constraintExpr_solveBinaryExpr (constraintExpr lexpr, /*@only@*/ constraintExpr expr)
3aaedf88 1159{
1160 constraintExpr expr1, expr2;
1161 constraintExprBinaryOpKind op;
1162
1163 if (lexpr->kind != binaryexpr)
1164 return expr;
1165
1166 expr2 = constraintExprData_binaryExprGetExpr2 (lexpr->data);
1167 expr1 = constraintExprData_binaryExprGetExpr1 (lexpr->data);
bb25bea6 1168
3aaedf88 1169 op = constraintExprData_binaryExprGetOp (lexpr->data);
1170
bb25bea6 1171 expr1 = constraintExpr_copy(expr1);
1172 expr2 = constraintExpr_copy(expr2);
1173
b7b694d6 1174 /* drl possible problem : warning make sure this works */
1175
1176 lexpr->kind = expr1->kind;
1177 sfree (lexpr->data);
1178
1179 lexpr->data = copyExprData (expr1->data, expr1->kind);
1180 constraintExpr_free(expr1);
1181
0c91982e 1182 if (op == BINARYOP_PLUS)
b7b694d6 1183 expr = constraintExpr_makeSubtractExpr (expr, expr2);
acfb6ad9 1184 else if (op == BINARYOP_MINUS)
b7b694d6 1185 expr = constraintExpr_makeAddExpr (expr, expr2);
1186 else
1187 BADEXIT;
1188
1189
1190 return expr;
bb25bea6 1191
c3e695ff 1192 /*
1193 #warning this needs to be checked
1194 expr = constraintExpr_solveBinaryExpr (expr1, expr);
1195
1196 expr = constraintExpr_solveBinaryExpr (expr2, expr);
1197 return expr;
1198 */
3aaedf88 1199}
1200
bb25bea6 1201static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ constraintExpr c)
3aaedf88 1202{
1203 constraintExpr exp;
1204
1205 llassert (c->kind == unaryExpr);
1206
d30bc0c7 1207 DPRINTF ((message ("Doing constraintExpr_simplifyunaryExpr:%s", constraintExpr_unparse (c) ) ) );
3aaedf88 1208
1209 if ( (constraintExprData_unaryExprGetOp (c->data) != MAXSET) &&
1210 (constraintExprData_unaryExprGetOp (c->data) != MAXREAD) )
1211 {
1212 return c;
1213 }
3aaedf88 1214
1215 exp = constraintExprData_unaryExprGetExpr (c->data);
a779b61e 1216 exp = constraintExpr_copy(exp);
1217
3aaedf88 1218 if (exp->kind == term)
1219 {
1220 constraintTerm cterm;
1221
1222 cterm = constraintExprData_termGetTerm (exp->data);
1223
1224 if (constraintTerm_isStringLiteral(cterm) )
1225 {
1226 cstring val;
1227 val = constraintTerm_getStringLiteral (cterm);
1228 if (constraintExprData_unaryExprGetOp (c->data) == MAXSET)
1229 {
d46ce6a4 1230 constraintExpr temp;
1231
28bf4b0b 1232 temp = constraintExpr_makeIntLiteral ((int)strlen (cstring_toCharsSafe(val) ) );
d46ce6a4 1233 cstring_free(val);
1234 constraintExpr_free(c);
a779b61e 1235 constraintExpr_free(exp);
1236
d46ce6a4 1237 return temp;
a779b61e 1238
3aaedf88 1239 }
1240 if (constraintExprData_unaryExprGetOp (c->data) == MAXREAD)
1241 {
d46ce6a4 1242 constraintExpr temp;
1243
28bf4b0b 1244 temp = constraintExpr_makeIntLiteral ((int)strlen (cstring_toCharsSafe(val) ) );
d46ce6a4 1245 cstring_free(val);
1246 constraintExpr_free(c);
a779b61e 1247 constraintExpr_free(exp);
1248
d46ce6a4 1249 return temp;
3aaedf88 1250 }
1251 BADEXIT;
1252 }
d30bc0c7 1253
b7b694d6 1254 /* slight Kludge to hanlde var [] = { , , };
1255 ** type syntax I don't think this is sounds but it should be good
1256 ** enough. The C stanrad is very confusing about initialization
1257 ** -- DRL 7/25/01
1258 */
d30bc0c7 1259
1260 if (constraintTerm_isInitBlock(cterm) )
1261 {
1262 constraintExpr temp;
1263 int len;
1264
1265 len = constraintTerm_getInitBlockLength(cterm);
1266
1267 temp = constraintExpr_makeIntLiteral (len );
1268
1269 constraintExpr_free(c);
1270 DPRINTF(( message("Changed too %q", constraintExpr_print(temp)
1271 ) ));
a779b61e 1272 constraintExpr_free(exp);
d30bc0c7 1273 return temp;
1274 }
1275
a779b61e 1276 constraintExpr_free(exp);
3aaedf88 1277 return c;
1278 }
1279
1280 if (exp->kind != binaryexpr)
a779b61e 1281 {
1282 constraintExpr_free(exp);
1283 return c;
1284 }
1285
0c91982e 1286 if (constraintExprData_binaryExprGetOp (exp->data) == BINARYOP_PLUS )
3aaedf88 1287 {
1288
b7b694d6 1289 /* if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) ) */
3aaedf88 1290 {
1291
4ab867d6 1292 constraintExpr temp, temp2;
3aaedf88 1293
1294 DPRINTF ( (message ("Doing fancy simplification") ) );
1295
1296 temp = constraintExprData_binaryExprGetExpr2 (exp->data);
1297
1298 temp2 = constraintExprData_binaryExprGetExpr1 (exp->data);
d46ce6a4 1299
1300 temp2 = constraintExpr_copy(temp2);
3aaedf88 1301 c->data = constraintExprData_unaryExprSetExpr (c->data, temp2);
1302
1303
bb25bea6 1304 temp = constraintExpr_copy (temp);
1305
2934b455 1306 c = constraintExpr_makeSubtractExpr (c, temp);
3aaedf88 1307
4ab867d6 1308 DPRINTF ( (message ("Done fancy simplification:%s", constraintExpr_unparse (c) ) ) );
3aaedf88 1309 }
1310 }
1311
a779b61e 1312 DPRINTF ( (message ("constraintExpr_simplifyUnaryExpr: Done simplification:%s", constraintExpr_unparse (c) ) ) );
1313
1314 constraintExpr_free(exp);
3aaedf88 1315 return c;
1316}
1317
1318
bb25bea6 1319/*@only@*/ constraintExpr constraintExpr_simplify (/*@only@*/ constraintExpr c)
3aaedf88 1320{
1321 constraintExprKind kind;
bb25bea6 1322 constraintExpr ret;
3aaedf88 1323 constraintTerm t;
3aaedf88 1324
c3e695ff 1325 DPRINTF ( (message ("Doing constraintExpr_simplify:%s", constraintExpr_unparse (c) ) ) );
bb25bea6 1326
3aaedf88 1327
bb25bea6 1328 /*@i22*/
3aaedf88 1329
bb25bea6 1330 /*I think this is an LCLint bug */
1331
1332 ret = constraintExpr_copy(c);
1333
1334 constraintExpr_free(c);
1335
1336 ret = constraintExpr_simplifyChildren (ret);
1337
1338 ret = constraintExpr_combineConstants (ret);
1339
1340 ret = constraintExpr_simplifyChildren (ret);
1341
1342
1343 kind = ret->kind;
3aaedf88 1344
1345 switch (kind)
1346 {
1347 case term:
bb25bea6 1348 t = constraintExprData_termGetTerm (ret->data);
d46ce6a4 1349 t = constraintTerm_copy(t);
3aaedf88 1350 t = constraintTerm_simplify (t);
bb25bea6 1351 ret->data = constraintExprData_termSetTerm (ret->data, t);
3aaedf88 1352 break;
1353 case unaryExpr:
bb25bea6 1354 ret = constraintExpr_simplifyunaryExpr (ret);
3aaedf88 1355 break;
1356 case binaryexpr:
bb25bea6 1357 ret = constraintExpr_simplifybinaryExpr (ret);
3aaedf88 1358 break;
1359 default:
1360 llassert(FALSE);
bb25bea6 1361 }
1362
1363 DPRINTF ( (message ("constraintExpr_simplify returning :%s", constraintExpr_unparse (ret) ) ) );
1364 return ret;
3aaedf88 1365
1366}
1367
bb25bea6 1368/*@only@*/
4ab867d6 1369cstring constraintExpr_unparse (/*@temp@*/ /*@observer@*/ constraintExpr ex) /*@*/
3aaedf88 1370{
1371 cstring st;
1372 constraintExprKind kind;
1373
1374 llassert (ex != NULL);
1375
1376 kind = ex->kind;
1377
1378 switch (kind)
1379 {
1380 case term:
a779b61e 1381
1382 if (context_getFlag (FLG_PARENCONSTRAINT) )
1383 {
1384 st = message ("(%q) ", constraintTerm_print (constraintExprData_termGetTerm (ex->data)));
1385 }
1386 else
1387 {
1388 st = message ("%q", constraintTerm_print (constraintExprData_termGetTerm (ex->data)));
1389 }
3aaedf88 1390 break;
1391 case unaryExpr:
a779b61e 1392 st = message ("%q(%q)",
1393 constraintExprUnaryOpKind_print (constraintExprData_unaryExprGetOp (ex->data) ),
3aaedf88 1394 constraintExpr_unparse (constraintExprData_unaryExprGetExpr (ex->data) )
1395 );
1396 break;
1397 case binaryexpr:
a779b61e 1398 if (context_getFlag (FLG_PARENCONSTRAINT) )
1399 {
1400 st = message ("(%q) %q (%q)",
3aaedf88 1401 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1402 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1403 ),
1404 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1405 );
a779b61e 1406 }
1407 else
1408 {
1409 st = message ("%q %q %q",
1410 constraintExpr_unparse (constraintExprData_binaryExprGetExpr1 (ex->data) ),
1411 constraintExprBinaryOpKind_print (constraintExprData_binaryExprGetOp (ex->data)
1412 ),
1413 constraintExpr_unparse (constraintExprData_binaryExprGetExpr2 (ex->data) )
1414 );
1415 }
1416
3aaedf88 1417 break;
1418 default:
1419 llassert(FALSE);
1420 st = message ("error");
1421
1422 }
1423
1424 DPRINTF((message ("constraintExpr_unparse: '%s'",st) ) );
1425 return st;
1426}
1427
1428constraintExpr constraintExpr_doSRefFixBaseParam (/*@returned@*/ constraintExpr expr, exprNodeList arglist)
1429{
1430 constraintTerm Term;
1431 constraintExprKind kind;
1432 constraintExpr expr1, expr2;
1433 constraintExprData data;
1434 llassert (expr != NULL);
1435
1436 data = expr->data;
1437
1438 kind = expr->kind;
1439
1440 switch (kind)
1441 {
1442 case term:
1443 Term = constraintExprData_termGetTerm(data);
d46ce6a4 1444 Term = constraintTerm_copy(Term);
1445
3aaedf88 1446 Term = constraintTerm_doSRefFixBaseParam (Term, arglist);
1447 data = constraintExprData_termSetTerm(data, Term);
1448 break;
1449 case unaryExpr:
1450 expr1 = constraintExprData_unaryExprGetExpr (data);
d46ce6a4 1451 expr1 = constraintExpr_copy(expr1);
1452
3aaedf88 1453 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1454 data = constraintExprData_unaryExprSetExpr (data, expr1);
1455 break;
1456 case binaryexpr:
1457 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1458 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1459
d46ce6a4 1460 expr1 = constraintExpr_copy(expr1);
1461 expr2 = constraintExpr_copy(expr2);
1462
3aaedf88 1463 expr1 = constraintExpr_doSRefFixBaseParam (expr1, arglist);
1464 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1465 expr2 = constraintExpr_doSRefFixBaseParam (expr2, arglist);
1466 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1467
1468 break;
1469 default:
1470 llassert(FALSE);
1471 data = NULL;
1472 }
1473 return expr;
1474}
1475
d46ce6a4 1476/*@only@*/ constraintExpr constraintExpr_doSRefFixConstraintParam (/*@only@*/ constraintExpr expr, exprNodeList arglist) /*@modifies expr@*/
3aaedf88 1477{
1478 constraintExprKind kind;
1479 constraintExpr expr1, expr2;
1480 constraintExprData data;
1481 llassert (expr != NULL);
1482
1483 data = expr->data;
1484
1485 kind = expr->kind;
1486
1487 switch (kind)
1488 {
1489 case term:
c3e695ff 1490 expr = doSRefFixConstraintParamTerm (expr, arglist);
3aaedf88 1491 break;
1492 case unaryExpr:
1493 expr1 = constraintExprData_unaryExprGetExpr (data);
d46ce6a4 1494 expr1 = constraintExpr_copy(expr1);
3aaedf88 1495 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1496 data = constraintExprData_unaryExprSetExpr (data, expr1);
1497 break;
1498 case binaryexpr:
1499 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1500 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1501
d46ce6a4 1502 expr1 = constraintExpr_copy(expr1);
1503 expr2 = constraintExpr_copy(expr2);
1504
3aaedf88 1505 expr1 = constraintExpr_doSRefFixConstraintParam (expr1, arglist);
1506 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1507 expr2 = constraintExpr_doSRefFixConstraintParam (expr2, arglist);
1508 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1509
1510 break;
1511 default:
1512 llassert(FALSE);
1513 data = NULL;
1514 }
1515 return expr;
1516}
1517
28bf4b0b 1518/*@only@*/ constraintExpr constraintExpr_doFixResult (/*@only@*/ constraintExpr expr, /*@observer@*/ exprNode fcnCall)
3aaedf88 1519{
1520 constraintExprKind kind;
1521 constraintExpr expr1, expr2;
1522 constraintExprData data;
1523 llassert (expr != NULL);
1524
1525 data = expr->data;
1526
1527 kind = expr->kind;
1528
1529 switch (kind)
1530 {
1531 case term:
c3e695ff 1532 expr = doFixResultTerm (expr, fcnCall);
3aaedf88 1533 break;
1534 case unaryExpr:
1535 expr1 = constraintExprData_unaryExprGetExpr (data);
d46ce6a4 1536 expr1 = constraintExpr_copy(expr1);
1537
3aaedf88 1538 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1539 data = constraintExprData_unaryExprSetExpr (data, expr1);
1540 break;
1541 case binaryexpr:
1542 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1543 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1544
d46ce6a4 1545 expr1 = constraintExpr_copy(expr1);
1546 expr2 = constraintExpr_copy(expr2);
1547
3aaedf88 1548 expr1 = constraintExpr_doFixResult (expr1, fcnCall);
1549 data = constraintExprData_binaryExprSetExpr1 (data, expr1);
1550 expr2 = constraintExpr_doFixResult (expr2, fcnCall);
1551 data = constraintExprData_binaryExprSetExpr2 (data, expr2);
1552
1553 break;
1554 default:
1555 llassert(FALSE);
1556 data = NULL;
1557 }
1558 return expr;
1559}
1560
dc92450f 1561cstring constraintExpr_print (constraintExpr expr) /*@*/
3aaedf88 1562{
b9904f57 1563 return constraintExpr_unparse (expr);
3aaedf88 1564}
1565
dc92450f 1566bool constraintExpr_hasMaxSet (constraintExpr expr) /*@*/
3aaedf88 1567{
1568 cstring t;
1569
1570 t = constraintExpr_unparse(expr);
1571
03d670b6 1572 if (cstring_containsLit(t, "maxSet") != NULL )
d46ce6a4 1573 {
1574 cstring_free(t);
1575 return (TRUE);
1576 }
c3e695ff 1577 else
d46ce6a4 1578 {
1579 cstring_free(t);
1580 return FALSE;
1581 }
3aaedf88 1582}
1583
1584
1585
1586 /*returns 1 0 -1 like strcmp
1587 1 => expr1 > expr2
1588 0 => expr1 == expr2
1589 -1 => expr1 < expr2
1590 */
b9904f57 1591
3aaedf88 1592int constraintExpr_compare (constraintExpr expr1, constraintExpr expr2)
1593{
b9904f57 1594 long value1, value2;
3aaedf88 1595
1596 if (constraintExpr_similar (expr1, expr2) )
1597 {
1598 return 0;
1599 }
b9904f57 1600
3aaedf88 1601 value1 = constraintExpr_getValue(expr1);
1602 value2 = constraintExpr_getValue(expr2);
1603
1604 if (value1 > value2)
1605 return 1;
1606
1607 if (value1 == value2)
1608 return 0;
1609
1610 else
1611 return -1;
1612}
1613
b9904f57 1614long constraintExpr_getValue (constraintExpr expr)
3aaedf88 1615{
1616 llassert (expr->kind == term);
b9904f57 1617 return (constraintTerm_getValue (constraintExprData_termGetTerm (expr->data)));
3aaedf88 1618}
1619
1620bool constraintExpr_canGetValue (constraintExpr expr)
1621{
1622 switch (expr->kind)
1623 {
1624 case term:
1625 return constraintTerm_canGetValue (constraintExprData_termGetTerm (expr->data) );
1626 default:
1627 return FALSE;
1628
1629 }
c3e695ff 1630
1631 BADEXIT;
3aaedf88 1632}
1633
3aaedf88 1634fileloc constraintExpr_getFileloc (constraintExpr expr)
1635{
1636 constraintExpr e;
1637constraintTerm t;
1638 constraintExprKind kind;
1639
1640 kind = expr->kind;
1641
1642 switch (kind)
1643 {
1644 case term:
1645 t = constraintExprData_termGetTerm (expr->data);
1646 return (constraintTerm_getFileloc (t) );
c3e695ff 1647 /*@notreached@*/
3aaedf88 1648 break;
1649 case unaryExpr:
1650 e = constraintExprData_unaryExprGetExpr (expr->data);
1651 return (constraintExpr_getFileloc (e) );
c3e695ff 1652 /*@notreached@*/
3aaedf88 1653 break;
1654 case binaryexpr:
1655 e = constraintExprData_binaryExprGetExpr1 (expr->data);
1656 return (constraintExpr_getFileloc (e) );
c3e695ff 1657 /*@notreached@*/
1658 break;
3aaedf88 1659 }
1660 llassert (FALSE);
3aaedf88 1661 return (fileloc_undefined);
1662}
1663
c3e695ff 1664/*drl moved from constriantTerm.c 5/20/001*/
4ab867d6 1665static /*@only@*/ constraintExpr
1666doFixResultTerm (/*@only@*/ constraintExpr e, /*@exposed@*/ exprNode fcnCall)
c3e695ff 1667{
1668 constraintTerm t;
1669 sRef s;
1670 /*maybe this should move to cosntraintExpr.c -drl7x 5/18/01*/
a779b61e 1671 /*@i22*/
1672
1673 constraintExprData data = e->data;
1674 constraintExprKind kind = e->kind;
c3e695ff 1675
1676 constraintExpr ret;
1677
1678 llassert(kind == term);
1679
1680 t = constraintExprData_termGetTerm (data);
28bf4b0b 1681 llassert (constraintTerm_isDefined(t) );
c3e695ff 1682
1683 ret = e;
a8e557d3 1684 switch (constraintTerm_getKind(t) )
c3e695ff 1685 {
1686 case EXPRNODE:
1687 break;
1688 case INTLITERAL:
1689 break;
1690
1691 case SREF:
a8e557d3 1692 s = constraintTerm_getSRef(t);
c3e695ff 1693 if (sRef_isResult (s))
1694 {
1695 ret = constraintExpr_makeExprNode(fcnCall);
4ab867d6 1696 constraintExpr_free(e);
1697 e = NULL;
1698 }
1699 else
1700 {
1701 e = NULL;
c3e695ff 1702 }
1703 break;
1704 default:
1705 BADEXIT;
1706 }
1707
1708 return ret;
1709
1710}
1711
1712/*drl moved from constriantTerm.c 5/20/001*/
d46ce6a4 1713/*@only@*/ static constraintExpr
4ab867d6 1714doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr e, /*@observer@*/ /*@temp@*/ exprNodeList arglist)
c3e695ff 1715{
1716 constraintTerm t;
1717
d46ce6a4 1718 constraintExprData data = e->data;
c3e695ff 1719
d46ce6a4 1720 constraintExprKind kind = e->kind;
c3e695ff 1721
1722 constraintExpr ret;
1723
1724 llassert(kind == term);
1725
1726 t = constraintExprData_termGetTerm (data);
28bf4b0b 1727 llassert (constraintTerm_isDefined(t) );
c3e695ff 1728
1729 ret = e;
b9904f57 1730
1731 DPRINTF (("Fixing: %s", constraintExpr_print (e)));
1732
1733 switch (constraintTerm_getKind(t))
c3e695ff 1734 {
1735 case EXPRNODE:
bb25bea6 1736 DPRINTF((message ("%q @ %q ", constraintTerm_print(t),
1737 fileloc_unparse (constraintTerm_getFileloc(t) ) ) ));
c3e695ff 1738 break;
1739 case INTLITERAL:
bb25bea6 1740 DPRINTF((message (" %q ", constraintTerm_print (t)) ));
d46ce6a4 1741 break;
c3e695ff 1742
1743 case SREF:
b9904f57 1744 /* evans 2001-07-24: constants should use the original term */
1745 if (!constraintTerm_canGetValue (t))
1746 {
1747 DPRINTF ((message("Doing sRef_fixConstraintParam for %q ",
1748 constraintTerm_print (t) ) ));
1749 ret = sRef_fixConstraintParam (constraintTerm_getSRef(t), arglist);
1750
1751 constraintExpr_free (e);
1752
1753 DPRINTF (( message("After Doing sRef_fixConstraintParam constraintExpr is %q ",
1754 constraintExpr_print (ret) ) ));
1755 /*@-branchstate@*/
1756 } /*@=branchstate@*/
d46ce6a4 1757
c3e695ff 1758 break;
1759 default:
1760 BADEXIT;
1761 }
b9904f57 1762
c3e695ff 1763 return ret;
1764
1765}
3aaedf88 1766
1767
1768/* bool constraintExpr_includesTerm (constraintExpr expr, constraintTerm term) */
1769/* { */
1770/* if (constraintTerm_hasTerm (expr->term, term) ) */
1771/* return TRUE; */
1772
1773/* if ( (expr->expr) != NULL) */
1774/* { */
1775/* return ( constraintExpr_includesTerm (expr->expr, term) ); */
1776/* } */
1777/* return FALSE; */
1778
1779/* } */
1780
bb25bea6 1781/*drl added 6/11/01 */
1782bool constraintExpr_isBinaryExpr (/*@observer@*/ constraintExpr c)
1783{
1784 if (c->kind == binaryexpr)
1785 return TRUE;
3aaedf88 1786
bb25bea6 1787 else
1788 return FALSE;
1789}
3aaedf88 1790
a779b61e 1791/*drl added 8/08/001 */
1792bool constraintExpr_isTerm (/*@observer@*/ constraintExpr c) /*@*/
1793{
1794 if (c->kind == term)
1795 return TRUE;
1796
1797 else
1798 return FALSE;
1799}
1800
1801/*@observer@*/ /*@temp@*/ constraintTerm constraintExpr_getTerm ( /*@temp@*/ /*@observer@*/ constraintExpr c) /*@*/
1802{
1803 constraintTerm term;
1804
1805 llassert(constraintExpr_isTerm(c) );
1806
1807 term = constraintExprData_termGetTerm(c->data);
1808
1809 return term;
1810}
1811
920a3797 1812static void binaryExpr_dump (/*@observer@*/ constraintExprData data, FILE *f)
1813{
1814 constraintExpr expr1;
1815 constraintExprBinaryOpKind binaryOp;
1816 constraintExpr expr2;
1817
1818
1819 binaryOp = constraintExprData_binaryExprGetOp (data);
1820
1821 fprintf(f, "%d\n", (int) binaryOp);
1822
1823 expr1 = constraintExprData_binaryExprGetExpr1 (data);
1824 expr2 = constraintExprData_binaryExprGetExpr2 (data);
1825
1826 fprintf(f, "e1\n");
1827
1828 constraintExpr_dump(expr1, f);
1829
1830 fprintf(f, "e2\n");
1831 constraintExpr_dump(expr2, f);
1832}
1833
1834
1835static constraintExpr binaryExpr_undump (FILE *f)
1836{
1837 constraintExpr expr1;
1838 constraintExprBinaryOpKind binaryOp;
1839 constraintExpr expr2;
1840
1841 constraintExpr ret;
1842
1843
1844
1845 char * str;
1846 char * os;
1847
1848 str = mstring_create (MAX_DUMP_LINE_LENGTH);
1849 os = str;
1850 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1851
1852
28bf4b0b 1853 binaryOp = (constraintExprBinaryOpKind) reader_getInt(&str);
920a3797 1854
1855 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1856
28bf4b0b 1857 reader_checkChar (&str, 'e');
1858 reader_checkChar (&str, '1');
920a3797 1859
1860 expr1 = constraintExpr_undump (f);
1861
1862 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1863
28bf4b0b 1864 reader_checkChar (&str, 'e');
1865 reader_checkChar (&str, '2');
920a3797 1866
1867 expr2 = constraintExpr_undump (f);
1868
1869 ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2);
1870 ret->data = constraintExprData_binaryExprSetOp(ret->data, binaryOp);
1871
1872 free(os);
1873 return ret;
1874}
1875
1876
1877
1878static void unaryExpr_dump (/*@observer@*/ constraintExprData data, FILE *f)
1879{
1880
1881 constraintExpr expr;
1882 constraintExprUnaryOpKind unaryOp;
1883
1884 unaryOp = constraintExprData_unaryExprGetOp (data);
1885
1886 fprintf(f, "%d\n", (int) unaryOp);
1887
1888 expr = constraintExprData_unaryExprGetExpr (data);
1889
1890 constraintExpr_dump(expr, f);
1891}
1892
1893static constraintExpr unaryExpr_undump ( FILE *f)
1894{
1895
1896 constraintExpr expr;
1897 constraintExprUnaryOpKind unaryOp;
1898 constraintExpr ret;
1899
1900 char * str;
1901 char * os;
1902
1903 str = mstring_create (MAX_DUMP_LINE_LENGTH);
1904 os = str;
1905 str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1906
28bf4b0b 1907 unaryOp = (constraintExprUnaryOpKind) reader_getInt(&str);
920a3797 1908
1909 expr = constraintExpr_undump (f);
1910
1911 ret = constraintExpr_makeUnaryOp (expr, unaryOp);
1912
1913 free(os);
1914
1915 return ret;
1916}
1917
1918void constraintExpr_dump (/*@observer@*/ constraintExpr expr, FILE *f)
1919{
1920 constraintExprKind kind;
1921 constraintTerm t;
1922
1923
1924 kind = expr->kind;
1925
1926 fprintf(f,"%d\n", (int) kind);
1927
1928 switch (kind)
1929 {
1930 case term:
1931 t = constraintExprData_termGetTerm (expr->data);
1932 constraintTerm_dump (t, f);
1933 break;
1934 case unaryExpr:
1935 unaryExpr_dump (expr->data, f);
1936 break;
1937 case binaryexpr:
1938 binaryExpr_dump (expr->data, f);
1939 break;
1940 }
1941}
1942
1943/*@only@*/ constraintExpr constraintExpr_undump (FILE *f)
1944{
1945 constraintExprKind kind;
1946 constraintTerm t;
1947 constraintExpr ret;
1948
1949 char * s;
1950 char * os;
1951
1952 s = mstring_create (MAX_DUMP_LINE_LENGTH);
1953
1954 os = s;
1955
1956 s = fgets(os, MAX_DUMP_LINE_LENGTH, f);
1957
28bf4b0b 1958 kind = (constraintExprKind) reader_getInt(&s);
920a3797 1959
1960 free (os);
1961
1962 switch (kind)
1963 {
1964 case term:
1965 t = constraintTerm_undump (f);
1966 ret = constraintExpr_makeTerm(t);
1967 break;
1968 case unaryExpr:
1969 ret = unaryExpr_undump (f);
1970 break;
1971 case binaryexpr:
1972 ret = binaryExpr_undump (f);
1973 break;
1974 }
1975
1976 return ret;
1977
1978}
a779b61e 1979
1980int constraintExpr_getDepth (constraintExpr ex)
1981{
1982 int ret;
1983
1984 constraintExprKind kind;
1985
1986 llassert (ex != NULL);
1987
1988 kind = ex->kind;
1989
1990 switch (kind)
1991 {
1992 case term:
1993 ret = 1;
1994 break;
1995 case unaryExpr:
1996 ret = constraintExpr_getDepth (constraintExprData_unaryExprGetExpr (ex->data) );
1997 ret++;
1998
1999 break;
2000 case binaryexpr:
2001 ret = 0;
2002 ret = constraintExpr_getDepth (constraintExprData_binaryExprGetExpr1 (ex->data) );
2003
2004 ret++;
2005
2006 ret += constraintExpr_getDepth (constraintExprData_binaryExprGetExpr2 (ex->data) );
2007
2008 break;
2009 default:
2010 BADEXIT;
2011 }
2012
2013 return ret;
2014}
2015
2016
2017
This page took 0.412772 seconds and 5 git commands to generate.