+
+/*@only@*/ constraintTerm constraintTerm_undump (FILE *f)
+{
+ constraintTermType kind;
+ constraintTerm ret;
+
+ uentry ue;
+
+ char *str;
+ char *os;
+
+ os = mstring_create (MAX_DUMP_LINE_LENGTH);
+
+ str = fgets (os, MAX_DUMP_LINE_LENGTH, f);
+
+ llassert (str != NULL);
+
+ kind = (constraintTermType) reader_getInt(&str);
+ str = fgets(os, MAX_DUMP_LINE_LENGTH, f);
+
+ llassert (str != NULL);
+
+ switch (kind)
+ {
+
+ case CTT_SREF:
+ {
+ sRef s;
+ char * term;
+ term = reader_getWord(&str);
+
+ if (term == NULL)
+ {
+ llfatalbug (message ("Library file appears to be corrupted.") );
+ }
+ if (strcmp (term, "Result") == 0 )
+ {
+ s = sRef_makeResult (ctype_unknown);
+ }
+ else if (strcmp (term, "Param" ) == 0 )
+ {
+ int param;
+ char *str2, *ostr2;
+
+ ctype t;
+
+ reader_checkChar(&str, ' ');
+ str2 = reader_getWord(&str);
+ param = reader_getInt(&str);
+
+ if (str2 == NULL)
+ {
+ llfatalbug (message ("Library file appears to be corrupted.") );
+ }
+
+ ostr2 = str2;
+ t = ctype_undump(&str2) ;
+ s = sRef_makeParam (param, t, stateInfo_makeLoc (g_currentloc, SA_CREATED));
+ free (ostr2);
+ }
+ else if (strcmp (term, "sRef_dump" ) == 0 )
+ {
+ reader_checkChar(&str, ' ');
+ s = sRef_undump (&str);
+ }
+ else /* This must be an identified that we can search for in usymTab */
+ {
+ cstring termStr = cstring_makeLiteralTemp(term);
+
+ ue = usymtab_lookup (termStr);
+ s = uentry_getSref(ue);
+ }
+
+ ret = constraintTerm_makesRef(s);
+
+ free(term);
+ }
+ break;
+
+ case CTT_EXPR:
+ {
+ sRef s;
+ char * term;
+ cstring termStr;
+
+ term = reader_getWord(&str);
+
+ if (term == NULL)
+ {
+ llfatalbug (message ("Library file appears to be corrupted.") );
+ }
+
+ /* This must be an identifier that we can search for in usymTab */
+ termStr = cstring_makeLiteralTemp(term);
+
+ ue = usymtab_lookup (termStr);
+ s = uentry_getSref(ue);
+ ret = constraintTerm_makesRef(s);
+
+ free (term);
+ }
+ break;
+
+
+ case CTT_INTLITERAL:
+ {
+ int i;
+
+ i = reader_getInt(&str);
+ ret = constraintTerm_makeIntLiteral (i);
+ }
+ break;
+
+ default:
+ BADEXIT;
+ }
+ free (os);
+
+ return ret;
+}
+
+
+
+/* drl added sometime before 10/17/001*/
+ctype constraintTerm_getCType (constraintTerm term)
+{
+ ctype ct;
+
+ switch (term->kind)
+ {
+ case CTT_EXPR:
+ ct = exprNode_getType (term->value.expr);
+ break;
+
+ case CTT_INTLITERAL:
+ ct = ctype_signedintegral;
+ break;
+
+ case CTT_SREF:
+ ct = sRef_getType (term->value.sref) ;
+ break;
+ default:
+ BADEXIT;
+ }
+ return ct;
+}
+
+bool constraintTerm_isConstantOnly (constraintTerm term)
+{
+ switch (term->kind)
+ {
+ case CTT_EXPR:
+ if (exprNode_isNumLiteral (term->value.expr) ||
+ exprNode_isStringLiteral (term->value.expr) ||
+ exprNode_isCharLiteral (term->value.expr) )
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+
+ case CTT_INTLITERAL:
+ return TRUE;
+
+ case CTT_SREF:
+ if ( sRef_isConst (term->value.sref) )
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ default:
+ BADEXIT;
+ }
+
+ BADEXIT;
+}