]> andersk Git - splint.git/blobdiff - src/functionConstraint.c
Fixed all /*@i...@*/ tags (except 1).
[splint.git] / src / functionConstraint.c
index 292056314b7db532daa5ae924a430c42af03d9bf..4bed9ac4b97a73bad84a979b18b7f931e992e2d4 100644 (file)
@@ -1,6 +1,6 @@
 /*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2001 University of Virginia,
+** Splint - annotation-assisted static program checker
+** Copyright (C) 1994-2003 University of Virginia,
 **         Massachusetts Institute of Technology
 **
 ** This program is free software; you can redistribute it and/or modify it
 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 ** MA 02111-1307, USA.
 **
-** For information on lclint: lclint-request@cs.virginia.edu
-** To report a bug: lclint-bug@cs.virginia.edu
-** For more information: http://lclint.cs.virginia.edu
+** For information on splint: info@splint.org
+** To report a bug: splint-bug@splint.org
+** For more information: http://www.splint.org
 */
 /*
 ** functionConstraint.c
 */
 
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
 # include "basic.h"
-# include "mtincludes.h"
 
-static /*@only@*/ /*@notnull@*/ /*@special@*/ functionConstraint  /*@i32 need special? @*/
+static /*@only@*/ /*@notnull@*/ /*@special@*/ functionConstraint 
 functionConstraint_alloc (functionConstraintKind kind) /*@defines result->kind@*/
 {
   functionConstraint res = (functionConstraint) dmalloc (sizeof (*res));
@@ -52,6 +51,16 @@ extern functionConstraint functionConstraint_createMetaStateConstraint (metaStat
   return res;
 }
 
+extern functionConstraint functionConstraint_conjoin (functionConstraint f1, functionConstraint f2)
+{
+  functionConstraint res = functionConstraint_alloc (FCT_CONJUNCT);
+  res->constraint.conjunct.op1 = f1;
+  res->constraint.conjunct.op2 = f2;
+  DPRINTF (("Conjoining ==> %s",
+           functionConstraint_unparse (res)));
+  return res;
+}
+
 /*@only@*/ cstring functionConstraint_unparse (functionConstraint p)
 {
   if (functionConstraint_isDefined (p)) 
@@ -62,6 +71,10 @@ extern functionConstraint functionConstraint_createMetaStateConstraint (metaStat
          return constraintList_unparse (p->constraint.buffer);
        case FCT_METASTATE:
          return metaStateConstraint_unparse (p->constraint.metastate);
+       case FCT_CONJUNCT:
+         return message ("%q /\\ %q",
+                         functionConstraint_unparse (p->constraint.conjunct.op1),
+                         functionConstraint_unparse (p->constraint.conjunct.op2));
          BADDEFAULT;
        }
       BADBRANCH;
@@ -72,23 +85,90 @@ extern functionConstraint functionConstraint_createMetaStateConstraint (metaStat
     }
 }
 
-extern constraintList functionConstraint_getBufferConstraint (functionConstraint node)
+extern constraintList functionConstraint_getBufferConstraints (functionConstraint node)
 {
-  llassert (functionConstraint_isDefined (node));
-  llassert (node->kind == FCT_BUFFER);
-  return node->constraint.buffer;
+  if (functionConstraint_isDefined (node))
+    {
+      if (node->kind == FCT_CONJUNCT)
+       {
+         /* make sure this is safe*/
+         return constraintList_addListFree (functionConstraint_getBufferConstraints (node->constraint.conjunct.op1),
+                                            functionConstraint_getBufferConstraints (node->constraint.conjunct.op2));
+       }
+      else
+       {
+         if (node->kind == FCT_BUFFER)
+           {
+             return constraintList_copy (node->constraint.buffer);
+           }
+         else
+           {
+             return constraintList_undefined;
+           }
+       }
+    }
+  else
+    {
+      return constraintList_undefined;
+    }
 }
 
-extern metaStateConstraint functionConstraint_getMetaStateConstraint (functionConstraint node)
+extern metaStateConstraintList functionConstraint_getMetaStateConstraints (functionConstraint node)
 {
-  llassert (functionConstraint_isDefined (node));
-  llassert (node->kind == FCT_METASTATE);
-  return node->constraint.metastate;
+  if (functionConstraint_isDefined (node))
+    {
+      if (node->kind == FCT_CONJUNCT)
+       {
+         return metaStateConstraintList_append 
+           (functionConstraint_getMetaStateConstraints (node->constraint.conjunct.op1),
+            functionConstraint_getMetaStateConstraints (node->constraint.conjunct.op2));
+       }
+      else
+       {
+         if (node->kind == FCT_METASTATE)
+           {
+             return metaStateConstraintList_single (node->constraint.metastate);
+           }
+         else
+           {
+             return metaStateConstraintList_undefined;
+           }
+       }
+    }
+  else
+    {
+      return metaStateConstraintList_undefined;
+    }
 }
 
 extern bool functionConstraint_hasBufferConstraint (functionConstraint node)
 {
-  return functionConstraint_isDefined (node) && node->kind == FCT_BUFFER;
+  if (functionConstraint_isDefined (node))
+    {
+      return node->kind == FCT_BUFFER
+       || (node->kind == FCT_CONJUNCT 
+           && (functionConstraint_hasBufferConstraint (node->constraint.conjunct.op1) 
+               || functionConstraint_hasBufferConstraint (node->constraint.conjunct.op2)));
+    }
+  else
+    {
+      return FALSE;
+    }
+}
+
+extern bool functionConstraint_hasMetaStateConstraint (functionConstraint node)
+{
+  if (functionConstraint_isDefined (node))
+    {
+      return node->kind == FCT_METASTATE
+       || (node->kind == FCT_CONJUNCT 
+           && (functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op1) 
+               || functionConstraint_hasMetaStateConstraint (node->constraint.conjunct.op2)));
+    }
+  else
+    {
+      return FALSE;
+    }
 }
 
 extern functionConstraint functionConstraint_copy (functionConstraint node) 
