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 )