4.3BSD/usr/contrib/icon/rt/numcmp.c

Compare this file to the similar file:
Show the results in this format:

#include "../h/rt.h"

/*
 * numcmp - compare two numbers.  Returns -1, 0, 1 for arg1 <, =, > arg2.
 *  arg0 is made into a descriptor for the return value.
 */

numcmp(arg1, arg2, arg0)
struct descrip *arg1, *arg2, *arg0;
   {
   register int result;
   union numeric n1, n2;
   int t1, t2;
   /*
    * Be sure that both arg1 and arg2 are numeric.
    */

   if ((t1 = cvnum(arg1, &n1)) == NULL)
      runerr(102, arg1);
   if ((t2 = cvnum(arg2, &n2)) == NULL)
      runerr(102, arg2);

   if (t1 == T_LONGINT && t2 == T_LONGINT) {
   /*
    *  arg1 and arg2 are both integers, compare them and
    *  create an integer descriptor in arg0
    */

          result = 0;
          if (n1.integer < n2.integer) result = -1;
          else if (n1.integer != n2.integer) result = 1;
      mkint(n2.integer, arg0);
      }
   else {

   /*
    *  Either arg1 or arg2 is real. Convert the other to a real,
    *  compare them and create a real descriptor in arg0.
    */

      if (t1 == T_LONGINT)
         n1.real = n1.integer;
      if (t2 == T_LONGINT)
         n2.real = n2.integer;
          result = 0;
          if (n1.real < n2.real) result = -1;
          else if (n1.real != n2.real) result = 1;
      mkreal(n2.real, arg0);
      }

   return (result);             /* return result in r0 */
   }