@@ -101,6 +181,9 @@ extern functionConstraint functionConstraint_copy (functionConstraint node)
          return functionConstraint_createBufferConstraint (constraintList_copy (node->constraint.buffer));
        case FCT_METASTATE:
          return functionConstraint_createMetaStateConstraint (metaStateConstraint_copy (node->constraint.metastate));
+       case FCT_CONJUNCT:
+         return functionConstraint_conjoin (functionConstraint_copy (node->constraint.conjunct.op1),
+                                            functionConstraint_copy (node->constraint.conjunct.op2));
        }
       
       BADBRANCH;
@@ -109,6 +192,8 @@ extern functionConstraint functionConstraint_copy (functionConstraint node)
     {
       return functionConstraint_undefined;
     }
+
+  BADBRANCHRET (functionConstraint_undefined);
 }
 
 extern void functionConstraint_free (/*@only@*/ functionConstraint node) 
@@ -123,9 +208,47 @@ extern void functionConstraint_free (/*@only@*/ functionConstraint node)
        case FCT_METASTATE:
          metaStateConstraint_free (node->constraint.metastate);
          break;
-         BADDEFAULT;
+       case FCT_CONJUNCT:
+         functionConstraint_free (node->constraint.conjunct.op1);
+         functionConstraint_free (node->constraint.conjunct.op2);
+         break;
+        BADDEFAULT;
        }
       
       sfree (node);
     }
 }
+
+/*drl modified */
+void functionConstraint_addBufferConstraints (functionConstraint node, constraintList clist) 
+{
+  constraintList temp;
+
+  temp = constraintList_copy (clist);
+  
+  if (functionConstraint_isDefined (node))
+    {
+      if (node->kind == FCT_CONJUNCT)
+       {
+         functionConstraint_addBufferConstraints (node->constraint.conjunct.op1, constraintList_copy(temp) );
+         functionConstraint_addBufferConstraints (node->constraint.conjunct.op2,temp);
+       }
+      else
+       {
+         if (node->kind == FCT_BUFFER)
+           {
+             node->constraint.buffer = constraintList_addListFree(node->constraint.buffer, temp);
+           }
+         else
+           {
+             constraintList_free (temp);
+             return;
+           }
+       }
+    }
+  else
+    {
+      constraintList_free (temp);
+      return;
+    }
+}
This page took 0.043207 seconds and 4 git commands to generate.