]> andersk Git - splint.git/blobdiff - src/multiVal.c
Fixed problem with shadow parameters.
[splint.git] / src / multiVal.c
index cf054be88ad88adc65ef69abb0358c4e4ecb9b45..b2bee5816f02408feed67bc6a92c6834f8ac3877 100644 (file)
@@ -1,6 +1,6 @@
 /*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2000 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
 */
 /*
 ** multiVal.c
 */
 
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
 # include "basic.h"
 
 /*@only@*/ multiVal multiVal_unknown ()
@@ -53,8 +53,8 @@ static /*@special@*/ /*@notnull@*/ multiVal multiVal_create (mvkind kind)
 /*@only@*/ multiVal multiVal_makeChar (char x)
 {
   multiVal mv = multiVal_create (MVCHAR);
-    mv->value.cval = x;
-    return mv;
+  mv->value.cval = x;
+  return mv;
 }
 
 /*@only@*/ multiVal multiVal_makeDouble (double x)
@@ -130,9 +130,12 @@ multiVal multiVal_invert (multiVal m)
 
 long multiVal_forceInt (multiVal m)
 {
-  llassert (multiVal_isInt (m));
-
-  return m->value.ival;
+  if (multiVal_isInt (m)) {
+    return m->value.ival;
+  } else {
+    llcontbug (message ("Multival is not int: %s", multiVal_unparse (m)));
+    return 0;
+  }
 }
 
 char multiVal_forceChar (multiVal m)
@@ -230,13 +233,13 @@ bool multiVal_isString (multiVal m)
     {
     case 'i':
       (*s)++;
-      return multiVal_makeInt (getInt (s));
+      return multiVal_makeInt (reader_getInt (s));
     case 'c':
       (*s)++;
-      return multiVal_makeChar ((char) getInt (s));
+      return multiVal_makeChar ((char) reader_getInt (s));
     case 'd':
       (*s)++;
-      return multiVal_makeDouble (getDouble (s));
+      return multiVal_makeDouble (reader_getDouble (s));
     case 's':
       {
        cstring st = cstring_undefined;
@@ -288,6 +291,95 @@ int multiVal_compare (multiVal m1, multiVal m2)
   BADEXIT;
 }
 
+multiVal multiVal_add (multiVal m1, multiVal m2)
+{
+  if (multiVal_isUndefined (m1) || multiVal_isUndefined (m2) || m1->kind != m2->kind)
+    {
+      return multiVal_undefined;
+    }
+
+  switch (m1->kind)
+    {
+    case MVLONG:   return (multiVal_makeInt (m1->value.ival + m2->value.ival));
+    case MVCHAR:   return (multiVal_makeChar ((char) (m1->value.cval + m2->value.cval)));
+    case MVDOUBLE: return (multiVal_makeDouble (m1->value.fval + m2->value.fval));
+    case MVSTRING: return multiVal_undefined;
+    }
+
+  BADEXIT;
+}
+
+multiVal multiVal_subtract (multiVal m1, multiVal m2)
+{
+  if (multiVal_isUndefined (m1) || multiVal_isUndefined (m2) || m1->kind != m2->kind)
+    {
+      return multiVal_undefined;
+    }
+
+  switch (m1->kind)
+    {
+    case MVLONG:   return (multiVal_makeInt (m1->value.ival - m2->value.ival));
+    case MVCHAR:   return (multiVal_makeChar ((char) (m1->value.cval - m2->value.cval)));
+    case MVDOUBLE: return (multiVal_makeDouble (m1->value.fval - m2->value.fval));
+    case MVSTRING: return multiVal_undefined;
+    }
+
+  BADEXIT;
+}
+
+multiVal multiVal_multiply (multiVal m1, multiVal m2)
+{
+  if (multiVal_isUndefined (m1) || multiVal_isUndefined (m2) || m1->kind != m2->kind)
+    {
+      return multiVal_undefined;
+    }
+
+  switch (m1->kind)
+    {
+    case MVLONG:   return (multiVal_makeInt (m1->value.ival * m2->value.ival));
+    case MVCHAR:   return (multiVal_makeChar ((char) (m1->value.cval * m2->value.cval)));
+    case MVDOUBLE: return (multiVal_makeDouble (m1->value.fval * m2->value.fval));
+    case MVSTRING: return multiVal_undefined;
+    }
+
+  BADEXIT;
+}
+
+multiVal multiVal_divide (multiVal m1, multiVal m2)
+{
+  if (multiVal_isUndefined (m1) || multiVal_isUndefined (m2) || m1->kind != m2->kind)
+    {
+      return multiVal_undefined;
+    }
+
+  switch (m1->kind)
+    {
+    case MVLONG: 
+      if (m2->value.ival != 0)
+       {
+         return (multiVal_makeInt (m1->value.ival / m2->value.ival));
+       }
+      else
+       {
+         return multiVal_undefined;
+       }
+    case MVCHAR:   
+      if (m2->value.cval != (char) 0)
+       {
+         return (multiVal_makeChar ((char) (m1->value.cval / m2->value.cval)));
+       }
+      else
+       {
+         return multiVal_undefined;
+       }
+    case MVDOUBLE:
+      return multiVal_undefined; /* Don't attempt to divide floats */
+    case MVSTRING: return multiVal_undefined;
+    }
+
+  BADEXIT;
+}
+
 void multiVal_free (/*@only@*/ multiVal m)
 {
   if (multiVal_isDefined (m))
This page took 0.043592 seconds and 4 git commands to generate.