Lhogho
0.0.027
|
Defines | |
#define | EPSILON 1E-64 |
used for numerical comparison | |
#define | DUMP_BUF_SIZE 128 |
#define | DUMP_BUF_SIZE 128 |
#define | DUMP_BUF_SIZE 128 |
Functions | |
void | delete_numeric (atom_t a) |
deletes numeric atom | |
atom_t | new_integer (int64_t data) |
creates a new integer atom | |
atom_t | new_float (float64_t data) |
creates a new floating-point atom | |
void | dump_integer (atom_t a, int level) |
dumps integer atom | |
void | dump_integer_const (int a) |
dumps integer constant | |
void | dump_float (atom_t a, int level) |
dumps float atom | |
int | atom_to_float (atom_t a, float64_t *np) |
convert atom to a float | |
int | atom_to_int (atom_t a, int64_t *np) |
convert atom to an integer | |
int | atom_to_integer (atom_t a, int *np) |
convert atom to an 32-bit integer |
#define EPSILON 1E-64 |
#define DUMP_BUF_SIZE 128 |
#define DUMP_BUF_SIZE 128 |
#define DUMP_BUF_SIZE 128 |
void delete_numeric | ( | atom_t | a | ) |
a | atom to delete |
Deletes integer or float atom by returning it back to the data pool.
{ return_to_pool( &data_pool, a ); }
atom_t new_integer | ( | int64_t | data | ) |
data | 64-bit integer |
Creates an integer atom with reference count 1.
{ atom_t a = (atom_t)take_from_pool( &data_pool ); REF(a) = 1; ID(a) = INTEGER_ID; INTEGER(a) = data; #ifdef DEBUG_ATOM printf("<ATOM> [%08x] integer=%I64d\n",(int)a,data); #endif //DEBUG_ATOM #ifdef ADVANCED stats[ID(a)].allocs++; if( stats[ID(a)].max<(stats[ID(a)].allocs-stats[ID(a)].deallocs) ) stats[ID(a)].max=(stats[ID(a)].allocs-stats[ID(a)].deallocs); stats_free--; #endif //ADVANCED #ifdef DEBUG_RUNTIME_ATOMS if( running_compiled_code ) { outter( TEXT("<RUNTIME> new "), -1 ); dump_atom_address( a ); dump_atom( a, 1 ); outter( TEXT("\n"), -1 ); } #endif #ifdef DEBUG_COMPILETIME_ATOMS if( compiling_code ) { outter( TEXT("<COMPILETIME> new "), -1 ); dump_atom_address( a ); dump_atom( a, 1 ); outter( TEXT("\n"), -1 ); } #endif return a; }
data | 64-bit floating-point |
Creates an floating-point atom with reference count 1.
{ atom_t a = (atom_t)take_from_pool( &data_pool ); REF(a) = 1; ID(a) = FLOAT_ID; FLOAT(a) = data; //if( IS_FLOAT(a) ) //{ //printf("SET.FLT[%08x] %0.14f ref %d\n", (int)a, FLOAT(a), REF(a) ); //} #ifdef DEBUG_ATOM printf("<ATOM> [%08x] float=%Lf\n",(int)a,data); #endif //DEBUG_ATOM #ifdef ADVANCED stats[ID(a)].allocs++; if( stats[ID(a)].max<(stats[ID(a)].allocs-stats[ID(a)].deallocs) ) stats[ID(a)].max=(stats[ID(a)].allocs-stats[ID(a)].deallocs); stats_free--; #endif //ADVANCED #ifdef DEBUG_RUNTIME_ATOMS if( running_compiled_code ) { outter( TEXT("<RUNTIME> new "), -1 ); dump_atom_address( a ); dump_atom( a, 1 ); outter( TEXT("\n"), -1 ); } #endif #ifdef DEBUG_COMPILETIME_ATOMS if( compiling_code ) { outter( TEXT("<COMPILETIME> new "), -1 ); dump_atom_address( a ); dump_atom( a, 1 ); outter( TEXT("\n"), -1 ); } #endif return a; }
void dump_integer | ( | atom_t | a, |
int | level | ||
) |
a | atom to dump |
level | dump level |
Dumps integer atom through the current outter function.
{ if( IS_UNBOUND(a) ) { outter( TEXT("(unbound)"), 9 ); outter_size += 9; } else if( IS_STOPPED(a) ) { outter( TEXT("(stopped)"), 9 ); outter_size += 9; } else { #define DUMP_BUF_SIZE 128 char_t buf[DUMP_BUF_SIZE]; int n; n = SPRINTF( buf, DUMP_BUF_SIZE, FORMAT_INT, INTEGER(a) ); int limit = print_width_limit; if( 0<=limit && limit<10 ) limit=10; if( 0<=limit && limit<n ) { outter( buf, limit ); outter( TEXT("..."), 3 ); outter_size += limit+3; } else { outter( buf, n ); outter_size += n; } #undef DUMP_BUF_SIZE } }
void dump_integer_const | ( | int | a | ) |
a | value to dump |
Dumps integer constant through the current outter function.
{ #define DUMP_BUF_SIZE 128 char_t buf[DUMP_BUF_SIZE]; int n; n = SPRINTF( buf, DUMP_BUF_SIZE, TEXT("%d"), a ); outter( buf, n ); #undef DUMP_BUF_SIZE }
void dump_float | ( | atom_t | a, |
int | level | ||
) |
a | atom to dump |
level | dump level |
Dumps float atom through the current outter function.
{ // In Window infinities are printed as "1.#INF" instead // of just "inf", and "-1.#IND" instead of "nan". So let's fix this. #ifdef WINDOWS if( isinf(FLOAT(a))!=0 && FLOAT(a)>0 ) { outter( TEXT("inf"), 3 ); outter_size += 3; return; } if( isinf(FLOAT(a))!=0 && FLOAT(a)<0 ) { outter( TEXT("-inf"), 4 ); outter_size += 4; return; } if( isnan(FLOAT(a))!=0 ) { outter( TEXT("nan"), 3 ); outter_size += 3; return; } #endif //WINDOWS #define DUMP_BUF_SIZE 128 char_t buf[DUMP_BUF_SIZE]; int n; float64_t x = FLOAT(a); if( x==0 && signbit(x) ) x = 0; // remove trailing zeros and decimal point if( (x>=1e23) || (x<=-1e23) || ((x>=-1e-23) && (x<=1e-23)) ) n = SPRINTF( buf, DUMP_BUF_SIZE, FORMAT_EXTRA_FP, x ); else { n = SPRINTF( buf, DUMP_BUF_SIZE, FORMAT_FP, x ); //if( !buf[n-1] ) n--; // remove trailing null character (should not appear, but it does!) while( buf[n-1]==L'0' ) n--; // remove trailing zero if( buf[n-1]==L'.' ) n--; // remove default decimal point if( (unsigned char)buf[n-1]<128 && buf[n-1]==*(locale_info->decimal_point) ) n--; } int limit = print_width_limit; if( 0<=limit && limit<10 ) limit=10; if( 0<=limit && limit<n ) { outter( buf, limit ); outter( TEXT("..."), 3 ); outter_size += limit+3; } else { outter( buf, n ); outter_size += n; } #undef DUMP_BUF_SIZE }
int atom_to_float | ( | atom_t | a, |
float64_t * | np | ||
) |
a | atom to convert |
np | pointer where to put the number |
Converts an atom to a floating point number. If conversion is possible, then *np will contain the number and the return value will be 1. Otherwise np will be uninitialized and the return value will be 0.
{ // test for unbound if( IS_UNBOUND(a) ) { return 0; } // convert integer->float if( IS_INTEGER(a) ) { *np = INTEGER(a); return 1; } // convert float->float if( IS_FLOAT(a) ) { *np = FLOAT(a); return 1; } // fail if not a word if( !IS_ANY_WORD(a) ) { return 0; } // convert word->float int cnt = LENGTH(a); chars_t ptr = STRING(a); char_t chr = *(ptr+cnt); char_t *end; *(ptr+cnt) = TEXT('\0'); /* set artificial end of string */ if( (*ptr==TEXT('0')) && ((*(ptr+1)==TEXT('x')) || (*(ptr+1)==TEXT('X')))) { // it is a hex number *np = STRTOL(ptr,&end); } else { // it is a dec number *np = STRTOD(ptr,&end); } *(ptr+cnt) = chr; /* recover the original string */ // test for successful conversion if( end-ptr==cnt ) return 1; // test for infinities/nonanumbers in Windows #ifdef WINDOWS if( LENGTH(a)==3 && same_strings(1,STRING(a),TEXT("inf"),3) ) { *np = INFINITY; return 1; } if( LENGTH(a)==4 && same_strings(1,STRING(a),TEXT("-inf"),4) ) { *np = -INFINITY; return 1; } if( LENGTH(a)==3 && same_strings(1,STRING(a),TEXT("nan"),3) ) { *np = NAN; return 1; } #endif //WINDOWS return 0; }
int atom_to_int | ( | atom_t | a, |
int64_t * | np | ||
) |
a | atom to convert |
np | pointer where to put the number |
Converts an atom to a 64-bit integer number. If conversion is possible, then *np will contain the number and the return value will be 1. Otherwise np is uninitialized and the return value will be set to 0.
{ // test for unbound if( IS_UNBOUND(a) ) { return 0; } // convert integer->float if( IS_INTEGER(a) ) { *np = INTEGER(a); return 1; } // convert float->float if( IS_FLOAT(a) ) { *np = FLOAT(a); return abs(*np-FLOAT(a))<EPSILON; } // fail if not a word if( !IS_ANY_WORD(a) ) { return 0; } // convert word->float int cnt = LENGTH(a); chars_t ptr = STRING(a); char_t chr = *(ptr+cnt); char_t *end; *(ptr+cnt) = TEXT('\0'); /* set artificial end of string */ *np = STRTOL(ptr,&end); *(ptr+cnt) = chr; /* recover the original string */ // test for successful conversion if( end-ptr==cnt ) return 1; return 0; }
int atom_to_integer | ( | atom_t | a, |
int * | np | ||
) |
a | atom to convert |
np | pointer where to put the number |
Converts an atom to a 32-bit integer number. If conversion is possible, then *np will contain the number and the return value will be 1. Otherwise np will be set to -1 and the return value will be set to 0.
{ *np = -1; // test for unbound if( IS_UNBOUND(a) ) { return 0; } // convert integer->float if( IS_INTEGER(a) ) { *np = INTEGER(a); return 1; } // convert float->float if( IS_FLOAT(a) ) { *np = FLOAT(a); return abs(*np-FLOAT(a))<EPSILON; } // fail if not a word if( !IS_ANY_WORD(a) ) { return 0; } // convert word->float int cnt = LENGTH(a); chars_t ptr = STRING(a); char_t chr = *(ptr+cnt); char_t *end; *(ptr+cnt) = TEXT('\0'); /* set artificial end of string */ *np = STRTOL(ptr,&end); *(ptr+cnt) = chr; /* recover the original string */ // test for successful conversion if( end-ptr==cnt ) return 1; return 0; }