adding *print-level* and *print-length*
fixing open-string-output-port (R6RS) making io.tostring! more consistent adding newlines to boot file; wastes space but will allow more efficient diffing
This commit is contained in:
parent
43b6029727
commit
9ed9a51786
|
@ -98,7 +98,10 @@
|
||||||
(io.seek b 0)
|
(io.seek b 0)
|
||||||
b))
|
b))
|
||||||
(define (open-output-string) (buffer))
|
(define (open-output-string) (buffer))
|
||||||
(define open-string-output-port open-output-string)
|
(define (open-string-output-port)
|
||||||
|
(let ((b (buffer)))
|
||||||
|
(values b (lambda () (io.tostring! b)))))
|
||||||
|
|
||||||
(define (get-output-string b)
|
(define (get-output-string b)
|
||||||
(let ((p (io.pos b)))
|
(let ((p (io.pos b)))
|
||||||
(io.seek b 0)
|
(io.seek b 0)
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -92,7 +92,8 @@ static uint32_t N_GCHND = 0;
|
||||||
value_t FL_NIL, FL_T, FL_F, FL_EOF, QUOTE;
|
value_t FL_NIL, FL_T, FL_F, FL_EOF, QUOTE;
|
||||||
value_t IOError, ParseError, TypeError, ArgError, UnboundError, MemoryError;
|
value_t IOError, ParseError, TypeError, ArgError, UnboundError, MemoryError;
|
||||||
value_t DivideError, BoundsError, Error, KeyError, EnumerationError;
|
value_t DivideError, BoundsError, Error, KeyError, EnumerationError;
|
||||||
value_t printwidthsym, printreadablysym, printprettysym;
|
value_t printwidthsym, printreadablysym, printprettysym, printlengthsym;
|
||||||
|
value_t printlevelsym;
|
||||||
|
|
||||||
static value_t NIL, LAMBDA, IF, TRYCATCH;
|
static value_t NIL, LAMBDA, IF, TRYCATCH;
|
||||||
static value_t BACKQUOTE, COMMA, COMMAAT, COMMADOT, FUNCTION;
|
static value_t BACKQUOTE, COMMA, COMMAAT, COMMADOT, FUNCTION;
|
||||||
|
@ -2135,6 +2136,8 @@ static void lisp_init(void)
|
||||||
set(printprettysym=symbol("*print-pretty*"), FL_T);
|
set(printprettysym=symbol("*print-pretty*"), FL_T);
|
||||||
set(printreadablysym=symbol("*print-readably*"), FL_T);
|
set(printreadablysym=symbol("*print-readably*"), FL_T);
|
||||||
set(printwidthsym=symbol("*print-width*"), fixnum(SCR_WIDTH));
|
set(printwidthsym=symbol("*print-width*"), fixnum(SCR_WIDTH));
|
||||||
|
set(printlengthsym=symbol("*print-length*"), FL_F);
|
||||||
|
set(printlevelsym=symbol("*print-level*"), FL_F);
|
||||||
lasterror = NIL;
|
lasterror = NIL;
|
||||||
i = 0;
|
i = 0;
|
||||||
for (i=OP_EQ; i <= OP_ASET; i++) {
|
for (i=OP_EQ; i <= OP_ASET; i++) {
|
||||||
|
|
|
@ -361,6 +361,7 @@ value_t stream_to_string(value_t *ps)
|
||||||
n = st->size;
|
n = st->size;
|
||||||
str = cvalue_string(n);
|
str = cvalue_string(n);
|
||||||
memcpy(cvalue_data(str), value2c(ios_t*,*ps)->buf, n);
|
memcpy(cvalue_data(str), value2c(ios_t*,*ps)->buf, n);
|
||||||
|
ios_trunc(st, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char *b = ios_takebuf(st, &n); n--;
|
char *b = ios_takebuf(st, &n); n--;
|
||||||
|
|
|
@ -4,6 +4,9 @@ static htable_t printconses;
|
||||||
static u_int32_t printlabel;
|
static u_int32_t printlabel;
|
||||||
static int print_pretty;
|
static int print_pretty;
|
||||||
static int print_princ;
|
static int print_princ;
|
||||||
|
static fixnum_t print_length;
|
||||||
|
static fixnum_t print_level;
|
||||||
|
static fixnum_t P_LEVEL;
|
||||||
static int SCR_WIDTH = 80;
|
static int SCR_WIDTH = 80;
|
||||||
|
|
||||||
static int HPOS=0, VPOS;
|
static int HPOS=0, VPOS;
|
||||||
|
@ -281,10 +284,14 @@ static void print_pair(ios_t *f, value_t v)
|
||||||
int after2 = indentafter2(head, v);
|
int after2 = indentafter2(head, v);
|
||||||
int n_unindented = 1;
|
int n_unindented = 1;
|
||||||
while (1) {
|
while (1) {
|
||||||
|
cd = cdr_(v);
|
||||||
|
if (print_length >= 0 && n >= print_length && cd!=NIL) {
|
||||||
|
outsn("...)", f, 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
lastv = VPOS;
|
lastv = VPOS;
|
||||||
unmark_cons(v);
|
unmark_cons(v);
|
||||||
fl_print_child(f, car_(v));
|
fl_print_child(f, car_(v));
|
||||||
cd = cdr_(v);
|
|
||||||
if (!iscons(cd) || ptrhash_has(&printconses, (void*)cd)) {
|
if (!iscons(cd) || ptrhash_has(&printconses, (void*)cd)) {
|
||||||
if (cd != NIL) {
|
if (cd != NIL) {
|
||||||
outsn(" . ", f, 3);
|
outsn(" . ", f, 3);
|
||||||
|
@ -364,6 +371,12 @@ static int print_circle_prefix(ios_t *f, value_t v)
|
||||||
void fl_print_child(ios_t *f, value_t v)
|
void fl_print_child(ios_t *f, value_t v)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
if (print_level >= 0 && P_LEVEL >= print_level &&
|
||||||
|
(iscons(v) || isvector(v) || isclosure(v))) {
|
||||||
|
outc('#', f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
P_LEVEL++;
|
||||||
|
|
||||||
switch (tag(v)) {
|
switch (tag(v)) {
|
||||||
case TAG_NUM :
|
case TAG_NUM :
|
||||||
|
@ -400,7 +413,7 @@ void fl_print_child(ios_t *f, value_t v)
|
||||||
else {
|
else {
|
||||||
assert(isclosure(v));
|
assert(isclosure(v));
|
||||||
if (!print_princ) {
|
if (!print_princ) {
|
||||||
if (print_circle_prefix(f, v)) return;
|
if (print_circle_prefix(f, v)) break;
|
||||||
function_t *fn = (function_t*)ptr(v);
|
function_t *fn = (function_t*)ptr(v);
|
||||||
outs("#fn(", f);
|
outs("#fn(", f);
|
||||||
char *data = cvalue_data(fn->bcode);
|
char *data = cvalue_data(fn->bcode);
|
||||||
|
@ -430,12 +443,16 @@ void fl_print_child(ios_t *f, value_t v)
|
||||||
if (v == UNBOUND) { outs("#<undefined>", f); break; }
|
if (v == UNBOUND) { outs("#<undefined>", f); break; }
|
||||||
case TAG_VECTOR:
|
case TAG_VECTOR:
|
||||||
case TAG_CONS:
|
case TAG_CONS:
|
||||||
if (print_circle_prefix(f, v)) return;
|
if (print_circle_prefix(f, v)) break;
|
||||||
if (isvector(v)) {
|
if (isvector(v)) {
|
||||||
outc('[', f);
|
outc('[', f);
|
||||||
int newindent = HPOS, est;
|
int newindent = HPOS, est;
|
||||||
int i, sz = vector_size(v);
|
int i, sz = vector_size(v);
|
||||||
for(i=0; i < sz; i++) {
|
for(i=0; i < sz; i++) {
|
||||||
|
if (print_length >= 0 && i >= print_length && i < sz-1) {
|
||||||
|
outsn("...", f, 3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
fl_print_child(f, vector_elt(v,i));
|
fl_print_child(f, vector_elt(v,i));
|
||||||
if (i < sz-1) {
|
if (i < sz-1) {
|
||||||
if (!print_pretty) {
|
if (!print_pretty) {
|
||||||
|
@ -463,6 +480,7 @@ void fl_print_child(ios_t *f, value_t v)
|
||||||
print_pair(f, v);
|
print_pair(f, v);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
P_LEVEL--;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_string(ios_t *f, char *str, size_t sz)
|
static void print_string(ios_t *f, char *str, size_t sz)
|
||||||
|
@ -720,11 +738,24 @@ void print(ios_t *f, value_t v)
|
||||||
if (print_pretty)
|
if (print_pretty)
|
||||||
set_print_width();
|
set_print_width();
|
||||||
print_princ = (symbol_value(printreadablysym) == FL_F);
|
print_princ = (symbol_value(printreadablysym) == FL_F);
|
||||||
|
|
||||||
|
value_t pl = symbol_value(printlengthsym);
|
||||||
|
if (isfixnum(pl)) print_length = numval(pl);
|
||||||
|
else print_length = -1;
|
||||||
|
pl = symbol_value(printlevelsym);
|
||||||
|
if (isfixnum(pl)) print_level = numval(pl);
|
||||||
|
else print_level = -1;
|
||||||
|
P_LEVEL = 0;
|
||||||
|
|
||||||
printlabel = 0;
|
printlabel = 0;
|
||||||
print_traverse(v);
|
print_traverse(v);
|
||||||
HPOS = VPOS = 0;
|
HPOS = VPOS = 0;
|
||||||
|
|
||||||
fl_print_child(f, v);
|
fl_print_child(f, v);
|
||||||
|
|
||||||
|
if (print_level >= 0 || print_length >= 0) {
|
||||||
|
bitvector_fill(consflags, 0, 0, heapsize/sizeof(cons_t));
|
||||||
|
}
|
||||||
|
|
||||||
htable_reset(&printconses, 32);
|
htable_reset(&printconses, 32);
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,12 +727,11 @@
|
||||||
ex-nondefs)))))
|
ex-nondefs)))))
|
||||||
|
|
||||||
(define (expand-lambda-list l env)
|
(define (expand-lambda-list l env)
|
||||||
(nconc
|
(if (atom? l) l
|
||||||
(map (lambda (x) (if (and (pair? x) (pair? (cdr x)))
|
(cons (if (and (pair? (car l)) (pair? (cdr (car l))))
|
||||||
(list (car x) (expand-in (cadr x) env))
|
(list (caar l) (expand-in (cadar l) env))
|
||||||
x))
|
(car l))
|
||||||
l)
|
(expand-lambda-list (cdr l) env))))
|
||||||
(lastcdr l)))
|
|
||||||
|
|
||||||
(define (l-vars l)
|
(define (l-vars l)
|
||||||
(cond ((atom? l) (list l))
|
(cond ((atom? l) (list l))
|
||||||
|
@ -951,7 +950,7 @@
|
||||||
(let ((f (file fname :write :create :truncate))
|
(let ((f (file fname :write :create :truncate))
|
||||||
(excludes '(*linefeed* *directory-separator* *argv* that
|
(excludes '(*linefeed* *directory-separator* *argv* that
|
||||||
*print-pretty* *print-width* *print-readably*)))
|
*print-pretty* *print-width* *print-readably*)))
|
||||||
(with-bindings ((*print-pretty* #f)
|
(with-bindings ((*print-pretty* #t)
|
||||||
(*print-readably* #t))
|
(*print-readably* #t))
|
||||||
(let ((syms
|
(let ((syms
|
||||||
(filter (lambda (s)
|
(filter (lambda (s)
|
||||||
|
|
|
@ -887,6 +887,8 @@ IOStream API
|
||||||
*princ-to-string
|
*princ-to-string
|
||||||
|
|
||||||
|
|
||||||
|
path.exists?
|
||||||
|
path.dir?
|
||||||
path.combine
|
path.combine
|
||||||
path.parts
|
path.parts
|
||||||
path.absolute
|
path.absolute
|
||||||
|
|
|
@ -122,40 +122,6 @@ void bitvector_shl_to(u_int32_t *dest, u_int32_t *b, size_t n, u_int32_t s,
|
||||||
dest[i] = sc;
|
dest[i] = sc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set nbits to c, starting at given bit offset
|
|
||||||
// assumes offs < 32
|
|
||||||
void bitvector_fill(u_int32_t *b, u_int32_t offs, u_int32_t c, u_int32_t nbits)
|
|
||||||
{
|
|
||||||
index_t i;
|
|
||||||
u_int32_t nw, tail;
|
|
||||||
u_int32_t mask;
|
|
||||||
|
|
||||||
if (nbits == 0) return;
|
|
||||||
nw = (offs+nbits+31)>>5;
|
|
||||||
|
|
||||||
if (nw == 1) {
|
|
||||||
mask = (lomask(nbits)<<offs);
|
|
||||||
if (c) b[0]|=mask; else b[0]&=(~mask);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mask = lomask(offs);
|
|
||||||
if (c) b[0]|=(~mask); else b[0]&=mask;
|
|
||||||
|
|
||||||
if (c) mask=ONES32; else mask = 0;
|
|
||||||
for(i=1; i < nw-1; i++)
|
|
||||||
b[i] = mask;
|
|
||||||
|
|
||||||
tail = (offs+nbits)&31;
|
|
||||||
if (tail==0) {
|
|
||||||
b[i] = mask;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
mask = lomask(tail);
|
|
||||||
if (c) b[i]|=mask; else b[i]&=(~mask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void bitvector_not(u_int32_t *b, u_int32_t offs, u_int32_t nbits)
|
void bitvector_not(u_int32_t *b, u_int32_t offs, u_int32_t nbits)
|
||||||
{
|
{
|
||||||
index_t i;
|
index_t i;
|
||||||
|
|
|
@ -72,3 +72,37 @@ u_int32_t bitvector_get(u_int32_t *b, u_int64_t n)
|
||||||
{
|
{
|
||||||
return b[n>>5] & (1<<(n&31));
|
return b[n>>5] & (1<<(n&31));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set nbits to c, starting at given bit offset
|
||||||
|
// assumes offs < 32
|
||||||
|
void bitvector_fill(u_int32_t *b, u_int32_t offs, u_int32_t c, u_int32_t nbits)
|
||||||
|
{
|
||||||
|
index_t i;
|
||||||
|
u_int32_t nw, tail;
|
||||||
|
u_int32_t mask;
|
||||||
|
|
||||||
|
if (nbits == 0) return;
|
||||||
|
nw = (offs+nbits+31)>>5;
|
||||||
|
|
||||||
|
if (nw == 1) {
|
||||||
|
mask = (lomask(nbits)<<offs);
|
||||||
|
if (c) b[0]|=mask; else b[0]&=(~mask);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mask = lomask(offs);
|
||||||
|
if (c) b[0]|=(~mask); else b[0]&=mask;
|
||||||
|
|
||||||
|
if (c) mask=ONES32; else mask = 0;
|
||||||
|
for(i=1; i < nw-1; i++)
|
||||||
|
b[i] = mask;
|
||||||
|
|
||||||
|
tail = (offs+nbits)&31;
|
||||||
|
if (tail==0) {
|
||||||
|
b[i] = mask;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mask = lomask(tail);
|
||||||
|
if (c) b[i]|=mask; else b[i]&=(~mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue