[pure-lang-svn] SF.net SVN: pure-lang:[496] pure/trunk
Status: Beta
                
                Brought to you by:
                
                    agraef
                    
                
            | 
     
      
      
      From: <ag...@us...> - 2008-08-14 13:37:07
      
     
   | 
Revision: 496
          http://pure-lang.svn.sourceforge.net/pure-lang/?rev=496&view=rev
Author:   agraef
Date:     2008-08-14 13:37:16 +0000 (Thu, 14 Aug 2008)
Log Message:
-----------
Added ubyte, ushort, uint, ulong routines to convert integers to unsigned quantities, as discussed on the mailing list.
Modified Paths:
--------------
    pure/trunk/ChangeLog
    pure/trunk/lib/primitives.pure
Modified: pure/trunk/ChangeLog
===================================================================
--- pure/trunk/ChangeLog	2008-08-14 13:03:22 UTC (rev 495)
+++ pure/trunk/ChangeLog	2008-08-14 13:37:16 UTC (rev 496)
@@ -1,5 +1,9 @@
 2008-08-14  Albert Graef  <Dr....@t-...>
 
+	* lib/primitives.pure: Added routines to convert signed integers
+	to the corresponding unsigned quantities, as discussed on the
+	mailing list.
+
 	* lib/math.pure: Bugfixes, overhaul of number predicates, added
 	missing semantic number predicates.
 
Modified: pure/trunk/lib/primitives.pure
===================================================================
--- pure/trunk/lib/primitives.pure	2008-08-14 13:03:22 UTC (rev 495)
+++ pure/trunk/lib/primitives.pure	2008-08-14 13:37:16 UTC (rev 496)
@@ -91,6 +91,21 @@
 pointer x::double	|
 pointer x::string	= pure_pointerval x;
 
+/* Convert signed (8/16/32/64) bit integers to the corresponding unsigned
+   quantities. These functions behave as if the value was "cast" to the
+   corresponding unsigned C type, and are most useful for dealing with
+   unsigned integers returned by external C routines. The routines always use
+   the smallest Pure int type capable of holding the result: int for ubyte and
+   ushort, bigint for uint and ulong. (Note that in the case of 64 bit values
+   the C interface returns a bigint, that's why ulong takes a bigint
+   parameter. The other routines all take an int as input.)  */
+
+ubyte x::int		= if x>=0 then x else x+0x100;
+ushort x::int		= if x>=0 then x else x+0x10000;
+uint x::int		= if x>=0 then bigint x else x+0x100000000L;
+ulong x::bigint		= if x>=0 then x else x+0x10000000000000000L;
+
+
 /* Absolute value and sign of a number. */
 
 abs x::int | abs x::bigint | abs x::double
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |