47 lines
1.1 KiB
C
47 lines
1.1 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 "conspage.h"
|
|
#include "consspaceobject.h"
|
|
#include "read.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.
|
|
*/
|
|
double numeric_value(struct cons_pointer pointer)
|
|
{
|
|
double result = NAN;
|
|
struct cons_space_object *cell = &pointer2cell(pointer);
|
|
|
|
if (integerp(pointer)) {
|
|
result = (double) cell->payload.integer.value;
|
|
} 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(int value)
|
|
{
|
|
struct cons_pointer result = allocate_cell(INTEGERTAG);
|
|
struct cons_space_object *cell = &pointer2cell(result);
|
|
cell->payload.integer.value = value;
|
|
|
|
return result;
|
|
}
|