Math-decNumber

 view release on metacpan or  search on metacpan

decNumber.xs  view on Meta::CPAN

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#define  DECNUMDIGITS 1         // number of digits set dynamically
#include <decContext.h>
#include <decNumber.h>

decContext set;                 // default working context
size_t CurrentNumSize;          // current size of a decNumber in bytes
decNumber One;                  // 1 for increment

// Returns the size in bytes of a decNumber with 'ndigits' digits
size_t SizeNum(int32_t ndigits) {
  if ( ndigits <1 ) ndigits = 1;
  if (ndigits <= DECDPUN ) return sizeof(decNumber);
  ndigits -= DECDPUN;
  return (ndigits/DECDPUN+(ndigits%DECDPUN?1:0)+1)*sizeof(decNumberUnit)+sizeof(decNumber);
}

#define DECNUM_ALLOC( name, size )  Newxc(name, size, char, decNumber); \
                                    if (name == NULL) croak("Out of memory!") \


#define DECNUM_FREE( name ) if ( name ) Safefree(name); \
                            name = NULL

#define DECNUM_ADJUST( name ) if ( name->digits < set.digits - 12 ) { \
                                Renewc(name, SizeNum(name->digits), char, decNumber);   \
                                if (name == NULL) croak("Out of memory!"); \
                              }


//=======================| Math::decContext

MODULE = Math::decContext   PACKAGE = Math::decContext

#============| Initialize default context

BOOT:
  decContextTestEndian(0);
  set.round = DEC_ROUND_HALF_EVEN;
  decContextZeroStatus(&set);
  set.traps = 0;
  set.clamp = 0;
  set.digits = 34;
  set.emin = -6143;
  set.emax = 6144;
  CurrentNumSize = SizeNum(set.digits);
  decNumberFromUInt32(&One, 1);


MODULE = Math::decNumber    PACKAGE = decNumberPtr    PREFIX = decNumber

#============| Destructor
void
decNumberDESTROY( number )
  decNumber * number
  PPCODE:
    // fprintf( stderr, "***> DESTROY %x\n", number);
    DECNUM_FREE(number);


MODULE = Math::decNumber    PACKAGE = Math::decNumber   PREFIX = decNumber

#============| Global context functions

void
ContextClearStatus( status )
  uint32_t status;
  CODE:
    decContextClearStatus(&set, status);

uint32_t
ContextGetStatus()
  CODE:
    RETVAL = decContextGetStatus(&set);
  OUTPUT:
    RETVAL

const char *
_ContextStatusToString()
  CODE:
    RETVAL = decContextStatusToString(&set);
  OUTPUT:
    RETVAL

void
ContextSetStatus( status )
  uint32_t status
  CODE:
    decContextSetStatus(&set, status);

void
ContextSetStatusQuiet( status )
  uint32_t status
  CODE:
    decContextSetStatusQuiet(&set, status);

void
ContextSetStatusFromString( string )
  char * string
  CODE:
    decContextSetStatusFromString(&set, string);

void
ContextSetStatusFromStringQuiet( string )
  char * string
  CODE:
    decContextSetStatusFromStringQuiet(&set, string);

uint32_t
ContextSaveStatus( mask )
  uint32_t mask
  CODE:
    RETVAL = decContextSaveStatus(&set, mask);
  OUTPUT:
    RETVAL



( run in 3.677 seconds using v1.01-cache-2.11-cpan-71847e10f99 )