moving some flisp-specific code out of library
This commit is contained in:
parent
689ec946d8
commit
6ed61e66ac
|
@ -1,3 +1,5 @@
|
||||||
|
#include "operators.c"
|
||||||
|
|
||||||
#ifdef BITS64
|
#ifdef BITS64
|
||||||
#define NWORDS(sz) (((sz)+7)>>3)
|
#define NWORDS(sz) (((sz)+7)>>3)
|
||||||
#else
|
#else
|
||||||
|
|
28
flisp.h
28
flisp.h
|
@ -208,6 +208,19 @@ typedef struct {
|
||||||
} cvtable_t;
|
} cvtable_t;
|
||||||
|
|
||||||
/* functions needed to implement the value interface (cvtable_t) */
|
/* functions needed to implement the value interface (cvtable_t) */
|
||||||
|
typedef enum { T_INT8, T_UINT8, T_INT16, T_UINT16, T_INT32, T_UINT32,
|
||||||
|
T_INT64, T_UINT64, T_FLOAT, T_DOUBLE } numerictype_t;
|
||||||
|
|
||||||
|
#define N_NUMTYPES ((int)T_DOUBLE+1)
|
||||||
|
|
||||||
|
#ifdef BITS64
|
||||||
|
# define T_LONG T_INT64
|
||||||
|
# define T_ULONG T_UINT64
|
||||||
|
#else
|
||||||
|
# define T_LONG T_INT32
|
||||||
|
# define T_ULONG T_UINT32
|
||||||
|
#endif
|
||||||
|
|
||||||
value_t relocate_lispvalue(value_t v);
|
value_t relocate_lispvalue(value_t v);
|
||||||
void print_traverse(value_t v);
|
void print_traverse(value_t v);
|
||||||
void fl_print_chr(char c, ios_t *f);
|
void fl_print_chr(char c, ios_t *f);
|
||||||
|
@ -351,6 +364,21 @@ value_t mk_wchar(int32_t n);
|
||||||
value_t return_from_uint64(uint64_t Uaccum);
|
value_t return_from_uint64(uint64_t Uaccum);
|
||||||
value_t return_from_int64(int64_t Saccum);
|
value_t return_from_int64(int64_t Saccum);
|
||||||
|
|
||||||
|
numerictype_t effective_numerictype(double r);
|
||||||
|
double conv_to_double(void *data, numerictype_t tag);
|
||||||
|
void conv_from_double(void *data, double d, numerictype_t tag);
|
||||||
|
int64_t conv_to_int64(void *data, numerictype_t tag);
|
||||||
|
uint64_t conv_to_uint64(void *data, numerictype_t tag);
|
||||||
|
int32_t conv_to_int32(void *data, numerictype_t tag);
|
||||||
|
uint32_t conv_to_uint32(void *data, numerictype_t tag);
|
||||||
|
#ifdef BITS64
|
||||||
|
#define conv_to_long conv_to_int64
|
||||||
|
#define conv_to_ulong conv_to_uint64
|
||||||
|
#else
|
||||||
|
#define conv_to_long conv_to_int32
|
||||||
|
#define conv_to_ulong conv_to_uint32
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name;
|
char *name;
|
||||||
builtin_t fptr;
|
builtin_t fptr;
|
||||||
|
|
16
llt/Makefile
16
llt/Makefile
|
@ -1,14 +1,11 @@
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
SRCS = bitvector.c hashing.c socket.c timefuncs.c dblprint.c ptrhash.c \
|
SRCS = bitvector.c hashing.c socket.c timefuncs.c ptrhash.c utf8.c ios.c \
|
||||||
utf8.c ios.c operators.c cplxprint.c dirpath.c htable.c \
|
dirpath.c htable.c bitvector-ops.c int2str.c dump.c random.c \
|
||||||
bitvector-ops.c int2str.c dump.c random.c bswap.c memalign.c \
|
lltinit.c arraylist.c
|
||||||
swapreverse.c lltinit.c arraylist.c
|
|
||||||
OBJS = $(SRCS:%.c=%.o)
|
OBJS = $(SRCS:%.c=%.o)
|
||||||
DOBJS = $(SRCS:%.c=%.do)
|
DOBJS = $(SRCS:%.c=%.do)
|
||||||
TARGET = libllt.a
|
TARGET = libllt.a
|
||||||
TESTSRC = unittest.c
|
|
||||||
TESTER = llttest
|
|
||||||
|
|
||||||
# OS flags: LINUX, WIN32, MACOSX
|
# OS flags: LINUX, WIN32, MACOSX
|
||||||
# architecture flags: __CPU__=xxx, BITS64, ARCH_X86, ARCH_X86_64
|
# architecture flags: __CPU__=xxx, BITS64, ARCH_X86, ARCH_X86_64
|
||||||
|
@ -34,16 +31,9 @@ release: $(OBJS)
|
||||||
rm -rf $(TARGET)
|
rm -rf $(TARGET)
|
||||||
ar rs $(TARGET) $(OBJS)
|
ar rs $(TARGET) $(OBJS)
|
||||||
|
|
||||||
test:
|
|
||||||
make clean
|
|
||||||
make debug CFLAGS=-DENABLE_LLT_TEST
|
|
||||||
gcc $(TESTSRC) $(TARGET) -o $(TESTER) -lm
|
|
||||||
./$(TESTER)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o
|
rm -f *.o
|
||||||
rm -f *.do
|
rm -f *.do
|
||||||
rm -f *~
|
rm -f *~
|
||||||
rm -f core*
|
rm -f core*
|
||||||
rm -f $(TARGET)
|
rm -f $(TARGET)
|
||||||
rm -f $(TESTER)
|
|
||||||
|
|
87
llt/bswap.c
87
llt/bswap.c
|
@ -1,87 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <alloca.h>
|
|
||||||
#include "dtypes.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
void bswap_buffer(byte_t *data, size_t sz, size_t npts)
|
|
||||||
{
|
|
||||||
size_t i, b;
|
|
||||||
byte_t *el;
|
|
||||||
byte_t temp;
|
|
||||||
|
|
||||||
if (sz <= 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (sz) {
|
|
||||||
case 8:
|
|
||||||
for(i=0; i < npts; i++) {
|
|
||||||
((u_int64_t*)data)[i] = bswap_64(((u_int64_t*)data)[i]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
for(i=0; i < npts; i++) {
|
|
||||||
((u_int32_t*)data)[i] = bswap_32(((u_int32_t*)data)[i]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
for(i=0; i < npts; i++) {
|
|
||||||
((u_int16_t*)data)[i] = bswap_16(((u_int16_t*)data)[i]);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for(i=0; i < sz * npts; i += sz) {
|
|
||||||
el = data + i;
|
|
||||||
for(b=0; b < sz/2; b++) {
|
|
||||||
temp = el[b];
|
|
||||||
el[b] = el[sz-b-1];
|
|
||||||
el[sz-b-1] = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bswap(byte_t *s, size_t n)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
char temp;
|
|
||||||
|
|
||||||
switch (n) {
|
|
||||||
case 8:
|
|
||||||
*(u_int64_t*)s = bswap_64(*(u_int64_t*)s); break;
|
|
||||||
case 4:
|
|
||||||
*(u_int32_t*)s = bswap_32(*(u_int32_t*)s); break;
|
|
||||||
case 2:
|
|
||||||
*(u_int16_t*)s = bswap_16(*(u_int16_t*)s); break;
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
temp = s[i];
|
|
||||||
s[i] = s[n-i-1];
|
|
||||||
s[n-i-1] = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bswap_to(byte_t *dest, byte_t *src, size_t n)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
switch (n) {
|
|
||||||
case 8:
|
|
||||||
*(u_int64_t*)dest = bswap_64(*(u_int64_t*)src); break;
|
|
||||||
case 4:
|
|
||||||
*(u_int32_t*)dest = bswap_32(*(u_int32_t*)src); break;
|
|
||||||
case 2:
|
|
||||||
*(u_int16_t*)dest = bswap_16(*(u_int16_t*)src); break;
|
|
||||||
case 1:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for(i=0; i < n; i++) {
|
|
||||||
dest[i] = src[n-i-1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
#include <math.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "dtypes.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
void snprint_cplx(char *s, size_t cnt, double re, double im,
|
|
||||||
// args to pass on to snprint_real
|
|
||||||
int width, int dec,
|
|
||||||
int max_digs_rt, int max_digs_lf,
|
|
||||||
// print spaces around sign in a+bi
|
|
||||||
int spflag)
|
|
||||||
{
|
|
||||||
int fzr = (re==0) || rel_zero(re,im);
|
|
||||||
int fzi = (im==0) || rel_zero(im,re);
|
|
||||||
size_t len, sl;
|
|
||||||
size_t space = cnt;
|
|
||||||
|
|
||||||
s[0] = '\0';
|
|
||||||
if (isnan(im) && fzr) {
|
|
||||||
if (space < 2) return;
|
|
||||||
snprint_real(s, space-2, im, width, dec, max_digs_rt, max_digs_lf);
|
|
||||||
strcat(s, "i");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!fzr || (fzr && fzi)) {
|
|
||||||
if (space < 4) return;
|
|
||||||
snprint_real(s, space-4, re, width, dec, max_digs_rt, max_digs_lf);
|
|
||||||
if ((im >= 0 || (isnan(im)&&!sign_bit(im))) && !fzi) {
|
|
||||||
if (spflag) {
|
|
||||||
strcat(s, " + ");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
strcat(s, "+");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!fzi) {
|
|
||||||
im = -im;
|
|
||||||
if (spflag)
|
|
||||||
strcat(s, " - ");
|
|
||||||
else
|
|
||||||
strcat(s, "-");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!fzi) {
|
|
||||||
len = sl = strlen(s);
|
|
||||||
if (im == -1) {
|
|
||||||
while ((long)(len-sl) < (long)(width-2) && len < (space-3))
|
|
||||||
s[len++] = ' ';
|
|
||||||
s[len] = '-';
|
|
||||||
s[len+1] = 'i';
|
|
||||||
s[len+2] = '\0';
|
|
||||||
}
|
|
||||||
else if (im == 1) {
|
|
||||||
while ((long)(len-sl) < (long)(width-1) && len < (space-2))
|
|
||||||
s[len++] = ' ';
|
|
||||||
s[len] = 'i';
|
|
||||||
s[len+1] = '\0';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
snprint_real(s+len, space-len-2, im, width, dec,
|
|
||||||
max_digs_rt, max_digs_lf);
|
|
||||||
strcat(s, "i");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
122
llt/dblprint.c
122
llt/dblprint.c
|
@ -1,122 +0,0 @@
|
||||||
#include <math.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "dtypes.h"
|
|
||||||
#include "ieee754.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
int double_exponent(double d)
|
|
||||||
{
|
|
||||||
union ieee754_double dl;
|
|
||||||
|
|
||||||
dl.d = d;
|
|
||||||
return dl.ieee.exponent - IEEE754_DOUBLE_BIAS;
|
|
||||||
}
|
|
||||||
|
|
||||||
double double_mantissa(double d)
|
|
||||||
{
|
|
||||||
union ieee754_double dl;
|
|
||||||
|
|
||||||
dl.d = d;
|
|
||||||
dl.ieee.exponent = IEEE754_DOUBLE_BIAS;
|
|
||||||
dl.ieee.negative = 0;
|
|
||||||
return dl.d;
|
|
||||||
}
|
|
||||||
|
|
||||||
int float_exponent(float f)
|
|
||||||
{
|
|
||||||
union ieee754_float fl;
|
|
||||||
|
|
||||||
fl.f = f;
|
|
||||||
return fl.ieee.exponent - IEEE754_FLOAT_BIAS;
|
|
||||||
}
|
|
||||||
|
|
||||||
float float_mantissa(float f)
|
|
||||||
{
|
|
||||||
union ieee754_float fl;
|
|
||||||
|
|
||||||
fl.f = f;
|
|
||||||
fl.ieee.exponent = IEEE754_FLOAT_BIAS;
|
|
||||||
fl.ieee.negative = 0;
|
|
||||||
return fl.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
void snprint_real(char *s, size_t cnt, double r,
|
|
||||||
int width, // printf field width, or 0
|
|
||||||
int dec, // # decimal digits desired, recommend 16
|
|
||||||
// # of zeros in .00...0x before using scientific notation
|
|
||||||
// recommend 3-4 or so
|
|
||||||
int max_digs_rt,
|
|
||||||
// # of digits left of decimal before scientific notation
|
|
||||||
// recommend 10
|
|
||||||
int max_digs_lf)
|
|
||||||
{
|
|
||||||
int mag;
|
|
||||||
double fpart, temp;
|
|
||||||
char format[8];
|
|
||||||
char num_format[3];
|
|
||||||
int sz, keepz=0;
|
|
||||||
|
|
||||||
s[0] = '\0';
|
|
||||||
if (width == -1) {
|
|
||||||
width = 0;
|
|
||||||
keepz=1;
|
|
||||||
}
|
|
||||||
if (isnan(r)) {
|
|
||||||
if (sign_bit(r))
|
|
||||||
strncpy(s, "-nan", cnt);
|
|
||||||
else
|
|
||||||
strncpy(s, "nan", cnt);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (r == 0) {
|
|
||||||
strncpy(s, "0", cnt);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
num_format[0] = 'l';
|
|
||||||
num_format[2] = '\0';
|
|
||||||
|
|
||||||
mag = double_exponent(r);
|
|
||||||
|
|
||||||
mag = (int)(((double)mag)/LOG2_10 + 0.5);
|
|
||||||
if (r == 0)
|
|
||||||
mag = 0;
|
|
||||||
if ((mag > max_digs_lf-1) || (mag < -max_digs_rt)) {
|
|
||||||
num_format[1] = 'e';
|
|
||||||
temp = r/pow(10, mag); /* see if number will have a decimal */
|
|
||||||
fpart = temp - floor(temp); /* when written in scientific notation */
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
num_format[1] = 'f';
|
|
||||||
fpart = r - floor(r);
|
|
||||||
}
|
|
||||||
if (fpart == 0)
|
|
||||||
dec = 0;
|
|
||||||
if (width == 0) {
|
|
||||||
snprintf(format, 8, "%%.%d%s", dec, num_format);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
snprintf(format, 8, "%%%d.%d%s", width, dec, num_format);
|
|
||||||
}
|
|
||||||
sz = snprintf(s, cnt, format, r);
|
|
||||||
/* trim trailing zeros from fractions. not when using scientific
|
|
||||||
notation, since we might have e.g. 1.2000e+100. also not when we
|
|
||||||
need a specific output width */
|
|
||||||
if (width == 0 && !keepz) {
|
|
||||||
if (sz > 2 && fpart && num_format[1]!='e') {
|
|
||||||
while (s[sz-1] == '0') {
|
|
||||||
s[sz-1]='\0';
|
|
||||||
sz--;
|
|
||||||
}
|
|
||||||
// don't need trailing .
|
|
||||||
if (s[sz-1] == '.') {
|
|
||||||
s[sz-1] = '\0';
|
|
||||||
sz--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// TODO. currently 1.1e20 prints as 1.1000000000000000e+20; be able to
|
|
||||||
// get rid of all those zeros.
|
|
||||||
}
|
|
13
llt/dtypes.h
13
llt/dtypes.h
|
@ -178,17 +178,4 @@ extern float F_NNAN;
|
||||||
extern float F_PINF;
|
extern float F_PINF;
|
||||||
extern float F_NINF;
|
extern float F_NINF;
|
||||||
|
|
||||||
typedef enum { T_INT8, T_UINT8, T_INT16, T_UINT16, T_INT32, T_UINT32,
|
|
||||||
T_INT64, T_UINT64, T_FLOAT, T_DOUBLE } numerictype_t;
|
|
||||||
|
|
||||||
#define N_NUMTYPES ((int)T_DOUBLE+1)
|
|
||||||
|
|
||||||
#ifdef BITS64
|
|
||||||
# define T_LONG T_INT64
|
|
||||||
# define T_ULONG T_UINT64
|
|
||||||
#else
|
|
||||||
# define T_LONG T_INT32
|
|
||||||
# define T_ULONG T_UINT32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <alloca.h>
|
|
||||||
#include "dtypes.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
#define ALIGNED_TO_ACTUAL(p) (((char*)p) - ((long*)p)[-1])
|
|
||||||
|
|
||||||
static void *aligned_ptr(char *ptr, size_t align_size)
|
|
||||||
{
|
|
||||||
char *ptr2, *aligned_ptr;
|
|
||||||
|
|
||||||
ptr2 = ptr + sizeof(long);
|
|
||||||
aligned_ptr = (char*)LLT_ALIGN(((uptrint_t)ptr2), align_size);
|
|
||||||
|
|
||||||
((long*)aligned_ptr)[-1] = (long)(aligned_ptr - ptr);
|
|
||||||
|
|
||||||
return aligned_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* align_size has to be a power of two */
|
|
||||||
void *malloc_aligned(size_t size, size_t align_size)
|
|
||||||
{
|
|
||||||
char *ptr;
|
|
||||||
|
|
||||||
ptr = (char*)LLT_ALLOC(size + align_size-1 + sizeof(long));
|
|
||||||
if (ptr == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return aligned_ptr(ptr, align_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_aligned(void *ptr)
|
|
||||||
{
|
|
||||||
LLT_FREE(ALIGNED_TO_ACTUAL(ptr));
|
|
||||||
}
|
|
||||||
|
|
||||||
void *realloc_aligned(void *ptr, size_t size, size_t align_size)
|
|
||||||
{
|
|
||||||
char *pnew;
|
|
||||||
|
|
||||||
if (ptr != NULL)
|
|
||||||
ptr = ALIGNED_TO_ACTUAL(ptr);
|
|
||||||
pnew = LLT_REALLOC(ptr, size + align_size-1 + sizeof(long));
|
|
||||||
if (pnew == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return aligned_ptr(pnew, align_size);
|
|
||||||
}
|
|
|
@ -1,187 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <alloca.h>
|
|
||||||
#include "dtypes.h"
|
|
||||||
#include "utils.h"
|
|
||||||
|
|
||||||
void memswap(char *a, char *b, size_t sz)
|
|
||||||
{
|
|
||||||
int8_t i8;
|
|
||||||
int32_t i32;
|
|
||||||
int32_t *a4, *b4;
|
|
||||||
|
|
||||||
if (sz < 4) {
|
|
||||||
while (sz--) {
|
|
||||||
i8 = *a;
|
|
||||||
*a++ = *b;
|
|
||||||
*b++ = i8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
while (sz & 0x3) {
|
|
||||||
i8 = *a;
|
|
||||||
*a++ = *b;
|
|
||||||
*b++ = i8;
|
|
||||||
sz--;
|
|
||||||
}
|
|
||||||
a4 = (int32_t*)a;
|
|
||||||
b4 = (int32_t*)b;
|
|
||||||
sz >>= 2;
|
|
||||||
while (sz--) {
|
|
||||||
i32 = *a4;
|
|
||||||
*a4++ = *b4;
|
|
||||||
*b4++ = i32;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void memreverse(char *a, size_t n, size_t elsz)
|
|
||||||
{
|
|
||||||
int64_t i64, *pi64;
|
|
||||||
int32_t i32, *pi32;
|
|
||||||
int16_t i16, *pi16;
|
|
||||||
int8_t i8;
|
|
||||||
size_t i;
|
|
||||||
char *temp;
|
|
||||||
size_t eli, tot;
|
|
||||||
|
|
||||||
if (n==0 || elsz==0) return;
|
|
||||||
switch(elsz) {
|
|
||||||
case 16:
|
|
||||||
pi64 = (int64_t*)a;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
i64 = pi64[2*i];
|
|
||||||
pi64[2*i] = pi64[2*(n-i-1)];
|
|
||||||
pi64[2*(n-i-1)] = i64;
|
|
||||||
|
|
||||||
i64 = pi64[2*i+1];
|
|
||||||
pi64[2*i+1] = pi64[2*(n-i-1)+1];
|
|
||||||
pi64[2*(n-i-1)+1] = i64;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
pi64 = (int64_t*)a;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
i64 = pi64[i];
|
|
||||||
pi64[i] = pi64[n-i-1];
|
|
||||||
pi64[n-i-1] = i64;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
pi32 = (int32_t*)a;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
i32 = pi32[i];
|
|
||||||
pi32[i] = pi32[n-i-1];
|
|
||||||
pi32[n-i-1] = i32;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
pi16 = (int16_t*)a;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
i16 = pi16[i];
|
|
||||||
pi16[i] = pi16[n-i-1];
|
|
||||||
pi16[n-i-1] = i16;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
i8 = a[i];
|
|
||||||
a[i] = a[n-i-1];
|
|
||||||
a[n-i-1] = i8;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
tot = n*elsz;
|
|
||||||
if (elsz < 4097)
|
|
||||||
temp = alloca(elsz);
|
|
||||||
else
|
|
||||||
temp = malloc(elsz);
|
|
||||||
|
|
||||||
if (temp != NULL) {
|
|
||||||
for(i=0, eli=0; i < n/2; i++, eli+=elsz) {
|
|
||||||
memcpy(temp, &a[eli], elsz);
|
|
||||||
memcpy(&a[eli], &a[tot-eli-elsz], elsz);
|
|
||||||
memcpy(&a[tot-eli-elsz], temp, elsz);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (elsz >= 4097)
|
|
||||||
free(temp);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void memreverse_to(char *dest, char *a, size_t n, size_t elsz)
|
|
||||||
{
|
|
||||||
int64_t *pi64, *di64;
|
|
||||||
int32_t *pi32, *di32;
|
|
||||||
int16_t *pi16, *di16;
|
|
||||||
size_t i;
|
|
||||||
size_t eli, tot;
|
|
||||||
if (n==0 || elsz==0) return;
|
|
||||||
switch(elsz) {
|
|
||||||
case 16:
|
|
||||||
pi64 = (int64_t*)a;
|
|
||||||
di64 = (int64_t*)dest;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
di64[2*i] = pi64[2*(n-i-1)];
|
|
||||||
di64[2*(n-i-1)] = pi64[2*i];
|
|
||||||
|
|
||||||
di64[2*i+1] = pi64[2*(n-i-1)+1];
|
|
||||||
di64[2*(n-i-1)+1] = pi64[2*i+1];
|
|
||||||
}
|
|
||||||
if (n&0x1) {
|
|
||||||
di64[2*i] = pi64[2*i];
|
|
||||||
di64[2*i+1] = pi64[2*i+1];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
pi64 = (int64_t*)a;
|
|
||||||
di64 = (int64_t*)dest;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
di64[i] = pi64[n-i-1];
|
|
||||||
di64[n-i-1] = pi64[i];
|
|
||||||
}
|
|
||||||
if (n&0x1)
|
|
||||||
di64[i] = pi64[i];
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
pi32 = (int32_t*)a;
|
|
||||||
di32 = (int32_t*)dest;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
di32[i] = pi32[n-i-1];
|
|
||||||
di32[n-i-1] = pi32[i];
|
|
||||||
}
|
|
||||||
if (n&0x1)
|
|
||||||
di32[i] = pi32[i];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
pi16 = (int16_t*)a;
|
|
||||||
di16 = (int16_t*)dest;
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
di16[i] = pi16[n-i-1];
|
|
||||||
di16[n-i-1] = pi16[i];
|
|
||||||
}
|
|
||||||
if (n&0x1)
|
|
||||||
di16[i] = pi16[i];
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
for(i=0; i < n/2; i++) {
|
|
||||||
dest[i] = a[n-i-1];
|
|
||||||
dest[n-i-1] = a[i];
|
|
||||||
}
|
|
||||||
if (n&0x1)
|
|
||||||
dest[i] = a[i];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
tot = n*elsz;
|
|
||||||
for(i=0, eli=0; i < n/2; i++, eli+=elsz) {
|
|
||||||
memcpy(&dest[eli], &a[tot - eli - elsz], elsz);
|
|
||||||
memcpy(&dest[tot - eli - elsz], &a[eli], elsz);
|
|
||||||
}
|
|
||||||
if (n&0x1)
|
|
||||||
memcpy(&dest[eli], &a[eli], elsz);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
142
llt/unittest.c
142
llt/unittest.c
|
@ -1,142 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <wchar.h>
|
|
||||||
#include "llt.h"
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
llt_init();
|
|
||||||
|
|
||||||
test_dblprint();
|
|
||||||
test_operators();
|
|
||||||
|
|
||||||
/*
|
|
||||||
char *buf = malloc(20000);
|
|
||||||
char *buf2 = malloc(20000);
|
|
||||||
FILE *f = fopen("textread.m","rb");
|
|
||||||
int i=0;
|
|
||||||
while (!feof(f))
|
|
||||||
buf[i++] = fgetc(f);
|
|
||||||
buf[i-1] = '\0';
|
|
||||||
int len = i-1;
|
|
||||||
double t0 = clock_now();
|
|
||||||
int j=0;
|
|
||||||
for(i=0; i < 20000; i++) {
|
|
||||||
//j+=u8_charnum(buf,len);
|
|
||||||
u8_reverse(buf2, buf, len);
|
|
||||||
}
|
|
||||||
printf("textread took %.4f sec (%d)\n", clock_now()-t0, j);
|
|
||||||
|
|
||||||
FILE *f2 = fopen("u8.txt","rb");
|
|
||||||
i=0;
|
|
||||||
while (!feof(f2))
|
|
||||||
buf[i++] = fgetc(f2);
|
|
||||||
buf[i-1] = '\0';
|
|
||||||
len = i-1;
|
|
||||||
t0 = clock_now();
|
|
||||||
j=0;
|
|
||||||
for(i=0; i < 20000; i++) {
|
|
||||||
//j+=u8_charnum(buf,len);
|
|
||||||
u8_reverse(buf2, buf, len);
|
|
||||||
}
|
|
||||||
printf("u8 took %.4f sec (%d)\n\n", clock_now()-t0, j);
|
|
||||||
*/
|
|
||||||
|
|
||||||
test_ios();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void prettycplx(double r, double i)
|
|
||||||
{
|
|
||||||
char str[64];
|
|
||||||
snprint_cplx(str, sizeof(str), r, i, 0, 16, 3, 10, 1);
|
|
||||||
fputs(str, stdout);
|
|
||||||
fputc('\n', stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void prettyreal(double r)
|
|
||||||
{
|
|
||||||
char str[64];
|
|
||||||
snprint_real(str, sizeof(str), r, 0, 16, 3, 10);
|
|
||||||
fputs(str, stdout);
|
|
||||||
fputc('\n', stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_dblprint()
|
|
||||||
{
|
|
||||||
char str[64];
|
|
||||||
|
|
||||||
prettycplx(0,0);
|
|
||||||
prettycplx(1,0);
|
|
||||||
prettycplx(0,1);
|
|
||||||
prettycplx(1,1);
|
|
||||||
prettycplx(-1,0);
|
|
||||||
prettycplx(0,-1);
|
|
||||||
prettycplx(1,-1);
|
|
||||||
prettycplx(-1,1);
|
|
||||||
prettycplx(-1,-1);
|
|
||||||
prettycplx(2,0);
|
|
||||||
prettycplx(0,2);
|
|
||||||
prettycplx(2,2);
|
|
||||||
prettycplx(-2,0);
|
|
||||||
prettycplx(0,-2);
|
|
||||||
prettycplx(2,-2);
|
|
||||||
prettycplx(-2,2);
|
|
||||||
prettycplx(-2,-2);
|
|
||||||
|
|
||||||
prettyreal(1.5);
|
|
||||||
prettyreal(1.1);
|
|
||||||
prettyreal(1.1e-100);
|
|
||||||
prettyreal(1.1e20);
|
|
||||||
prettyreal(123456789);
|
|
||||||
prettyreal(1234567890);
|
|
||||||
prettyreal(12345678901);
|
|
||||||
prettyreal(-12345678901);
|
|
||||||
prettyreal(12345678901223);
|
|
||||||
prettyreal(-12345678901223);
|
|
||||||
prettyreal(.02);
|
|
||||||
prettyreal(.002);
|
|
||||||
prettyreal(.0002);
|
|
||||||
prettyreal(-.0002);
|
|
||||||
prettyreal(.00002);
|
|
||||||
prettyreal(-.00002);
|
|
||||||
|
|
||||||
prettyreal(1.0/0);
|
|
||||||
prettyreal(-1.0/0);
|
|
||||||
prettyreal(strtod("nan",NULL));
|
|
||||||
prettyreal(0.0/0);
|
|
||||||
prettyreal(-0.0/0);
|
|
||||||
|
|
||||||
prettyreal(DBL_EPSILON);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_ios()
|
|
||||||
{
|
|
||||||
ios_t *out = ios_stdout();
|
|
||||||
ios_t *in = ios_stdin();
|
|
||||||
|
|
||||||
ios_putc('a', out);
|
|
||||||
ios_putc('b', out);
|
|
||||||
ios_putc('\n', out);
|
|
||||||
|
|
||||||
char c[80];
|
|
||||||
size_t i=0;
|
|
||||||
ios_t sts;
|
|
||||||
ios_str(&sts, "Test string.");
|
|
||||||
c[i++] = ios_getc(&sts);
|
|
||||||
c[i++] = ios_getc(&sts);
|
|
||||||
c[i++] = ios_getc(&sts);
|
|
||||||
c[i++] = '\0';
|
|
||||||
printf("got: \"%s\"\n", c);
|
|
||||||
|
|
||||||
ios_t ms;
|
|
||||||
ios_mem(&ms, 10);
|
|
||||||
int j;
|
|
||||||
for(j=0; j < 16; j++)
|
|
||||||
ios_puts("passersby were amazed by the ", &ms);
|
|
||||||
size_t bs;
|
|
||||||
char *bigstr = ios_takebuf(&ms, &bs);
|
|
||||||
printf("got: \"%s\" (size %d)\n", bigstr, bs);
|
|
||||||
}
|
|
|
@ -1,81 +0,0 @@
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <wchar.h>
|
|
||||||
#include "llt.h"
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
llt_init();
|
|
||||||
|
|
||||||
test_dblprint();
|
|
||||||
test_operators();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void prettycplx(double r, double i)
|
|
||||||
{
|
|
||||||
char str[64];
|
|
||||||
snprint_cplx(str, sizeof(str), r, i, 0, 16, 3, 10, 1);
|
|
||||||
fputs(str, stdout);
|
|
||||||
fputc('\n', stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void prettyreal(double r)
|
|
||||||
{
|
|
||||||
char str[64];
|
|
||||||
snprint_real(str, sizeof(str), r, 0, 16, 3, 10);
|
|
||||||
fputs(str, stdout);
|
|
||||||
fputc('\n', stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_dblprint()
|
|
||||||
{
|
|
||||||
char str[64];
|
|
||||||
|
|
||||||
dbl_tolerance(1e-12);
|
|
||||||
|
|
||||||
prettycplx(0,0);
|
|
||||||
prettycplx(1,0);
|
|
||||||
prettycplx(0,1);
|
|
||||||
prettycplx(1,1);
|
|
||||||
prettycplx(-1,0);
|
|
||||||
prettycplx(0,-1);
|
|
||||||
prettycplx(1,-1);
|
|
||||||
prettycplx(-1,1);
|
|
||||||
prettycplx(-1,-1);
|
|
||||||
prettycplx(2,0);
|
|
||||||
prettycplx(0,2);
|
|
||||||
prettycplx(2,2);
|
|
||||||
prettycplx(-2,0);
|
|
||||||
prettycplx(0,-2);
|
|
||||||
prettycplx(2,-2);
|
|
||||||
prettycplx(-2,2);
|
|
||||||
prettycplx(-2,-2);
|
|
||||||
|
|
||||||
prettyreal(1.5);
|
|
||||||
prettyreal(1.1);
|
|
||||||
prettyreal(1.1e-100);
|
|
||||||
prettyreal(1.1e20);
|
|
||||||
prettyreal(123456789);
|
|
||||||
prettyreal(1234567890);
|
|
||||||
prettyreal(12345678901);
|
|
||||||
prettyreal(-12345678901);
|
|
||||||
prettyreal(12345678901223);
|
|
||||||
prettyreal(-12345678901223);
|
|
||||||
prettyreal(.02);
|
|
||||||
prettyreal(.002);
|
|
||||||
prettyreal(.0002);
|
|
||||||
prettyreal(-.0002);
|
|
||||||
prettyreal(.00002);
|
|
||||||
prettyreal(-.00002);
|
|
||||||
|
|
||||||
prettyreal(1.0/0);
|
|
||||||
prettyreal(-1.0/0);
|
|
||||||
prettyreal(strtod("nan",NULL));
|
|
||||||
prettyreal(0.0/0);
|
|
||||||
prettyreal(-0.0/0);
|
|
||||||
|
|
||||||
prettyreal(DBL_EPSILON);
|
|
||||||
}
|
|
69
llt/utils.h
69
llt/utils.h
|
@ -1,79 +1,10 @@
|
||||||
#ifndef __UTILS_H_
|
#ifndef __UTILS_H_
|
||||||
#define __UTILS_H_
|
#define __UTILS_H_
|
||||||
|
|
||||||
/* these functions byteswap any-size units --------------------- */
|
|
||||||
void bswap(byte_t *s, size_t n);
|
|
||||||
void bswap_to(byte_t *dest, byte_t *src, size_t n);
|
|
||||||
void bswap_buffer(byte_t *data, size_t sz, size_t npts);
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/* reverse the order of elements of any size, in place or out of place */
|
|
||||||
/* n is the number of elements */
|
|
||||||
void memreverse(char *a, size_t n, size_t elsz);
|
|
||||||
void memreverse_to(char *dest, char *a, size_t n, size_t elsz);
|
|
||||||
|
|
||||||
/* swap the contents of two buffers */
|
|
||||||
void memswap(char *a, char *b, size_t sz);
|
|
||||||
|
|
||||||
/* allocating aligned blocks ----------------------------------- */
|
|
||||||
void *malloc_aligned(size_t size, size_t align_size);
|
|
||||||
void free_aligned(void *ptr);
|
|
||||||
void *realloc_aligned(void *ptr, size_t size, size_t align_size);
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
|
|
||||||
int double_exponent(double d);
|
|
||||||
double double_mantissa(double d);
|
|
||||||
int float_exponent(float f);
|
|
||||||
float float_mantissa(float f);
|
|
||||||
void snprint_real(char *s, size_t cnt, double r,
|
|
||||||
int width, // printf field width, or 0
|
|
||||||
int dec, // # decimal digits desired, recommend 16
|
|
||||||
// # of zeros in .00...0x before using scientific notation
|
|
||||||
// recommend 3-4 or so
|
|
||||||
int max_digs_rt,
|
|
||||||
// # of digits left of decimal before scientific notation
|
|
||||||
// recommend 10
|
|
||||||
int max_digs_lf);
|
|
||||||
void snprint_cplx(char *s, size_t cnt, double re, double im,
|
|
||||||
// args to pass on to snprint_real
|
|
||||||
int width, int dec,
|
|
||||||
int max_digs_rt, int max_digs_lf,
|
|
||||||
// print spaces around sign in a+bi
|
|
||||||
int spflag);
|
|
||||||
|
|
||||||
char *uint2str(char *dest, size_t len, uint64_t num, uint32_t base);
|
char *uint2str(char *dest, size_t len, uint64_t num, uint32_t base);
|
||||||
int str2int(char *str, size_t len, int64_t *res, uint32_t base);
|
int str2int(char *str, size_t len, int64_t *res, uint32_t base);
|
||||||
int isdigit_base(char c, int base);
|
int isdigit_base(char c, int base);
|
||||||
|
|
||||||
extern double trunc(double x);
|
|
||||||
|
|
||||||
STATIC_INLINE double fpart(double arg)
|
|
||||||
{
|
|
||||||
return arg - trunc(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ipart(x) trunc(x)
|
|
||||||
|
|
||||||
numerictype_t effective_numerictype(double r);
|
|
||||||
double conv_to_double(void *data, numerictype_t tag);
|
|
||||||
void conv_from_double(void *data, double d, numerictype_t tag);
|
|
||||||
int64_t conv_to_int64(void *data, numerictype_t tag);
|
|
||||||
uint64_t conv_to_uint64(void *data, numerictype_t tag);
|
|
||||||
int32_t conv_to_int32(void *data, numerictype_t tag);
|
|
||||||
uint32_t conv_to_uint32(void *data, numerictype_t tag);
|
|
||||||
#ifdef BITS64
|
|
||||||
#define conv_to_long conv_to_int64
|
|
||||||
#define conv_to_ulong conv_to_uint64
|
|
||||||
#else
|
|
||||||
#define conv_to_long conv_to_int32
|
|
||||||
#define conv_to_ulong conv_to_uint32
|
|
||||||
#endif
|
|
||||||
int cmp_same_lt(void *a, void *b, numerictype_t tag);
|
|
||||||
int cmp_same_eq(void *a, void *b, numerictype_t tag);
|
|
||||||
int cmp_lt(void *a, numerictype_t atag, void *b, numerictype_t btag);
|
|
||||||
int cmp_eq(void *a, numerictype_t atag, void *b, numerictype_t btag,
|
|
||||||
int equalnans);
|
|
||||||
|
|
||||||
#ifdef ARCH_X86_64
|
#ifdef ARCH_X86_64
|
||||||
# define LEGACY_REGS "=Q"
|
# define LEGACY_REGS "=Q"
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -4,6 +4,13 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "ieee754.h"
|
#include "ieee754.h"
|
||||||
|
|
||||||
|
extern double trunc(double x);
|
||||||
|
|
||||||
|
STATIC_INLINE double fpart(double arg)
|
||||||
|
{
|
||||||
|
return arg - trunc(arg);
|
||||||
|
}
|
||||||
|
|
||||||
// given a number, determine an appropriate type for storing it
|
// given a number, determine an appropriate type for storing it
|
||||||
#if 0
|
#if 0
|
||||||
numerictype_t effective_numerictype(double r)
|
numerictype_t effective_numerictype(double r)
|
89
print.c
89
print.c
|
@ -1,3 +1,5 @@
|
||||||
|
#include "ieee754.h"
|
||||||
|
|
||||||
extern void *memrchr(const void *s, int c, size_t n);
|
extern void *memrchr(const void *s, int c, size_t n);
|
||||||
|
|
||||||
static htable_t printconses;
|
static htable_t printconses;
|
||||||
|
@ -518,6 +520,93 @@ static void print_string(ios_t *f, char *str, size_t sz)
|
||||||
outc('"', f);
|
outc('"', f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int double_exponent(double d)
|
||||||
|
{
|
||||||
|
union ieee754_double dl;
|
||||||
|
|
||||||
|
dl.d = d;
|
||||||
|
return dl.ieee.exponent - IEEE754_DOUBLE_BIAS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void snprint_real(char *s, size_t cnt, double r,
|
||||||
|
int width, // printf field width, or 0
|
||||||
|
int dec, // # decimal digits desired, recommend 16
|
||||||
|
// # of zeros in .00...0x before using scientific notation
|
||||||
|
// recommend 3-4 or so
|
||||||
|
int max_digs_rt,
|
||||||
|
// # of digits left of decimal before scientific notation
|
||||||
|
// recommend 10
|
||||||
|
int max_digs_lf)
|
||||||
|
{
|
||||||
|
int mag;
|
||||||
|
double fpart, temp;
|
||||||
|
char format[8];
|
||||||
|
char num_format[3];
|
||||||
|
int sz, keepz=0;
|
||||||
|
|
||||||
|
s[0] = '\0';
|
||||||
|
if (width == -1) {
|
||||||
|
width = 0;
|
||||||
|
keepz=1;
|
||||||
|
}
|
||||||
|
if (isnan(r)) {
|
||||||
|
if (sign_bit(r))
|
||||||
|
strncpy(s, "-nan", cnt);
|
||||||
|
else
|
||||||
|
strncpy(s, "nan", cnt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == 0) {
|
||||||
|
strncpy(s, "0", cnt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
num_format[0] = 'l';
|
||||||
|
num_format[2] = '\0';
|
||||||
|
|
||||||
|
mag = double_exponent(r);
|
||||||
|
|
||||||
|
mag = (int)(((double)mag)/LOG2_10 + 0.5);
|
||||||
|
if (r == 0)
|
||||||
|
mag = 0;
|
||||||
|
if ((mag > max_digs_lf-1) || (mag < -max_digs_rt)) {
|
||||||
|
num_format[1] = 'e';
|
||||||
|
temp = r/pow(10, mag); /* see if number will have a decimal */
|
||||||
|
fpart = temp - floor(temp); /* when written in scientific notation */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
num_format[1] = 'f';
|
||||||
|
fpart = r - floor(r);
|
||||||
|
}
|
||||||
|
if (fpart == 0)
|
||||||
|
dec = 0;
|
||||||
|
if (width == 0) {
|
||||||
|
snprintf(format, 8, "%%.%d%s", dec, num_format);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
snprintf(format, 8, "%%%d.%d%s", width, dec, num_format);
|
||||||
|
}
|
||||||
|
sz = snprintf(s, cnt, format, r);
|
||||||
|
/* trim trailing zeros from fractions. not when using scientific
|
||||||
|
notation, since we might have e.g. 1.2000e+100. also not when we
|
||||||
|
need a specific output width */
|
||||||
|
if (width == 0 && !keepz) {
|
||||||
|
if (sz > 2 && fpart && num_format[1]!='e') {
|
||||||
|
while (s[sz-1] == '0') {
|
||||||
|
s[sz-1]='\0';
|
||||||
|
sz--;
|
||||||
|
}
|
||||||
|
// don't need trailing .
|
||||||
|
if (s[sz-1] == '.') {
|
||||||
|
s[sz-1] = '\0';
|
||||||
|
sz--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO. currently 1.1e20 prints as 1.1000000000000000e+20; be able to
|
||||||
|
// get rid of all those zeros.
|
||||||
|
}
|
||||||
|
|
||||||
static numerictype_t sym_to_numtype(value_t type);
|
static numerictype_t sym_to_numtype(value_t type);
|
||||||
|
|
||||||
// 'weak' means we don't need to accurately reproduce the type, so
|
// 'weak' means we don't need to accurately reproduce the type, so
|
||||||
|
|
Loading…
Reference in New Issue