globle struct lhsParseNode *GetExpressionVarConstraints( struct lhsParseNode *theExpression) { struct lhsParseNode *list1 = NULL, *list2; for (; theExpression != NULL; theExpression = theExpression->bottom) { if (theExpression->right != NULL) { list2 = GetExpressionVarConstraints(theExpression->right); list1 = AddToVariableConstraints(list2,list1); } if (theExpression->type == SF_VARIABLE) { list2 = GetLHSParseNode(); if (theExpression->referringNode != NULL) { list2->type = theExpression->referringNode->type; } else { list2->type = SF_VARIABLE; } list2->value = theExpression->value; list2->derivedConstraints = TRUE; list2->constraints = CopyConstraintRecord(theExpression->constraints); list1 = AddToVariableConstraints(list2,list1); } } return(list1); }
globle struct lhsParseNode *DeriveVariableConstraints( void *theEnv, struct lhsParseNode *theNode) { struct lhsParseNode *orNode, *andNode; struct lhsParseNode *list1, *list2, *list3 = NULL; int first = TRUE; /*===============================*/ /* Process the constraints for a */ /* single connected constraint. */ /*===============================*/ for (orNode = theNode->bottom; orNode != NULL; orNode = orNode->bottom) { /*=================================================*/ /* Intersect all of the &'ed constraints together. */ /*=================================================*/ list2 = NULL; for (andNode = orNode; andNode != NULL; andNode = andNode->right) { if ((andNode->type == RETURN_VALUE_CONSTRAINT) || (andNode->type == PREDICATE_CONSTRAINT)) { list1 = GetExpressionVarConstraints(theEnv,andNode->expression); list2 = AddToVariableConstraints(theEnv,list2,list1); } } if (first) { list3 = list2; first = FALSE; } else { list3 = UnionVariableConstraints(theEnv,list3,list2); } } return(list3); }