! longint.inf - test harness for longint.h (long integer support for Inform)
!
! Mainly by Chris Hall - [email protected].
! Signed integer support by Francis Irving - [email protected].
! Please email us with any errors, omissions or if you've
! found this code useful.
!
! (If you need to edit this file, note that indentations are 4 spaces
! and tabs are not used.)
!
! This source code is distributed free, but remains
! Copyright 1997-1998 Chris Hall and Francis Irving.  Release 1.

Include "longint";

[Main;
   Arithmetic();
   ArrayOfLongs();
];

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! This section shows how to make an array (ServerUse)
! of long integer variables.

Constant MAX_SERVERS = 10;

! Allow four times the number of servers - 4 bytes per server
! Make sure you store this calculation as a separate constant.  If
! you include the calculation directly in the Array definition below, then
! it doesn't work due to an Inform 6.14 bug.
Constant SERVER_SPACE = MAX_SERVERS * 4;

!  Byte array to store longs for servers numbered 0 to (MAX_SERVERS - 1)
Array ServerUse -> SERVER_SPACE;

Array one -> 4;

[ArrayOfLongs n c;
   print MAX_SERVERS, " max^";

   for (n=0: n < MAX_SERVERS: ++n)
   {
       c = (ServerUse + (n*4));
       LongSet((ServerUse + (n*4)), 0, 0, 0, 0);
   }

   LongSet(one, 0, 0, 0, 1);
   for (c=0: c < 50: ++c)
   {
       n = random(MAX_SERVERS) - 1;
       LongAdd(ServerUse + (n*4), ServerUse + (n*4), one);
       print "Server ", n, " now at ", (longunsign) (ServerUse + (n*4)), "^";
   }
];

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! This section makes three long integer variables, and tests the
! arithmetic functions using them.

! This is how you declare each of your long variables.  They can
! be signed or unsigned.  Both types are declared the same -
! you just use different functions to manipulate them.
Array x->4;
Array y->4;
Array z->4;

[Arithmetic;
   LongSet(x,$4a,$65,$75,$c0); LongSet(y,$3a,$de,$68,$b1);
   LongAdd(z,x,y); print (longunsign)x,"+",(longunsign)y,"=",(longunsign)z,"^";

   LongSet(x,$7d,$c2,$29,$3f); LongSet(y,$07,$5b,$cd,$15);
   LongSub(z,x,y); print (longsign)x,"-",(longsign)y,"=",(longsign)z,"^";
   LongSub(z,y,x); print (longsign)y,"-",(longsign)x,"=",(longsign)z,"^";
   print "^";

   ! You can use LongSet like this, to fill in small numbers.
   LongSet(x,0,0,0,0); LongSet(y,0,0,0,1);
   LongSub(z,x,y); print (longsign)x,"-",(longsign)y,"=",(longsign)z,"^";
   print "^";

   LongSet(x,$00,$00,$30,$39); LongSet(y,$00,$01,$81,$cd);
   LongMul(z,x,y); print (longsign)x,"*",(longsign)y,"=",(longsign)z,"^";
   LongSignNegAssign(x, x);
   LongMul(z,x,y); print (longsign)x,"*",(longsign)y,"=",(longsign)z,"^";
   LongSignNegAssign(y, y);
   LongMul(z,x,y); print (longsign)x,"*",(longsign)y,"=",(longsign)z,"^";
   LongSignNegAssign(x, x);
   LongMul(z,x,y); print (longsign)x,"*",(longsign)y,"=",(longsign)z,"^";
   print "^";

   LongSet(x,$00,$00,$ff,$ff); LongSet(y,$00,$00,$ff,$ff);
   LongMul(z,x,y); print (longunsign)x,"*",(longunsign)y,"=",(longunsign)z,"^";
   print "^";

   LongSet(x,$49,$96,$02,$d2); LongSet(y,$00,$00,$00,$07);
   LongSignDiv(z,x,y); print (longsign)x,"/",(longsign)y,"=",(longsign)z,"^";
   LongSignMod(z,x,y); print (longsign)x,"%",(longsign)y,"=",(longsign)z,"^";
   LongSignNegAssign(x, x);
   LongSignDiv(z,x,y); print (longsign)x,"/",(longsign)y,"=",(longsign)z,"^";
   LongSignMod(z,x,y); print (longsign)x,"%",(longsign)y,"=",(longsign)z,"^";
   LongSignNegAssign(y, y);
   LongSignDiv(z,x,y); print (longsign)x,"/",(longsign)y,"=",(longsign)z,"^";
   LongSignMod(z,x,y); print (longsign)x,"%",(longsign)y,"=",(longsign)z,"^";
   LongSignNegAssign(x, x);
   LongSignDiv(z,x,y); print (longsign)x,"/",(longsign)y,"=",(longsign)z,"^";
   LongSignMod(z,x,y); print (longsign)x,"%",(longsign)y,"=",(longsign)z,"^";
   print "^";

   LongSet(x, 0, 0, 0, 13); LongSet(y, 0, 0, 0, 1);
   LongSignDiv(z, x, y); print (longsign)x,"/",(longsign)y,"=",(longsign)z,"^";
   LongSignDiv(z, y, x); print (longsign)y,"/",(longsign)x,"=",(longsign)z,"^";
   print "^";

   LongSet(x,$4a,$65,$75,$c0);
   LongSignNegAssign(y, x);
   print "-", (longsign)x, "=", (longsign)y, "^";

   LongSet(x,0,0,0,5);
   LongSet(y,0,0,0,6);
   print (longsign)x,"<",(longsign)y,"=", LongSignLT(x, y) ,"^";
   print (longsign)y,"<",(longsign)x,"=", LongSignLT(y, x) ,"^";
   LongSignNegAssign(y, y);
   print (longsign)x,"<",(longsign)y,"=", LongSignLT(x, y) ,"^";
   print (longsign)y,"<",(longsign)x,"=", LongSignLT(y, x) ,"^";
   LongSignNegAssign(x, x);
   print (longsign)x,"<",(longsign)y,"=", LongSignLT(x, y) ,"^";
   print (longsign)y,"<",(longsign)x,"=", LongSignLT(y, x) ,"^";
   LongSignNegAssign(y, y);
   print (longsign)x,"<",(longsign)y,"=", LongSignLT(x, y) ,"^";
   print (longsign)y,"<",(longsign)x,"=", LongSignLT(y, x) ,"^";
];