adding "d.df" syntax for reading single-precision numbers
misc. fixes more work on ios
This commit is contained in:
		
							parent
							
								
									6e515a532e
								
							
						
					
					
						commit
						fa0e134dd8
					
				| 
						 | 
					@ -316,28 +316,50 @@ value_t fl_os_setenv(value_t *args, uint32_t nargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
value_t fl_rand(value_t *args, u_int32_t nargs)
 | 
					value_t fl_rand(value_t *args, u_int32_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)args;
 | 
					    (void)args; (void)nargs;
 | 
				
			||||||
    (void)nargs;
 | 
					    fixnum_t r;
 | 
				
			||||||
    return fixnum(random()&0x1fffffff);
 | 
					#ifdef BITS64
 | 
				
			||||||
 | 
					    r = ((((uint64_t)random())<<32) | random()) & 0x1fffffffffffffffLL;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    r = random() & 0x1fffffff;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return fixnum(r);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
value_t fl_rand32(value_t *args, u_int32_t nargs)
 | 
					value_t fl_rand32(value_t *args, u_int32_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)args;
 | 
					    (void)args; (void)nargs;
 | 
				
			||||||
    (void)nargs;
 | 
					    ulong r = random();
 | 
				
			||||||
    return mk_uint32(random());
 | 
					#ifdef BITS64
 | 
				
			||||||
 | 
					    return fixnum(r);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    if (fits_fixnum(r)) return fixnum(r);
 | 
				
			||||||
 | 
					    return mk_uint32(r);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
value_t fl_rand64(value_t *args, u_int32_t nargs)
 | 
					value_t fl_rand64(value_t *args, u_int32_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)args;
 | 
					    (void)args; (void)nargs;
 | 
				
			||||||
    (void)nargs;
 | 
					    ulong r = (((uint64_t)random())<<32) | random();
 | 
				
			||||||
    return mk_uint64(((uint64_t)random())<<32 | ((uint64_t)random()));
 | 
					#ifdef BITS64
 | 
				
			||||||
 | 
					    if (fits_fixnum(r)) return fixnum(r);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    return mk_uint64(r);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
value_t fl_randd(value_t *args, u_int32_t nargs)
 | 
					value_t fl_randd(value_t *args, u_int32_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    (void)args;
 | 
					    (void)args; (void)nargs;
 | 
				
			||||||
    (void)nargs;
 | 
					 | 
				
			||||||
    return mk_double(rand_double());
 | 
					    return mk_double(rand_double());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					value_t fl_randf(value_t *args, u_int32_t nargs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    (void)args; (void)nargs;
 | 
				
			||||||
 | 
					    return mk_float(rand_float());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					value_t fl_randn(value_t *args, u_int32_t nargs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    (void)args; (void)nargs;
 | 
				
			||||||
 | 
					    return mk_double(randn());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void stringfuncs_init();
 | 
					extern void stringfuncs_init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -366,6 +388,8 @@ void builtins_init()
 | 
				
			||||||
    set(symbol("rand.uint32"), guestfunc(fl_rand32));
 | 
					    set(symbol("rand.uint32"), guestfunc(fl_rand32));
 | 
				
			||||||
    set(symbol("rand.uint64"), guestfunc(fl_rand64));
 | 
					    set(symbol("rand.uint64"), guestfunc(fl_rand64));
 | 
				
			||||||
    set(symbol("rand.double"), guestfunc(fl_randd));
 | 
					    set(symbol("rand.double"), guestfunc(fl_randd));
 | 
				
			||||||
 | 
					    set(symbol("rand.float"), guestfunc(fl_randf));
 | 
				
			||||||
 | 
					    set(symbol("randn"), guestfunc(fl_randn));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set(symbol("path.cwd"), guestfunc(fl_path_cwd));
 | 
					    set(symbol("path.cwd"), guestfunc(fl_path_cwd));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -241,6 +241,7 @@ value_t cvalue_char(value_t *args, uint32_t nargs);
 | 
				
			||||||
value_t cvalue_wchar(value_t *args, uint32_t nargs);
 | 
					value_t cvalue_wchar(value_t *args, uint32_t nargs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
value_t mk_double(double_t n);
 | 
					value_t mk_double(double_t n);
 | 
				
			||||||
 | 
					value_t mk_float(float_t n);
 | 
				
			||||||
value_t mk_uint32(uint32_t n);
 | 
					value_t mk_uint32(uint32_t n);
 | 
				
			||||||
value_t mk_uint64(uint64_t n);
 | 
					value_t mk_uint64(uint64_t n);
 | 
				
			||||||
value_t return_from_uint64(uint64_t Uaccum);
 | 
					value_t return_from_uint64(uint64_t Uaccum);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -469,11 +469,13 @@ static void cvalue_printdata(FILE *f, void *data, size_t len, value_t type,
 | 
				
			||||||
    else if (type == floatsym || type == doublesym) {
 | 
					    else if (type == floatsym || type == doublesym) {
 | 
				
			||||||
        char buf[64];
 | 
					        char buf[64];
 | 
				
			||||||
        double d;
 | 
					        double d;
 | 
				
			||||||
        if (type == floatsym) d = (double)*(float*)data;
 | 
					        int ndec;
 | 
				
			||||||
        else d = *(double*)data;
 | 
					        if (type == floatsym) { d = (double)*(float*)data; ndec = 8; }
 | 
				
			||||||
        snprint_real(buf, sizeof(buf), d, 0, 16, 3, 10);
 | 
					        else { d = *(double*)data; ndec = 16; }
 | 
				
			||||||
        if (weak || princ || (type==doublesym && strpbrk(buf, ".eE"))) {
 | 
					        snprint_real(buf, sizeof(buf), d, 0, ndec, 3, 10);
 | 
				
			||||||
 | 
					        if (weak || princ || strpbrk(buf, ".eE")) {
 | 
				
			||||||
            outs(buf, f);
 | 
					            outs(buf, f);
 | 
				
			||||||
 | 
					            if (type == floatsym) outc('f', f);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            if (!DFINITE(d))
 | 
					            if (!DFINITE(d))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,6 +31,10 @@ static int isnumtok(char *tok, value_t *pval)
 | 
				
			||||||
            if (pval) *pval = mk_double(d);
 | 
					            if (pval) *pval = mk_double(d);
 | 
				
			||||||
            return 1;
 | 
					            return 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if (end > tok && *end == 'f' && end[1] == '\0') {
 | 
				
			||||||
 | 
					            if (pval) *pval = mk_float((float)d);
 | 
				
			||||||
 | 
					            return 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (isdigit(tok[0]) || tok[0]=='-' || tok[0]=='+') {
 | 
					    if (isdigit(tok[0]) || tok[0]=='-' || tok[0]=='+') {
 | 
				
			||||||
        if (tok[0]=='-') {
 | 
					        if (tok[0]=='-') {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,10 +90,16 @@ float rand_float()
 | 
				
			||||||
    return f.f - 1.0;
 | 
					    return f.f - 1.0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void randn(double *pre, double *pim)
 | 
					double randn()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    double s, vre, vim, ure, uim;
 | 
					    double s, vre, vim, ure, uim;
 | 
				
			||||||
 | 
					    static double next = -42;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (next != -42) {
 | 
				
			||||||
 | 
					        s = next;
 | 
				
			||||||
 | 
					        next = -42;
 | 
				
			||||||
 | 
					        return s;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    do {
 | 
					    do {
 | 
				
			||||||
        ure = rand_double();
 | 
					        ure = rand_double();
 | 
				
			||||||
        uim = rand_double();
 | 
					        uim = rand_double();
 | 
				
			||||||
| 
						 | 
					@ -102,8 +108,8 @@ void randn(double *pre, double *pim)
 | 
				
			||||||
        s = vre*vre + vim*vim;
 | 
					        s = vre*vre + vim*vim;
 | 
				
			||||||
    } while (s >= 1);
 | 
					    } while (s >= 1);
 | 
				
			||||||
    s = sqrt(-2*log(s)/s);
 | 
					    s = sqrt(-2*log(s)/s);
 | 
				
			||||||
    *pre = s * vre;
 | 
					    next = s * vre;
 | 
				
			||||||
    *pim = s * vim;
 | 
					    return s * vim;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void randomize()
 | 
					void randomize()
 | 
				
			||||||
| 
						 | 
					@ -117,6 +123,7 @@ void llt_init()
 | 
				
			||||||
    /*
 | 
					    /*
 | 
				
			||||||
      I used this function to guess good values based on epsilon:
 | 
					      I used this function to guess good values based on epsilon:
 | 
				
			||||||
      tol(eps) = exp(ln(eps)*-.2334012088721472)*eps
 | 
					      tol(eps) = exp(ln(eps)*-.2334012088721472)*eps
 | 
				
			||||||
 | 
					      I derived the constant by hallucinating freely.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
    dbl_tolerance(1e-12);
 | 
					    dbl_tolerance(1e-12);
 | 
				
			||||||
    flt_tolerance(5e-6);
 | 
					    flt_tolerance(5e-6);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,7 @@ u_int64_t memhash(char* buf, size_t n);
 | 
				
			||||||
#define srandom(n) init_genrand(n)
 | 
					#define srandom(n) init_genrand(n)
 | 
				
			||||||
double rand_double();
 | 
					double rand_double();
 | 
				
			||||||
float rand_float();
 | 
					float rand_float();
 | 
				
			||||||
void randn(double *pre, double *pim);
 | 
					double randn();
 | 
				
			||||||
u_int64_t i64time();
 | 
					u_int64_t i64time();
 | 
				
			||||||
void randomize();
 | 
					void randomize();
 | 
				
			||||||
unsigned long genrand_int32();
 | 
					unsigned long genrand_int32();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										129
									
								
								llt/ios.c
								
								
								
								
							
							
						
						
									
										129
									
								
								llt/ios.c
								
								
								
								
							| 
						 | 
					@ -24,6 +24,8 @@
 | 
				
			||||||
#include "socket.h"
 | 
					#include "socket.h"
 | 
				
			||||||
#include "timefuncs.h"
 | 
					#include "timefuncs.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MOST_OF(x) ((x) - ((x)>>4))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* OS-level primitive wrappers */
 | 
					/* OS-level primitive wrappers */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int _fd_available(long fd)
 | 
					static int _fd_available(long fd)
 | 
				
			||||||
| 
						 | 
					@ -36,7 +38,7 @@ static int _fd_available(long fd)
 | 
				
			||||||
    FD_SET(fd, &set);
 | 
					    FD_SET(fd, &set);
 | 
				
			||||||
    return (select(fd+1, &set, NULL, NULL, &tv)!=0);
 | 
					    return (select(fd+1, &set, NULL, NULL, &tv)!=0);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    return 0;
 | 
					    return 1;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,7 +120,7 @@ static int _os_write(long fd, void *buf, size_t n, size_t *nwritten)
 | 
				
			||||||
            *nwritten = 0;
 | 
					            *nwritten = 0;
 | 
				
			||||||
            return errno;
 | 
					            return errno;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        sleep_ms(5);
 | 
					        sleep_ms(SLEEP_TIME);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -212,7 +214,7 @@ static size_t _writebuf_force(ios_t *s, char *data, size_t n)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        s->size = s->bpos + n;
 | 
					        s->size = s->bpos + n;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    memcpy(&s->buf[s->bpos], data, n);
 | 
					    memcpy(s->buf + s->bpos, data, n);
 | 
				
			||||||
    s->bpos += n;
 | 
					    s->bpos += n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return n;
 | 
					    return n;
 | 
				
			||||||
| 
						 | 
					@ -254,24 +256,31 @@ size_t ios_read(ios_t *s, char *dest, size_t n, int all)
 | 
				
			||||||
            s->state = bst_rd;
 | 
					            s->state = bst_rd;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if (n > (s->maxsize - (s->maxsize>>4))) {
 | 
					        if (n > MOST_OF(s->maxsize)) {
 | 
				
			||||||
            // doesn't fit comfortably in buffer; go direct
 | 
					            // doesn't fit comfortably in buffer; go direct
 | 
				
			||||||
            if (all)
 | 
					            if (all)
 | 
				
			||||||
                result = _os_read_all(s->fd, dest, n, &got);
 | 
					                result = _os_read_all(s->fd, dest, n, &got);
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                result = _os_read(s->fd, dest, n, &got);
 | 
					                result = _os_read(s->fd, dest, n, &got);
 | 
				
			||||||
            return tot+got;
 | 
					            tot += got;
 | 
				
			||||||
 | 
					            if (got < n)
 | 
				
			||||||
 | 
					                s->_eof = 1;
 | 
				
			||||||
 | 
					            return tot;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            // refill buffer
 | 
					            // refill buffer
 | 
				
			||||||
            if (_os_read(s->fd, s->buf, s->maxsize, &got)) {
 | 
					            if (_os_read(s->fd, s->buf, s->maxsize, &got)) {
 | 
				
			||||||
 | 
					                s->_eof = 1;
 | 
				
			||||||
                return tot;
 | 
					                return tot;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (got == 0) {
 | 
					            if (got == 0) {
 | 
				
			||||||
                if (all)
 | 
					                if (all) {
 | 
				
			||||||
                    _fd_poll(s->fd, 0);
 | 
					                    _fd_poll(s->fd, 0);
 | 
				
			||||||
                else
 | 
					                }
 | 
				
			||||||
 | 
					                else {
 | 
				
			||||||
 | 
					                    s->_eof = 1;
 | 
				
			||||||
                    return tot;
 | 
					                    return tot;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            s->size = got;
 | 
					            s->size = got;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -282,18 +291,57 @@ size_t ios_read(ios_t *s, char *dest, size_t n, int all)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t ios_write(ios_t *s, char *data, size_t n)
 | 
					size_t ios_write(ios_t *s, char *data, size_t n)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (n == 0) return 0;
 | 
				
			||||||
 | 
					    size_t space;
 | 
				
			||||||
 | 
					    size_t wrote = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (s->state == bst_wr)
 | 
				
			||||||
 | 
					        space = s->maxsize - s->bpos;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        space = s->size - s->bpos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (s->bm == bm_mem) {
 | 
				
			||||||
 | 
					        wrote = _writebuf_force(s, data, n);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (s->bm == bm_none) {
 | 
				
			||||||
 | 
					        int result = _os_write_all(s->fd, data, n, &wrote);
 | 
				
			||||||
 | 
					        return wrote;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (n <= space) {
 | 
				
			||||||
 | 
					        memcpy(s->buf + s->bpos, data, n);
 | 
				
			||||||
 | 
					        s->bpos += n;
 | 
				
			||||||
 | 
					        wrote = n;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        s->state = bst_wr;
 | 
				
			||||||
 | 
					        ios_flush(s);
 | 
				
			||||||
 | 
					        if (n > MOST_OF(s->maxsize)) {
 | 
				
			||||||
 | 
					            int result = _os_write_all(s->fd, data, n, &wrote);
 | 
				
			||||||
 | 
					            return wrote;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return ios_write(s, data, n);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (s->bpos > s->ndirty)
 | 
				
			||||||
 | 
					        s->ndirty = s->bpos;
 | 
				
			||||||
 | 
					    if (s->bpos > s->size)
 | 
				
			||||||
 | 
					        s->size = s->bpos;
 | 
				
			||||||
 | 
					    return wrote;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
off_t ios_seek(ios_t *s, off_t pos)
 | 
					off_t ios_seek(ios_t *s, off_t pos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    s->_eof = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
off_t ios_seek_end(ios_t *s)
 | 
					off_t ios_seek_end(ios_t *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    s->_eof = 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
off_t ios_skip(ios_t *s, off_t offs)
 | 
					off_t ios_skip(ios_t *s, off_t offs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (offs < 0)
 | 
				
			||||||
 | 
					        s->_eof = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
off_t ios_pos(ios_t *s)
 | 
					off_t ios_pos(ios_t *s)
 | 
				
			||||||
| 
						 | 
					@ -314,6 +362,22 @@ off_t ios_pos(ios_t *s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
size_t ios_trunc(ios_t *s, size_t size)
 | 
					size_t ios_trunc(ios_t *s, size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (s->bm == bm_mem) {
 | 
				
			||||||
 | 
					        if (size == s->size)
 | 
				
			||||||
 | 
					            return s->size;
 | 
				
			||||||
 | 
					        if (size < s->size) {
 | 
				
			||||||
 | 
					            if (s->bpos > size)
 | 
				
			||||||
 | 
					                s->bpos = size;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else {
 | 
				
			||||||
 | 
					            if (_buf_realloc(s, size)==NULL)
 | 
				
			||||||
 | 
					                return s->size;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        s->size = size;
 | 
				
			||||||
 | 
					        return size;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    //todo
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ios_eof(ios_t *s)
 | 
					int ios_eof(ios_t *s)
 | 
				
			||||||
| 
						 | 
					@ -322,7 +386,12 @@ int ios_eof(ios_t *s)
 | 
				
			||||||
        return (s->bpos >= s->size);
 | 
					        return (s->bpos >= s->size);
 | 
				
			||||||
    if (s->fd == -1)
 | 
					    if (s->fd == -1)
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    // todo
 | 
					    if (s->_eof)
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    if (_fd_available(s->fd))
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    s->_eof = 1;
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void _discard_partial_buffer(ios_t *s)
 | 
					static void _discard_partial_buffer(ios_t *s)
 | 
				
			||||||
| 
						 | 
					@ -356,14 +425,18 @@ int ios_flush(ios_t *s)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    size_t nw, ntowrite=s->ndirty;
 | 
					    size_t nw, ntowrite=s->ndirty;
 | 
				
			||||||
    // todo: this should use sendall
 | 
					    int err = _os_write_all(s->fd, s->buf, ntowrite, &nw);
 | 
				
			||||||
    int err = _os_write(s->fd, s->buf, ntowrite, &nw);
 | 
					 | 
				
			||||||
    // todo: try recovering from some kinds of errors (e.g. retry)
 | 
					    // todo: try recovering from some kinds of errors (e.g. retry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (s->state == bst_rd) {
 | 
					    if (s->state == bst_rd) {
 | 
				
			||||||
        if (lseek(s->fd, s->size - nw, SEEK_CUR) == (off_t)-1) {
 | 
					        if (lseek(s->fd, s->size - nw, SEEK_CUR) == (off_t)-1) {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else if (s->state == bst_wr) {
 | 
				
			||||||
 | 
					        if (s->bpos != nw &&
 | 
				
			||||||
 | 
					            lseek(s->fd, (off_t)s->bpos - (off_t)nw, SEEK_CUR) == (off_t)-1) {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (s->ndirty <= s->bpos) {
 | 
					    if (s->ndirty <= s->bpos) {
 | 
				
			||||||
        // in this case assume we're done with the first part of the buffer
 | 
					        // in this case assume we're done with the first part of the buffer
 | 
				
			||||||
| 
						 | 
					@ -386,6 +459,20 @@ void ios_close(ios_t *s)
 | 
				
			||||||
    s->fd = -1;
 | 
					    s->fd = -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void _buf_init(ios_t *s, bufmode_t bm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    s->bm = bm;
 | 
				
			||||||
 | 
					    if (s->bm == bm_mem || s->bm == bm_none) {
 | 
				
			||||||
 | 
					        s->buf = &s->local[0];
 | 
				
			||||||
 | 
					        s->maxsize = IOS_INLSIZE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					        s->buf = NULL;
 | 
				
			||||||
 | 
					        _buf_realloc(s, IOS_BUFSIZE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    s->size = s->bpos = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *ios_takebuf(ios_t *s, size_t *psize)
 | 
					char *ios_takebuf(ios_t *s, size_t *psize)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    char *buf;
 | 
					    char *buf;
 | 
				
			||||||
| 
						 | 
					@ -407,15 +494,7 @@ char *ios_takebuf(ios_t *s, size_t *psize)
 | 
				
			||||||
    *psize = s->size+1;  // buffer is actually 1 bigger for terminating NUL
 | 
					    *psize = s->size+1;  // buffer is actually 1 bigger for terminating NUL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* empty stream and reinitialize */
 | 
					    /* empty stream and reinitialize */
 | 
				
			||||||
    if (s->bm == bm_mem || s->bm == bm_none) {
 | 
					    _buf_init(s, s->bm);
 | 
				
			||||||
        s->buf = &s->local[0];
 | 
					 | 
				
			||||||
        s->maxsize = IOS_INLSIZE;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else {
 | 
					 | 
				
			||||||
        s->buf = NULL;
 | 
					 | 
				
			||||||
        _buf_realloc(s, IOS_BUFSIZE);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    s->size = s->bpos = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return buf;
 | 
					    return buf;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -455,10 +534,20 @@ void ios_bswap(ios_t *s, int bswap)
 | 
				
			||||||
    s->byteswap = !!bswap;
 | 
					    s->byteswap = !!bswap;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ios_copy(ios_t *to, ios_t *from, size_t nbytes, bool_t all)
 | 
					static int ios_copy_(ios_t *to, ios_t *from, size_t nbytes, bool_t all)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ios_copy(ios_t *to, ios_t *from, size_t nbytes)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return ios_copy_(to, from, nbytes, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ios_copyall(ios_t *to, ios_t *from)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return ios_copy_(to, from, 0, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* stream object initializers. we do no allocation. */
 | 
					/* stream object initializers. we do no allocation. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										14
									
								
								llt/ios.h
								
								
								
								
							
							
						
						
									
										14
									
								
								llt/ios.h
								
								
								
								
							| 
						 | 
					@ -41,6 +41,7 @@ typedef struct {
 | 
				
			||||||
    //unsigned char readonly:1;
 | 
					    //unsigned char readonly:1;
 | 
				
			||||||
    unsigned char ownbuf:1;
 | 
					    unsigned char ownbuf:1;
 | 
				
			||||||
    unsigned char ownfd:1;
 | 
					    unsigned char ownfd:1;
 | 
				
			||||||
 | 
					    unsigned char _eof:1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // this means you can read, seek back, then read the same data
 | 
					    // this means you can read, seek back, then read the same data
 | 
				
			||||||
    // again any number of times. usually only true for files and strings.
 | 
					    // again any number of times. usually only true for files and strings.
 | 
				
			||||||
| 
						 | 
					@ -50,7 +51,7 @@ typedef struct {
 | 
				
			||||||
    // seek without flushing in between. this performs read-before-write
 | 
					    // seek without flushing in between. this performs read-before-write
 | 
				
			||||||
    // to populate the buffer, so "rereadable" capability is required.
 | 
					    // to populate the buffer, so "rereadable" capability is required.
 | 
				
			||||||
    // this is off by default.
 | 
					    // this is off by default.
 | 
				
			||||||
    unsigned char stenciled:1;
 | 
					    //unsigned char stenciled:1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // request durable writes (fsync)
 | 
					    // request durable writes (fsync)
 | 
				
			||||||
    // unsigned char durable:1;
 | 
					    // unsigned char durable:1;
 | 
				
			||||||
| 
						 | 
					@ -75,7 +76,10 @@ char *ios_takebuf(ios_t *s, size_t *psize);  // release buffer to caller
 | 
				
			||||||
int ios_setbuf(ios_t *s, char *buf, size_t size, int own);
 | 
					int ios_setbuf(ios_t *s, char *buf, size_t size, int own);
 | 
				
			||||||
int ios_bufmode(ios_t *s, bufmode_t mode);
 | 
					int ios_bufmode(ios_t *s, bufmode_t mode);
 | 
				
			||||||
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, bool_t all);
 | 
					int ios_copy(ios_t *to, ios_t *from, size_t nbytes);
 | 
				
			||||||
 | 
					int ios_copyall(ios_t *to, ios_t *from);
 | 
				
			||||||
 | 
					// ensure at least n bytes are buffered if possible. returns actual #.
 | 
				
			||||||
 | 
					//size_t ios_ensure(ios_t *from, size_t n);
 | 
				
			||||||
//void ios_lock(ios_t *s);
 | 
					//void ios_lock(ios_t *s);
 | 
				
			||||||
//int ios_trylock(ios_t *s);
 | 
					//int ios_trylock(ios_t *s);
 | 
				
			||||||
//int ios_unlock(ios_t *s);
 | 
					//int ios_unlock(ios_t *s);
 | 
				
			||||||
| 
						 | 
					@ -109,11 +113,11 @@ int ios_prevutf8(ios_t *s);
 | 
				
			||||||
/* stdio-style functions */
 | 
					/* stdio-style functions */
 | 
				
			||||||
#define IOS_EOF (-1)
 | 
					#define IOS_EOF (-1)
 | 
				
			||||||
int ios_putc(ios_t *s, int c);
 | 
					int ios_putc(ios_t *s, int c);
 | 
				
			||||||
wint_t ios_putwc(ios_t *s, wchar_t wc);
 | 
					//wint_t ios_putwc(ios_t *s, wchar_t wc);
 | 
				
			||||||
int ios_getc(ios_t *s);
 | 
					int ios_getc(ios_t *s);
 | 
				
			||||||
wint_t ios_getwc(ios_t *s);
 | 
					//wint_t ios_getwc(ios_t *s);
 | 
				
			||||||
int ios_ungetc(ios_t *s, int c);
 | 
					int ios_ungetc(ios_t *s, int c);
 | 
				
			||||||
wint_t ios_ungetwc(ios_t *s, wint_t wc);
 | 
					//wint_t ios_ungetwc(ios_t *s, wint_t wc);
 | 
				
			||||||
#define ios_puts(s, str) ios_write(s, str, strlen(str))
 | 
					#define ios_puts(s, str) ios_write(s, str, strlen(str))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,17 +22,18 @@
 | 
				
			||||||
#include "timefuncs.h"
 | 
					#include "timefuncs.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
double tvals2float(struct tm *t, struct timeb *tstruct)
 | 
					double tvals2float(struct tm *t, struct timeb *tstruct)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return (double)t->tm_hour * 3600 + (double)t->tm_min * 60 +
 | 
					    return (double)t->tm_hour * 3600 + (double)t->tm_min * 60 +
 | 
				
			||||||
        (double)t->tm_sec + (double)tstruct->millitm/1.0e3;
 | 
					        (double)t->tm_sec + (double)tstruct->millitm/1.0e3;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
double floattime()
 | 
					double floattime()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    struct timeb tstruct;
 | 
					    struct timeb tstruct;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ftime(&tstruct);
 | 
					    ftime(&tstruct);
 | 
				
			||||||
    return (double)tstruct.time + (double)tstruct.millitm/1.0e3;
 | 
					    return (double)tstruct.time + (double)tstruct.millitm/1.0e3;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					@ -53,7 +54,7 @@ u_int64_t i64time()
 | 
				
			||||||
    u_int64_t a;
 | 
					    u_int64_t a;
 | 
				
			||||||
#ifdef WIN32
 | 
					#ifdef WIN32
 | 
				
			||||||
    struct timeb tstruct;
 | 
					    struct timeb tstruct;
 | 
				
			||||||
	ftime(&tstruct);
 | 
					    ftime(&tstruct);
 | 
				
			||||||
    a = (((u_int64_t)tstruct.time)<<32) + (u_int64_t)tstruct.millitm;
 | 
					    a = (((u_int64_t)tstruct.time)<<32) + (u_int64_t)tstruct.millitm;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    struct timeval now;
 | 
					    struct timeval now;
 | 
				
			||||||
| 
						 | 
					@ -76,12 +77,6 @@ double clock_now()
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef LINUX
 | 
					 | 
				
			||||||
static char *wdaystr[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
 | 
					 | 
				
			||||||
static char *monthstr[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug",
 | 
					 | 
				
			||||||
                           "Sep","Oct","Nov","Dec"};
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void timestring(double seconds, char *buffer, size_t len)
 | 
					void timestring(double seconds, char *buffer, size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    time_t tme = (time_t)seconds;
 | 
					    time_t tme = (time_t)seconds;
 | 
				
			||||||
| 
						 | 
					@ -93,6 +88,9 @@ void timestring(double seconds, char *buffer, size_t len)
 | 
				
			||||||
    localtime_r(&tme, &tm);
 | 
					    localtime_r(&tme, &tm);
 | 
				
			||||||
    strftime(buffer, len, fmt, &tm);
 | 
					    strftime(buffer, len, fmt, &tm);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					    static char *wdaystr[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
 | 
				
			||||||
 | 
					    static char *monthstr[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug",
 | 
				
			||||||
 | 
					                               "Sep","Oct","Nov","Dec"};
 | 
				
			||||||
    struct tm *tm;
 | 
					    struct tm *tm;
 | 
				
			||||||
    int hr;
 | 
					    int hr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue