> On Wed, 2007-10-24 at 21:49 +0100, William S Fulton wrote:
> 
> > Any portable solutions for extracting the unsigned long long number?
> 
> The best effort I can provide is what's in Glib.  They do what
> Sisyphus suggests: represent big numbers as strings if necessary.

You can represent them as vectors. If you only want to do +- >=< 
stuff, then see the C and pureperl equiv routines in 
NetAddr::IP::Util that handle 128 bit numbers. Otherwise you are 
stuck with Math::BigInt

Michael
> 
> #ifdef _MSC_VER
> # include <stdlib.h>
> #endif
> 
> #ifdef WIN32
> # ifdef _MSC_VER
> #  define PORTABLE_STRTOULL(str, end, base) _strtoui64 (str, end,
> #  base)
> # else
> #  define PORTABLE_STRTOULL(str, end, base) strtoul (str, end, base)
> # endif
> #else
> # define PORTABLE_STRTOULL(str, end, base) strtoull (str, end, base)
> #endif
> 
> guint64
> SvGUInt64 (SV *sv)
> {
> #ifdef USE_64_BIT_ALL
>  return SvUV (sv);
> #else
>  return PORTABLE_STRTOULL (SvPV_nolen (sv), NULL, 10);
> #endif
> }
> 
> SV *
> newSVGUInt64 (guint64 value)
> {
> #ifdef USE_64_BIT_ALL
>  return newSVuv (value);
> #else
>  char string[25];
>  STRLEN length;
>  SV *sv;
> 
>  /* newSVpvf doesn't seem to work correctly. */
>  length = sprintf(string, "%llu", value);
>  sv = newSVpv (string, length);
> 
>  return sv;
> #endif
> }
> 
> This seems to work OK on most Unices, but doesn't seem to cut it on
> Win32.  It compiles, but according to testers, the 64 bit number tests
> fail.
> 
> If anyone can offer any improvements, they'd be more than welcome.
> 
> -- 
> Bye,
> -Torsten


Reply via email to