more reorganization of LLT
adding io.readuntil, io.readline improvements to ios_readprep
This commit is contained in:
parent
2cf5187ca9
commit
40cff81550
|
@ -14,6 +14,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
#include "flisp.h"
|
#include "flisp.h"
|
||||||
|
#include "random.h"
|
||||||
|
|
||||||
size_t llength(value_t v)
|
size_t llength(value_t v)
|
||||||
{
|
{
|
||||||
|
|
|
@ -838,7 +838,7 @@ value_t cbuiltin(char *name, builtin_t f)
|
||||||
// directly-callable values are assumed not to move for
|
// directly-callable values are assumed not to move for
|
||||||
// evaluator performance, so put builtin func metadata on the
|
// evaluator performance, so put builtin func metadata on the
|
||||||
// unmanaged heap
|
// unmanaged heap
|
||||||
cvalue_t *buf = malloc_aligned(nw * sizeof(value_t), 8);
|
cvalue_t *buf = malloc(nw * sizeof(value_t));
|
||||||
memcpy(buf, ptr(gf), nw*sizeof(value_t));
|
memcpy(buf, ptr(gf), nw*sizeof(value_t));
|
||||||
return tagptr(buf, TAG_BUILTIN);
|
return tagptr(buf, TAG_BUILTIN);
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -202,8 +202,8 @@ static symbol_t *mk_symbol(char *str)
|
||||||
symbol_t *sym;
|
symbol_t *sym;
|
||||||
size_t len = strlen(str);
|
size_t len = strlen(str);
|
||||||
|
|
||||||
sym = (symbol_t*)malloc_aligned(sizeof(symbol_t)-sizeof(void*) + len + 1,
|
sym = (symbol_t*)malloc(sizeof(symbol_t)-sizeof(void*) + len + 1);
|
||||||
8);
|
assert(((uptrint_t)sym & 0x7) == 0); // make sure malloc aligns 8
|
||||||
sym->left = sym->right = NULL;
|
sym->left = sym->right = NULL;
|
||||||
if (str[0] == ':') {
|
if (str[0] == ':') {
|
||||||
value_t s = tagptr(sym, TAG_SYM);
|
value_t s = tagptr(sym, TAG_SYM);
|
||||||
|
@ -502,7 +502,7 @@ void gc(int mustgrow)
|
||||||
// more space to fill next time. if we grew tospace last time,
|
// more space to fill next time. if we grew tospace last time,
|
||||||
// grow the other half of the heap this time to catch up.
|
// grow the other half of the heap this time to catch up.
|
||||||
if (grew || ((lim-curheap) < (int)(heapsize/5)) || mustgrow) {
|
if (grew || ((lim-curheap) < (int)(heapsize/5)) || mustgrow) {
|
||||||
temp = realloc_aligned(tospace, grew ? heapsize : heapsize*2, 16);
|
temp = realloc(tospace, grew ? heapsize : heapsize*2);
|
||||||
if (temp == NULL)
|
if (temp == NULL)
|
||||||
raise(memory_exception_value);
|
raise(memory_exception_value);
|
||||||
tospace = temp;
|
tospace = temp;
|
||||||
|
@ -1442,8 +1442,8 @@ void lisp_init(void)
|
||||||
|
|
||||||
llt_init();
|
llt_init();
|
||||||
|
|
||||||
fromspace = malloc_aligned(heapsize, 16);
|
fromspace = malloc(heapsize);
|
||||||
tospace = malloc_aligned(heapsize, 16);
|
tospace = malloc(heapsize);
|
||||||
curheap = fromspace;
|
curheap = fromspace;
|
||||||
lim = curheap+heapsize-sizeof(cons_t);
|
lim = curheap+heapsize-sizeof(cons_t);
|
||||||
consflags = bitvector_new(heapsize/sizeof(cons_t), 1);
|
consflags = bitvector_new(heapsize/sizeof(cons_t), 1);
|
||||||
|
|
|
@ -239,6 +239,30 @@ value_t fl_dump(value_t *args, u_int32_t nargs)
|
||||||
return FL_T;
|
return FL_T;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t fl_ioreaduntil(value_t *args, u_int32_t nargs)
|
||||||
|
{
|
||||||
|
argcount("io.readuntil", nargs, 2);
|
||||||
|
value_t str = cvalue_string(80);
|
||||||
|
cvalue_t *cv = (cvalue_t*)ptr(str);
|
||||||
|
char *data = cv_data(cv);
|
||||||
|
ios_t dest;
|
||||||
|
ios_mem(&dest, 0);
|
||||||
|
ios_setbuf(&dest, data, 80, 0);
|
||||||
|
char delim = (char)toulong(args[1], "io.readuntil");
|
||||||
|
ios_t *src = toiostream(args[0], "io.readuntil");
|
||||||
|
size_t n = ios_copyuntil(&dest, src, delim);
|
||||||
|
cv->len = n;
|
||||||
|
if (dest.buf != data) {
|
||||||
|
// outgrew initial space
|
||||||
|
cv->data = dest.buf;
|
||||||
|
cv_autorelease(cv);
|
||||||
|
}
|
||||||
|
((char*)cv->data)[n] = '\0';
|
||||||
|
if (n == 0 && ios_eof(src))
|
||||||
|
return FL_F;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
static builtinspec_t iostreamfunc_info[] = {
|
static builtinspec_t iostreamfunc_info[] = {
|
||||||
{ "iostream?", fl_iostreamp },
|
{ "iostream?", fl_iostreamp },
|
||||||
{ "dump", fl_dump },
|
{ "dump", fl_dump },
|
||||||
|
@ -254,6 +278,7 @@ static builtinspec_t iostreamfunc_info[] = {
|
||||||
{ "io.discardbuffer", fl_iopurge },
|
{ "io.discardbuffer", fl_iopurge },
|
||||||
{ "io.read", fl_ioread },
|
{ "io.read", fl_ioread },
|
||||||
{ "io.write", fl_iowrite },
|
{ "io.write", fl_iowrite },
|
||||||
|
{ "io.readuntil", fl_ioreaduntil },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -560,6 +560,8 @@
|
||||||
(trim-start s at-start 0 L)
|
(trim-start s at-start 0 L)
|
||||||
(trim-end s at-end L))))
|
(trim-end s at-end L))))
|
||||||
|
|
||||||
|
(define (io.readline s) (io.readuntil s #byte(0xA)))
|
||||||
|
|
||||||
(define (repl)
|
(define (repl)
|
||||||
(define (prompt)
|
(define (prompt)
|
||||||
(princ "> ") (io.flush *output-stream*)
|
(princ "> ") (io.flush *output-stream*)
|
||||||
|
|
|
@ -858,7 +858,8 @@ IOStream API
|
||||||
*io.write - (io.write s cvalue)
|
*io.write - (io.write s cvalue)
|
||||||
*io.read - (io.read s ctype [len])
|
*io.read - (io.read s ctype [len])
|
||||||
io.getc - get utf8 character(s)
|
io.getc - get utf8 character(s)
|
||||||
io.readline
|
*io.readline
|
||||||
|
*io.readuntil
|
||||||
io.copy - (io.copy to from [nbytes])
|
io.copy - (io.copy to from [nbytes])
|
||||||
io.copyuntil - (io.copy to from byte)
|
io.copyuntil - (io.copy to from byte)
|
||||||
io.pos - (io.pos s [set-pos])
|
io.pos - (io.pos s [set-pos])
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
|
||||||
SRCS = bitvector.c hashing.c socket.c timefuncs.c utils.c dblprint.c ptrhash.c \
|
SRCS = bitvector.c hashing.c socket.c timefuncs.c dblprint.c ptrhash.c \
|
||||||
utf8.c ios.c operators.c cplxprint.c dirpath.c htable.c \
|
utf8.c ios.c operators.c cplxprint.c dirpath.c htable.c \
|
||||||
bitvector-ops.c fp.c int2str.c dump.c
|
bitvector-ops.c fp.c int2str.c dump.c random.c bswap.c memalign.c \
|
||||||
|
swapreverse.c
|
||||||
OBJS = $(SRCS:%.c=%.o)
|
OBJS = $(SRCS:%.c=%.o)
|
||||||
DOBJS = $(SRCS:%.c=%.do)
|
DOBJS = $(SRCS:%.c=%.do)
|
||||||
TARGET = libllt.a
|
TARGET = libllt.a
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
#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];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
22
llt/fp.c
22
llt/fp.c
|
@ -86,25 +86,3 @@ int flt_equals(float a, float b)
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
double randn()
|
|
||||||
{
|
|
||||||
double s, vre, vim, ure, uim;
|
|
||||||
static double next = -42;
|
|
||||||
|
|
||||||
if (next != -42) {
|
|
||||||
s = next;
|
|
||||||
next = -42;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
do {
|
|
||||||
ure = rand_double();
|
|
||||||
uim = rand_double();
|
|
||||||
vre = 2*ure - 1;
|
|
||||||
vim = 2*uim - 1;
|
|
||||||
s = vre*vre + vim*vim;
|
|
||||||
} while (s >= 1);
|
|
||||||
s = sqrt(-2*log(s)/s);
|
|
||||||
next = s * vre;
|
|
||||||
return s * vim;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Hashing and random numbers
|
Hashing
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
#include "hashing.h"
|
#include "hashing.h"
|
||||||
#include "timefuncs.h"
|
#include "timefuncs.h"
|
||||||
#include "ios.h"
|
#include "ios.h"
|
||||||
|
#include "random.h"
|
||||||
|
|
||||||
uint_t nextipow2(uint_t i)
|
uint_t nextipow2(uint_t i)
|
||||||
{
|
{
|
||||||
|
@ -76,35 +77,6 @@ u_int32_t memhash32(char* buf, size_t n)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "mt19937ar.c"
|
|
||||||
|
|
||||||
double rand_double()
|
|
||||||
{
|
|
||||||
union ieee754_double d;
|
|
||||||
|
|
||||||
d.ieee.mantissa0 = random();
|
|
||||||
d.ieee.mantissa1 = random();
|
|
||||||
d.ieee.negative = 0;
|
|
||||||
d.ieee.exponent = IEEE754_DOUBLE_BIAS + 0; /* 2^0 */
|
|
||||||
return d.d - 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
float rand_float()
|
|
||||||
{
|
|
||||||
union ieee754_float f;
|
|
||||||
|
|
||||||
f.ieee.mantissa = random();
|
|
||||||
f.ieee.negative = 0;
|
|
||||||
f.ieee.exponent = IEEE754_FLOAT_BIAS + 0; /* 2^0 */
|
|
||||||
return f.f - 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void randomize()
|
|
||||||
{
|
|
||||||
u_int64_t tm = i64time();
|
|
||||||
init_by_array((unsigned long*)&tm, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
double D_PNAN;
|
double D_PNAN;
|
||||||
double D_NNAN;
|
double D_NNAN;
|
||||||
double D_PINF;
|
double D_PINF;
|
||||||
|
|
|
@ -12,14 +12,5 @@ u_int32_t int64to32hash(u_int64_t key);
|
||||||
#endif
|
#endif
|
||||||
u_int64_t memhash(char* buf, size_t n);
|
u_int64_t memhash(char* buf, size_t n);
|
||||||
u_int32_t memhash32(char* buf, size_t n);
|
u_int32_t memhash32(char* buf, size_t n);
|
||||||
#define random() genrand_int32()
|
|
||||||
#define srandom(n) init_genrand(n)
|
|
||||||
double rand_double();
|
|
||||||
float rand_float();
|
|
||||||
double randn();
|
|
||||||
u_int64_t i64time();
|
|
||||||
void randomize();
|
|
||||||
unsigned long genrand_int32();
|
|
||||||
void init_genrand(unsigned long s);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
39
llt/ios.c
39
llt/ios.c
|
@ -309,9 +309,18 @@ size_t ios_readprep(ios_t *s, size_t n)
|
||||||
if (space >= n || s->bm == bm_mem || s->fd == -1)
|
if (space >= n || s->bm == bm_mem || s->fd == -1)
|
||||||
return space;
|
return space;
|
||||||
if (s->maxsize < s->bpos+n) {
|
if (s->maxsize < s->bpos+n) {
|
||||||
if (_buf_realloc(s, s->maxsize + n)==NULL)
|
// it won't fit. grow buffer or move data back.
|
||||||
|
if (n <= s->maxsize && space <= ((s->maxsize)>>5)) {
|
||||||
|
if (space)
|
||||||
|
memmove(s->buf, s->buf+s->bpos, space);
|
||||||
|
s->size -= s->bpos;
|
||||||
|
s->bpos = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (_buf_realloc(s, s->bpos + n)==NULL)
|
||||||
return space;
|
return space;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
size_t got;
|
size_t got;
|
||||||
int result = _os_read(s->fd, s->buf+s->size, s->maxsize - s->size, &got);
|
int result = _os_read(s->fd, s->buf+s->size, s->maxsize - s->size, &got);
|
||||||
if (result)
|
if (result)
|
||||||
|
@ -619,6 +628,34 @@ int ios_copyall(ios_t *to, ios_t *from)
|
||||||
return ios_copy_(to, from, 0, 1);
|
return ios_copy_(to, from, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LINE_CHUNK_SIZE 160
|
||||||
|
|
||||||
|
size_t ios_copyuntil(ios_t *to, ios_t *from, char delim)
|
||||||
|
{
|
||||||
|
size_t total = 0, avail;
|
||||||
|
if (!ios_eof(from)) {
|
||||||
|
do {
|
||||||
|
avail = ios_readprep(from, LINE_CHUNK_SIZE);
|
||||||
|
size_t written;
|
||||||
|
char *pd = (char*)memchr(from->buf+from->bpos, delim, avail);
|
||||||
|
if (pd == NULL) {
|
||||||
|
written = ios_write(to, from->buf+from->bpos, avail);
|
||||||
|
from->bpos += avail;
|
||||||
|
total += written;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
size_t ntowrite = pd - (from->buf+from->bpos) + 1;
|
||||||
|
written = ios_write(to, from->buf+from->bpos, ntowrite);
|
||||||
|
from->bpos += ntowrite;
|
||||||
|
total += written;
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
} while (!ios_eof(from) && avail >= LINE_CHUNK_SIZE);
|
||||||
|
}
|
||||||
|
from->_eof = 1;
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
static void _ios_init(ios_t *s)
|
static void _ios_init(ios_t *s)
|
||||||
{
|
{
|
||||||
// put all fields in a sane initial state
|
// put all fields in a sane initial state
|
||||||
|
|
|
@ -80,6 +80,7 @@ void ios_set_readonly(ios_t *s);
|
||||||
void ios_bswap(ios_t *s, int bswap);
|
void ios_bswap(ios_t *s, int bswap);
|
||||||
int ios_copy(ios_t *to, ios_t *from, size_t nbytes);
|
int ios_copy(ios_t *to, ios_t *from, size_t nbytes);
|
||||||
int ios_copyall(ios_t *to, ios_t *from);
|
int ios_copyall(ios_t *to, ios_t *from);
|
||||||
|
size_t ios_copyuntil(ios_t *to, ios_t *from, char delim);
|
||||||
// ensure at least n bytes are buffered if possible. returns # available.
|
// ensure at least n bytes are buffered if possible. returns # available.
|
||||||
size_t ios_readprep(ios_t *from, size_t n);
|
size_t ios_readprep(ios_t *from, size_t n);
|
||||||
//void ios_lock(ios_t *s);
|
//void ios_lock(ios_t *s);
|
||||||
|
@ -112,7 +113,6 @@ int ios_getutf8(ios_t *s, uint32_t *pwc);
|
||||||
int ios_ungetutf8(ios_t *s, uint32_t wc);
|
int ios_ungetutf8(ios_t *s, uint32_t wc);
|
||||||
int ios_getstringz(ios_t *dest, ios_t *src);
|
int ios_getstringz(ios_t *dest, ios_t *src);
|
||||||
int ios_getstringn(ios_t *dest, ios_t *src, size_t nchars);
|
int ios_getstringn(ios_t *dest, ios_t *src, size_t nchars);
|
||||||
int ios_readline(ios_t *dest, ios_t *s, char delim);
|
|
||||||
int ios_getline(ios_t *s, char **pbuf, size_t *psz);
|
int ios_getline(ios_t *s, char **pbuf, size_t *psz);
|
||||||
|
|
||||||
// discard data buffered for reading
|
// discard data buffered for reading
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
#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*)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*)malloc(size + align_size-1 + sizeof(long));
|
||||||
|
if (ptr == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return aligned_ptr(ptr, align_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_aligned(void *ptr)
|
||||||
|
{
|
||||||
|
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 = realloc(ptr, size + align_size-1 + sizeof(long));
|
||||||
|
if (pnew == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return aligned_ptr(pnew, align_size);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
random numbers
|
||||||
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "ieee754.h"
|
||||||
|
#include "dtypes.h"
|
||||||
|
#include "utils.h"
|
||||||
|
#include "random.h"
|
||||||
|
#include "timefuncs.h"
|
||||||
|
#include "ios.h"
|
||||||
|
|
||||||
|
#include "mt19937ar.c"
|
||||||
|
|
||||||
|
double rand_double()
|
||||||
|
{
|
||||||
|
union ieee754_double d;
|
||||||
|
|
||||||
|
d.ieee.mantissa0 = random();
|
||||||
|
d.ieee.mantissa1 = random();
|
||||||
|
d.ieee.negative = 0;
|
||||||
|
d.ieee.exponent = IEEE754_DOUBLE_BIAS + 0; /* 2^0 */
|
||||||
|
return d.d - 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float rand_float()
|
||||||
|
{
|
||||||
|
union ieee754_float f;
|
||||||
|
|
||||||
|
f.ieee.mantissa = random();
|
||||||
|
f.ieee.negative = 0;
|
||||||
|
f.ieee.exponent = IEEE754_FLOAT_BIAS + 0; /* 2^0 */
|
||||||
|
return f.f - 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double randn()
|
||||||
|
{
|
||||||
|
double s, vre, vim, ure, uim;
|
||||||
|
static double next = -42;
|
||||||
|
|
||||||
|
if (next != -42) {
|
||||||
|
s = next;
|
||||||
|
next = -42;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
ure = rand_double();
|
||||||
|
uim = rand_double();
|
||||||
|
vre = 2*ure - 1;
|
||||||
|
vim = 2*uim - 1;
|
||||||
|
s = vre*vre + vim*vim;
|
||||||
|
} while (s >= 1);
|
||||||
|
s = sqrt(-2*log(s)/s);
|
||||||
|
next = s * vre;
|
||||||
|
return s * vim;
|
||||||
|
}
|
||||||
|
|
||||||
|
void randomize()
|
||||||
|
{
|
||||||
|
u_int64_t tm = i64time();
|
||||||
|
init_by_array((unsigned long*)&tm, 2);
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef __LLTRANDOM_H_
|
||||||
|
#define __LLTRANDOM_H_
|
||||||
|
|
||||||
|
#define random() genrand_int32()
|
||||||
|
#define srandom(n) init_genrand(n)
|
||||||
|
double rand_double();
|
||||||
|
float rand_float();
|
||||||
|
double randn();
|
||||||
|
void randomize();
|
||||||
|
unsigned long genrand_int32();
|
||||||
|
void init_genrand(unsigned long s);
|
||||||
|
u_int64_t i64time();
|
||||||
|
|
||||||
|
#endif
|
|
@ -185,127 +185,3 @@ void memreverse_to(char *dest, char *a, size_t n, size_t elsz)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#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*)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*)malloc(size + align_size-1 + sizeof(long));
|
|
||||||
if (ptr == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return aligned_ptr(ptr, align_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_aligned(void *ptr)
|
|
||||||
{
|
|
||||||
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 = realloc(ptr, size + align_size-1 + sizeof(long));
|
|
||||||
if (pnew == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return aligned_ptr(pnew, align_size);
|
|
||||||
}
|
|
Loading…
Reference in New Issue