I'm fairly sure the size of a long int on my machines is 64 bit anyway, but for portability it needs to be explicit.
49 lines
1.2 KiB
C
49 lines
1.2 KiB
C
/*
|
|
* integer.c
|
|
*
|
|
* functions for integer cells.
|
|
*
|
|
* (c) 2017 Simon Brooke <simon@journeyman.cc>
|
|
* Licensed under GPL version 2.0, or, at your option, any later version.
|
|
*/
|
|
|
|
#define _GNU_SOURCE
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
|
|
#include "conspage.h"
|
|
#include "consspaceobject.h"
|
|
|
|
/**
|
|
* return the numeric value of this cell, as a C primitive double, not
|
|
* as a cons-space object. Cell may in principle be any kind of number,
|
|
* but only integers and reals are so far implemented.
|
|
*/
|
|
long double numeric_value( struct cons_pointer pointer ) {
|
|
long double result = NAN;
|
|
struct cons_space_object *cell = &pointer2cell( pointer );
|
|
|
|
if ( integerp( pointer ) ) {
|
|
result = cell->payload.integer.value * 1.0;
|
|
} else if ( realp( pointer ) ) {
|
|
result = cell->payload.real.value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Allocate an integer cell representing this value and return a cons pointer to it.
|
|
*/
|
|
struct cons_pointer make_integer( int64_t value ) {
|
|
struct cons_pointer result = allocate_cell( INTEGERTAG );
|
|
struct cons_space_object *cell = &pointer2cell( result );
|
|
cell->payload.integer.value = value;
|
|
|
|
#ifdef DEBUG
|
|
dump_object( stderr, result );
|
|
#endif
|
|
|
|
return result;
|
|
}
|