adding dump, memstream, io.read, and io.write
more renaming allowing iostreams to be read-only fixing bug allowing arrays with 0-size elements
This commit is contained in:
parent
923c7d5495
commit
2cf5187ca9
|
@ -17,7 +17,7 @@
|
||||||
,(begin->cps (cdr forms) k)))))))
|
,(begin->cps (cdr forms) k)))))))
|
||||||
|
|
||||||
(define-macro (lambda/cc args body)
|
(define-macro (lambda/cc args body)
|
||||||
`(rplaca (lambda ,args ,body) 'lambda/cc))
|
`(set-car! (lambda ,args ,body) 'lambda/cc))
|
||||||
|
|
||||||
; a utility used at run time to dispatch a call with or without
|
; a utility used at run time to dispatch a call with or without
|
||||||
; the continuation argument, depending on the function
|
; the continuation argument, depending on the function
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
(apply f (cons k args))
|
(apply f (cons k args))
|
||||||
(k (apply f args))))
|
(k (apply f args))))
|
||||||
(define *funcall/cc-names*
|
(define *funcall/cc-names*
|
||||||
(list-to-vector
|
(list->vector
|
||||||
(map (lambda (i) (intern (string 'funcall/cc- i)))
|
(map (lambda (i) (intern (string 'funcall/cc- i)))
|
||||||
(iota 6))))
|
(iota 6))))
|
||||||
(define-macro (def-funcall/cc-n args)
|
(define-macro (def-funcall/cc-n args)
|
||||||
|
|
|
@ -153,7 +153,7 @@ void lerror(value_t e, char *format, ...) __attribute__ ((__noreturn__));
|
||||||
void raise(value_t e) __attribute__ ((__noreturn__));
|
void raise(value_t e) __attribute__ ((__noreturn__));
|
||||||
void type_error(char *fname, char *expected, value_t got) __attribute__ ((__noreturn__));
|
void type_error(char *fname, char *expected, value_t got) __attribute__ ((__noreturn__));
|
||||||
void bounds_error(char *fname, value_t arr, value_t ind) __attribute__ ((__noreturn__));
|
void bounds_error(char *fname, value_t arr, value_t ind) __attribute__ ((__noreturn__));
|
||||||
extern value_t ArgError, IOError, KeyError;
|
extern value_t ArgError, IOError, KeyError, MemoryError;
|
||||||
static inline void argcount(char *fname, uint32_t nargs, uint32_t c)
|
static inline void argcount(char *fname, uint32_t nargs, uint32_t c)
|
||||||
{
|
{
|
||||||
if (__unlikely(nargs != c))
|
if (__unlikely(nargs != c))
|
||||||
|
@ -220,7 +220,7 @@ typedef struct {
|
||||||
#define cv_isstr(cv) (cv_class(cv)->eltype == bytetype)
|
#define cv_isstr(cv) (cv_class(cv)->eltype == bytetype)
|
||||||
|
|
||||||
#define cvalue_data(v) cv_data((cvalue_t*)ptr(v))
|
#define cvalue_data(v) cv_data((cvalue_t*)ptr(v))
|
||||||
#define value2c(type, v) (type)cv_data((cvalue_t*)ptr(v))
|
#define value2c(type, v) ((type)cv_data((cvalue_t*)ptr(v)))
|
||||||
|
|
||||||
#define valid_numtype(v) ((v) < N_NUMTYPES)
|
#define valid_numtype(v) ((v) < N_NUMTYPES)
|
||||||
#define cp_class(cp) ((cp)->type)
|
#define cp_class(cp) ((cp)->type)
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
#include "llt.h"
|
#include "llt.h"
|
||||||
#include "flisp.h"
|
#include "flisp.h"
|
||||||
|
|
||||||
static value_t iostreamsym, rdsym, wrsym, apsym, crsym, truncsym, instrsym;
|
static value_t iostreamsym, rdsym, wrsym, apsym, crsym, truncsym;
|
||||||
|
static value_t instrsym, outstrsym;
|
||||||
static fltype_t *iostreamtype;
|
static fltype_t *iostreamtype;
|
||||||
|
|
||||||
void print_iostream(value_t v, ios_t *f, int princ)
|
void print_iostream(value_t v, ios_t *f, int princ)
|
||||||
|
@ -60,13 +61,15 @@ value_t fl_file(value_t *args, uint32_t nargs)
|
||||||
{
|
{
|
||||||
if (nargs < 1)
|
if (nargs < 1)
|
||||||
argcount("file", nargs, 1);
|
argcount("file", nargs, 1);
|
||||||
int i, r=1, w=0, c=0, t=0, a=0;
|
int i, r=0, w=0, c=0, t=0, a=0;
|
||||||
for(i=1; i < (int)nargs; i++) {
|
for(i=1; i < (int)nargs; i++) {
|
||||||
if (args[i] == wrsym) w = 1;
|
if (args[i] == wrsym) w = 1;
|
||||||
else if (args[i] == apsym) a = 1;
|
else if (args[i] == apsym) { a = 1; w = 1; }
|
||||||
else if (args[i] == crsym) c = 1;
|
else if (args[i] == crsym) { c = 1; w = 1; }
|
||||||
else if (args[i] == truncsym) t = 1;
|
else if (args[i] == truncsym) { t = 1; w = 1; }
|
||||||
|
else if (args[i] == rdsym) r = 1;
|
||||||
}
|
}
|
||||||
|
if ((r|w|c|t|a) == 0) r = 1; // default to reading
|
||||||
value_t f = cvalue(iostreamtype, sizeof(ios_t));
|
value_t f = cvalue(iostreamtype, sizeof(ios_t));
|
||||||
char *fname = tostring(args[0], "file");
|
char *fname = tostring(args[0], "file");
|
||||||
ios_t *s = value2c(ios_t*, f);
|
ios_t *s = value2c(ios_t*, f);
|
||||||
|
@ -76,6 +79,17 @@ value_t fl_file(value_t *args, uint32_t nargs)
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t fl_memstream(value_t *args, u_int32_t nargs)
|
||||||
|
{
|
||||||
|
argcount("memstream", nargs, 0);
|
||||||
|
(void)args;
|
||||||
|
value_t f = cvalue(iostreamtype, sizeof(ios_t));
|
||||||
|
ios_t *s = value2c(ios_t*, f);
|
||||||
|
if (ios_mem(s, 0) == NULL)
|
||||||
|
lerror(MemoryError, "memstream: could not allocate stream");
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
value_t fl_read(value_t *args, u_int32_t nargs)
|
value_t fl_read(value_t *args, u_int32_t nargs)
|
||||||
{
|
{
|
||||||
if (nargs > 1) {
|
if (nargs > 1) {
|
||||||
|
@ -152,9 +166,84 @@ value_t fl_ioprinc(value_t *args, u_int32_t nargs)
|
||||||
return args[nargs-1];
|
return args[nargs-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
value_t fl_ioread(value_t *args, u_int32_t nargs)
|
||||||
|
{
|
||||||
|
if (nargs != 3)
|
||||||
|
argcount("io.read", nargs, 2);
|
||||||
|
(void)toiostream(args[0], "io.read");
|
||||||
|
size_t n;
|
||||||
|
fltype_t *ft;
|
||||||
|
if (nargs == 3) {
|
||||||
|
// form (io.read s type count)
|
||||||
|
ft = get_array_type(args[1]);
|
||||||
|
n = toulong(args[2], "io.read") * ft->elsz;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ft = get_type(args[1]);
|
||||||
|
if (ft->eltype != NULL && !iscons(cdr_(cdr_(args[1]))))
|
||||||
|
lerror(ArgError, "io.read: incomplete type");
|
||||||
|
n = ft->size;
|
||||||
|
}
|
||||||
|
value_t cv = cvalue(ft, n);
|
||||||
|
char *data;
|
||||||
|
if (iscvalue(cv)) data = cv_data((cvalue_t*)ptr(cv));
|
||||||
|
else data = cp_data((cprim_t*)ptr(cv));
|
||||||
|
size_t got = ios_read(value2c(ios_t*,args[0]), data, n);
|
||||||
|
if (got < n)
|
||||||
|
lerror(IOError, "io.read: end of input reached");
|
||||||
|
return cv;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get pointer and size for any plain-old-data value
|
||||||
|
static void to_sized_ptr(value_t v, char *fname, char **pdata, size_t *psz)
|
||||||
|
{
|
||||||
|
if (isiostream(v) && (value2c(ios_t*,v)->bm == bm_mem)) {
|
||||||
|
ios_t *x = value2c(ios_t*,v);
|
||||||
|
*pdata = x->buf;
|
||||||
|
*psz = x->size;
|
||||||
|
}
|
||||||
|
else if (iscvalue(v)) {
|
||||||
|
cvalue_t *pcv = (cvalue_t*)ptr(v);
|
||||||
|
*pdata = cv_data(pcv);
|
||||||
|
*psz = cv_len(pcv);
|
||||||
|
}
|
||||||
|
else if (iscprim(v)) {
|
||||||
|
cprim_t *pcp = (cprim_t*)ptr(v);
|
||||||
|
*pdata = cp_data(pcp);
|
||||||
|
*psz = cp_class(pcp)->size;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
type_error(fname, "byte stream", v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
value_t fl_iowrite(value_t *args, u_int32_t nargs)
|
||||||
|
{
|
||||||
|
argcount("io.write", nargs, 2);
|
||||||
|
ios_t *s = toiostream(args[0], "io.write");
|
||||||
|
char *data;
|
||||||
|
size_t sz;
|
||||||
|
to_sized_ptr(args[1], "io.write", &data, &sz);
|
||||||
|
size_t n = ios_write(s, data, sz);
|
||||||
|
return size_wrap(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
value_t fl_dump(value_t *args, u_int32_t nargs)
|
||||||
|
{
|
||||||
|
argcount("dump", nargs, 1);
|
||||||
|
ios_t *s = toiostream(symbol_value(outstrsym), "dump");
|
||||||
|
char *data;
|
||||||
|
size_t sz;
|
||||||
|
to_sized_ptr(args[0], "dump", &data, &sz);
|
||||||
|
hexdump(s, data, sz, 0);
|
||||||
|
return FL_T;
|
||||||
|
}
|
||||||
|
|
||||||
static builtinspec_t iostreamfunc_info[] = {
|
static builtinspec_t iostreamfunc_info[] = {
|
||||||
{ "iostream?", fl_iostreamp },
|
{ "iostream?", fl_iostreamp },
|
||||||
|
{ "dump", fl_dump },
|
||||||
{ "file", fl_file },
|
{ "file", fl_file },
|
||||||
|
{ "memstream", fl_memstream },
|
||||||
{ "read", fl_read },
|
{ "read", fl_read },
|
||||||
{ "io.print", fl_ioprint },
|
{ "io.print", fl_ioprint },
|
||||||
{ "io.princ", fl_ioprinc },
|
{ "io.princ", fl_ioprinc },
|
||||||
|
@ -163,6 +252,8 @@ static builtinspec_t iostreamfunc_info[] = {
|
||||||
{ "io.eof?" , fl_ioeof },
|
{ "io.eof?" , fl_ioeof },
|
||||||
{ "io.getc" , fl_iogetc },
|
{ "io.getc" , fl_iogetc },
|
||||||
{ "io.discardbuffer", fl_iopurge },
|
{ "io.discardbuffer", fl_iopurge },
|
||||||
|
{ "io.read", fl_ioread },
|
||||||
|
{ "io.write", fl_iowrite },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -175,6 +266,7 @@ void iostream_init()
|
||||||
crsym = symbol(":create");
|
crsym = symbol(":create");
|
||||||
truncsym = symbol(":truncate");
|
truncsym = symbol(":truncate");
|
||||||
instrsym = symbol("*input-stream*");
|
instrsym = symbol("*input-stream*");
|
||||||
|
outstrsym = symbol("*output-stream*");
|
||||||
iostreamtype = define_opaque_type(iostreamsym, sizeof(ios_t),
|
iostreamtype = define_opaque_type(iostreamsym, sizeof(ios_t),
|
||||||
&iostream_vtable, NULL);
|
&iostream_vtable, NULL);
|
||||||
assign_global_builtins(iostreamfunc_info);
|
assign_global_builtins(iostreamfunc_info);
|
||||||
|
|
|
@ -7,7 +7,7 @@ bq-process
|
||||||
|
|
||||||
(map-int (lambda (x) `(a b c d e)) 90)
|
(map-int (lambda (x) `(a b c d e)) 90)
|
||||||
|
|
||||||
(list-to-vector (map-int (lambda (x) `(a b c d e)) 90))
|
(list->vector (map-int (lambda (x) `(a b c d e)) 90))
|
||||||
|
|
||||||
'((lambda (x y) (if (< x y) x y)) (a b c) (d e f) 2 3 (r t y))
|
'((lambda (x y) (if (< x y) x y)) (a b c) (d e f) 2 3 (r t y))
|
||||||
|
|
||||||
|
|
|
@ -6,11 +6,7 @@
|
||||||
(if (not (bound? 'eq))
|
(if (not (bound? 'eq))
|
||||||
(begin
|
(begin
|
||||||
(set-constant! 'eq eq?)
|
(set-constant! 'eq eq?)
|
||||||
(set-constant! 'eqv eqv?)
|
(set-constant! 'equal equal?)))
|
||||||
(set-constant! 'equal equal?)
|
|
||||||
(set-constant! 'rplaca set-car!)
|
|
||||||
(set-constant! 'rplacd set-cdr!)
|
|
||||||
(set-constant! 'char? (lambda (x) (eq? (typeof x) 'wchar)))))
|
|
||||||
|
|
||||||
; convert a sequence of body statements to a single expression.
|
; convert a sequence of body statements to a single expression.
|
||||||
; this allows define, defun, defmacro, let, etc. to contain multiple
|
; this allows define, defun, defmacro, let, etc. to contain multiple
|
||||||
|
@ -69,8 +65,8 @@
|
||||||
((null? (cdr lsts)) (car lsts))
|
((null? (cdr lsts)) (car lsts))
|
||||||
((null? (car lsts)) (apply nconc (cdr lsts)))
|
((null? (car lsts)) (apply nconc (cdr lsts)))
|
||||||
(#t (prog1 (car lsts)
|
(#t (prog1 (car lsts)
|
||||||
(rplacd (last (car lsts))
|
(set-cdr! (last (car lsts))
|
||||||
(apply nconc (cdr lsts)))))))
|
(apply nconc (cdr lsts)))))))
|
||||||
|
|
||||||
(define (append . lsts)
|
(define (append . lsts)
|
||||||
(cond ((null? lsts) ())
|
(cond ((null? lsts) ())
|
||||||
|
@ -83,24 +79,24 @@
|
||||||
|
|
||||||
(define (member item lst)
|
(define (member item lst)
|
||||||
(cond ((atom? lst) #f)
|
(cond ((atom? lst) #f)
|
||||||
((equal (car lst) item) lst)
|
((equal? (car lst) item) lst)
|
||||||
(#t (member item (cdr lst)))))
|
(#t (member item (cdr lst)))))
|
||||||
(define (memq item lst)
|
(define (memq item lst)
|
||||||
(cond ((atom? lst) #f)
|
(cond ((atom? lst) #f)
|
||||||
((eq (car lst) item) lst)
|
((eq? (car lst) item) lst)
|
||||||
(#t (memq item (cdr lst)))))
|
(#t (memq item (cdr lst)))))
|
||||||
(define (memv item lst)
|
(define (memv item lst)
|
||||||
(cond ((atom? lst) #f)
|
(cond ((atom? lst) #f)
|
||||||
((eqv (car lst) item) lst)
|
((eqv? (car lst) item) lst)
|
||||||
(#t (memv item (cdr lst)))))
|
(#t (memv item (cdr lst)))))
|
||||||
|
|
||||||
(define (assoc item lst)
|
(define (assoc item lst)
|
||||||
(cond ((atom? lst) #f)
|
(cond ((atom? lst) #f)
|
||||||
((equal (caar lst) item) (car lst))
|
((equal? (caar lst) item) (car lst))
|
||||||
(#t (assoc item (cdr lst)))))
|
(#t (assoc item (cdr lst)))))
|
||||||
(define (assv item lst)
|
(define (assv item lst)
|
||||||
(cond ((atom? lst) #f)
|
(cond ((atom? lst) #f)
|
||||||
((eqv (caar lst) item) (car lst))
|
((eqv? (caar lst) item) (car lst))
|
||||||
(#t (assv item (cdr lst)))))
|
(#t (assv item (cdr lst)))))
|
||||||
|
|
||||||
(define (macrocall? e) (and (symbol? (car e))
|
(define (macrocall? e) (and (symbol? (car e))
|
||||||
|
@ -192,9 +188,9 @@
|
||||||
|
|
||||||
(define (expand x) (macroexpand x))
|
(define (expand x) (macroexpand x))
|
||||||
|
|
||||||
(define = eqv)
|
(define = eqv?)
|
||||||
(define eql eqv)
|
(define eql eqv?)
|
||||||
(define (/= a b) (not (eqv a b)))
|
(define (/= a b) (not (eqv? a b)))
|
||||||
(define != /=)
|
(define != /=)
|
||||||
(define (> a b) (< b a))
|
(define (> a b) (< b a))
|
||||||
(define (<= a b) (not (< b a)))
|
(define (<= a b) (not (< b a)))
|
||||||
|
@ -205,6 +201,7 @@
|
||||||
(define remainder mod)
|
(define remainder mod)
|
||||||
(define (abs x) (if (< x 0) (- x) x))
|
(define (abs x) (if (< x 0) (- x) x))
|
||||||
(define (identity x) x)
|
(define (identity x) x)
|
||||||
|
(define (char? x) (eq? (typeof x) 'wchar))
|
||||||
(define K prog1) ; K combinator ;)
|
(define K prog1) ; K combinator ;)
|
||||||
(define begin0 prog1)
|
(define begin0 prog1)
|
||||||
|
|
||||||
|
@ -250,7 +247,7 @@
|
||||||
(define (nlist* . l)
|
(define (nlist* . l)
|
||||||
(if (atom? (cdr l))
|
(if (atom? (cdr l))
|
||||||
(car l)
|
(car l)
|
||||||
(rplacd l (apply nlist* (cdr l)))))
|
(set-cdr! l (apply nlist* (cdr l)))))
|
||||||
|
|
||||||
(define (lastcdr l)
|
(define (lastcdr l)
|
||||||
(if (atom? l) l
|
(if (atom? l) l
|
||||||
|
@ -265,7 +262,7 @@
|
||||||
(define (map! f lst)
|
(define (map! f lst)
|
||||||
(prog1 lst
|
(prog1 lst
|
||||||
(while (pair? lst)
|
(while (pair? lst)
|
||||||
(rplaca lst (f (car lst)))
|
(set-car! lst (f (car lst)))
|
||||||
(set! lst (cdr lst)))))
|
(set! lst (cdr lst)))))
|
||||||
|
|
||||||
(define (mapcar f . lsts)
|
(define (mapcar f . lsts)
|
||||||
|
@ -318,8 +315,8 @@
|
||||||
(let ((prev ()))
|
(let ((prev ()))
|
||||||
(while (pair? l)
|
(while (pair? l)
|
||||||
(set! l (prog1 (cdr l)
|
(set! l (prog1 (cdr l)
|
||||||
(rplacd l (prog1 prev
|
(set-cdr! l (prog1 prev
|
||||||
(set! prev l))))))
|
(set! prev l))))))
|
||||||
prev))
|
prev))
|
||||||
|
|
||||||
(define-macro (let* binds . body)
|
(define-macro (let* binds . body)
|
||||||
|
@ -336,8 +333,8 @@
|
||||||
(define (revappend l1 l2) (nconc (reverse l1) l2))
|
(define (revappend l1 l2) (nconc (reverse l1) l2))
|
||||||
(define (nreconc l1 l2) (nconc (nreverse l1) l2))
|
(define (nreconc l1 l2) (nconc (nreverse l1) l2))
|
||||||
|
|
||||||
(define (list-to-vector l) (apply vector l))
|
(define (list->vector l) (apply vector l))
|
||||||
(define (vector-to-list v)
|
(define (vector->list v)
|
||||||
(let ((n (length v))
|
(let ((n (length v))
|
||||||
(l ()))
|
(l ()))
|
||||||
(for 1 n
|
(for 1 n
|
||||||
|
@ -362,7 +359,7 @@
|
||||||
(define (bq-process x)
|
(define (bq-process x)
|
||||||
(cond ((self-evaluating? x)
|
(cond ((self-evaluating? x)
|
||||||
(if (vector? x)
|
(if (vector? x)
|
||||||
(let ((body (bq-process (vector-to-list x))))
|
(let ((body (bq-process (vector->list x))))
|
||||||
(if (eq (car body) 'list)
|
(if (eq (car body) 'list)
|
||||||
(cons vector (cdr body))
|
(cons vector (cdr body))
|
||||||
(list apply vector body)))
|
(list apply vector body)))
|
||||||
|
@ -408,7 +405,7 @@
|
||||||
(list 'quote v)))
|
(list 'quote v)))
|
||||||
|
|
||||||
(define-macro (case key . clauses)
|
(define-macro (case key . clauses)
|
||||||
(define (vals-to-cond key v)
|
(define (vals->cond key v)
|
||||||
(cond ((eq? v 'else) 'else)
|
(cond ((eq? v 'else) 'else)
|
||||||
((null? v) #f)
|
((null? v) #f)
|
||||||
((null? (cdr v)) `(eqv? ,key ,(quote-value (car v))))
|
((null? (cdr v)) `(eqv? ,key ,(quote-value (car v))))
|
||||||
|
@ -416,7 +413,7 @@
|
||||||
(let ((g (gensym)))
|
(let ((g (gensym)))
|
||||||
`(let ((,g ,key))
|
`(let ((,g ,key))
|
||||||
(cond ,@(map (lambda (clause)
|
(cond ,@(map (lambda (clause)
|
||||||
(cons (vals-to-cond g (car clause))
|
(cons (vals->cond g (car clause))
|
||||||
(cdr clause)))
|
(cdr clause)))
|
||||||
clauses)))))
|
clauses)))))
|
||||||
|
|
||||||
|
@ -453,7 +450,7 @@
|
||||||
(set! acc first)
|
(set! acc first)
|
||||||
(for 1 (- n 1)
|
(for 1 (- n 1)
|
||||||
(lambda (i)
|
(lambda (i)
|
||||||
(begin (rplacd acc (cons (f i) ()))
|
(begin (set-cdr! acc (cons (f i) ()))
|
||||||
(set! acc (cdr acc)))))
|
(set! acc (cdr acc)))))
|
||||||
first)))
|
first)))
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@
|
||||||
(lambda (acc i n)
|
(lambda (acc i n)
|
||||||
(if (= i n)
|
(if (= i n)
|
||||||
first
|
first
|
||||||
(begin (rplacd acc (cons (f i) ()))
|
(begin (set-cdr! acc (cons (f i) ()))
|
||||||
(map-int- (cdr acc) (+ i 1) n)))))
|
(map-int- (cdr acc) (+ i 1) n)))))
|
||||||
first 1 n))))
|
first 1 n))))
|
||||||
|
|
||||||
|
@ -116,8 +116,8 @@
|
||||||
; swap the cars and cdrs of every cons in a structure
|
; swap the cars and cdrs of every cons in a structure
|
||||||
(define (swapad c)
|
(define (swapad c)
|
||||||
(if (atom? c) c
|
(if (atom? c) c
|
||||||
(rplacd c (K (swapad (car c))
|
(set-cdr! c (K (swapad (car c))
|
||||||
(rplaca c (swapad (cdr c)))))))
|
(set-car! c (swapad (cdr c)))))))
|
||||||
|
|
||||||
(define (without x l)
|
(define (without x l)
|
||||||
(filter (lambda (e) (not (eq e x))) l))
|
(filter (lambda (e) (not (eq e x))) l))
|
||||||
|
@ -202,7 +202,7 @@
|
||||||
(set! ,first ,acc)
|
(set! ,first ,acc)
|
||||||
(while ,cnd
|
(while ,cnd
|
||||||
(begin (set! ,acc
|
(begin (set! ,acc
|
||||||
(cdr (rplacd ,acc (cons ,what ()))))
|
(cdr (set-cdr! ,acc (cons ,what ()))))
|
||||||
,@body))
|
,@body))
|
||||||
(cdr ,first))))
|
(cdr ,first))))
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@
|
||||||
(for ,lo ,hi
|
(for ,lo ,hi
|
||||||
(lambda (,var)
|
(lambda (,var)
|
||||||
(begin (set! ,acc
|
(begin (set! ,acc
|
||||||
(cdr (rplacd ,acc (cons ,what ()))))
|
(cdr (set-cdr! ,acc (cons ,what ()))))
|
||||||
,@body)))
|
,@body)))
|
||||||
(cdr ,first))))
|
(cdr ,first))))
|
||||||
|
|
||||||
|
|
|
@ -848,15 +848,15 @@ IOStream API
|
||||||
*princ
|
*princ
|
||||||
*file
|
*file
|
||||||
iostream - (stream[ cvalue-as-bytestream])
|
iostream - (stream[ cvalue-as-bytestream])
|
||||||
memstream
|
*memstream
|
||||||
fifo
|
fifo
|
||||||
socket
|
socket
|
||||||
*io.eof
|
*io.eof
|
||||||
*io.flush
|
*io.flush
|
||||||
*io.close
|
*io.close
|
||||||
*io.discardbuffer
|
*io.discardbuffer
|
||||||
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.copy - (io.copy to from [nbytes])
|
io.copy - (io.copy to from [nbytes])
|
||||||
|
@ -865,7 +865,7 @@ IOStream API
|
||||||
io.seek - (io.seek s offset)
|
io.seek - (io.seek s offset)
|
||||||
io.seekend - move to end of stream
|
io.seekend - move to end of stream
|
||||||
io.trunc
|
io.trunc
|
||||||
io.tostring! - destructively convert stringstream to string
|
io.read! - destructively take data
|
||||||
io.readlines
|
io.readlines
|
||||||
io.readall
|
io.readall
|
||||||
print-to-string
|
print-to-string
|
||||||
|
|
|
@ -41,6 +41,10 @@ fltype_t *get_type(value_t t)
|
||||||
if (iscons(t)) {
|
if (iscons(t)) {
|
||||||
if (isarray) {
|
if (isarray) {
|
||||||
fltype_t *eltype = get_type(car_(cdr_(t)));
|
fltype_t *eltype = get_type(car_(cdr_(t)));
|
||||||
|
if (eltype->size == 0) {
|
||||||
|
free(ft);
|
||||||
|
lerror(ArgError, "invalid array element type");
|
||||||
|
}
|
||||||
ft->elsz = eltype->size;
|
ft->elsz = eltype->size;
|
||||||
ft->eltype = eltype;
|
ft->eltype = eltype;
|
||||||
ft->init = &cvalue_array_init;
|
ft->init = &cvalue_array_init;
|
||||||
|
|
14
llt/ios.c
14
llt/ios.c
|
@ -328,6 +328,7 @@ static void _write_update_pos(ios_t *s)
|
||||||
|
|
||||||
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 (s->readonly) return 0;
|
||||||
if (n == 0) return 0;
|
if (n == 0) return 0;
|
||||||
size_t space;
|
size_t space;
|
||||||
size_t wrote = 0;
|
size_t wrote = 0;
|
||||||
|
@ -566,7 +567,8 @@ int ios_setbuf(ios_t *s, char *buf, size_t size, int own)
|
||||||
size_t nvalid=0;
|
size_t nvalid=0;
|
||||||
|
|
||||||
nvalid = (size < s->size) ? size : s->size;
|
nvalid = (size < s->size) ? size : s->size;
|
||||||
memcpy(buf, s->buf, nvalid);
|
if (nvalid > 0)
|
||||||
|
memcpy(buf, s->buf, nvalid);
|
||||||
if (s->bpos > nvalid) {
|
if (s->bpos > nvalid) {
|
||||||
// truncated
|
// truncated
|
||||||
s->bpos = nvalid;
|
s->bpos = nvalid;
|
||||||
|
@ -590,6 +592,14 @@ int ios_bufmode(ios_t *s, bufmode_t mode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ios_set_readonly(ios_t *s)
|
||||||
|
{
|
||||||
|
if (s->readonly) return;
|
||||||
|
ios_flush(s);
|
||||||
|
s->state = bst_none;
|
||||||
|
s->readonly = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void ios_bswap(ios_t *s, int bswap)
|
void ios_bswap(ios_t *s, int bswap)
|
||||||
{
|
{
|
||||||
s->byteswap = !!bswap;
|
s->byteswap = !!bswap;
|
||||||
|
@ -645,6 +655,8 @@ ios_t *ios_file(ios_t *s, char *fname, int rd, int wr, int create, int trunc)
|
||||||
goto open_file_err;
|
goto open_file_err;
|
||||||
s = ios_fd(s, fd, 1);
|
s = ios_fd(s, fd, 1);
|
||||||
s->ownfd = 1;
|
s->ownfd = 1;
|
||||||
|
if (!wr)
|
||||||
|
s->readonly = 1;
|
||||||
return s;
|
return s;
|
||||||
open_file_err:
|
open_file_err:
|
||||||
s->fd = -1;
|
s->fd = -1;
|
||||||
|
|
|
@ -38,7 +38,7 @@ typedef struct {
|
||||||
long fd;
|
long fd;
|
||||||
|
|
||||||
unsigned char byteswap:1;
|
unsigned char byteswap:1;
|
||||||
//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;
|
unsigned char _eof:1;
|
||||||
|
@ -76,6 +76,7 @@ char *ios_takebuf(ios_t *s, size_t *psize); // release buffer to caller
|
||||||
// set buffer space to use
|
// set buffer space to use
|
||||||
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_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);
|
||||||
|
|
Loading…
Reference in New Issue