X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Flisp%2Fao_lisp_cons.c;h=7d3ca68d6a7134914459791faaf283359264345a;hb=d8cf97fe22acefab40d7bb321138e46d4483fef7;hp=65908e30a610ea0f2b706eb17e314a9db1b2866d;hpb=d2408e72d1e0d3459918601712b09860ab17e200;p=fw%2Faltos diff --git a/src/lisp/ao_lisp_cons.c b/src/lisp/ao_lisp_cons.c index 65908e30..7d3ca68d 100644 --- a/src/lisp/ao_lisp_cons.c +++ b/src/lisp/ao_lisp_cons.c @@ -14,6 +14,8 @@ #include "ao_lisp.h" +#define OFFSET(a) ((int) ((uint8_t *) (a) - ao_lisp_const)) + static void cons_mark(void *addr) { struct ao_lisp_cons *cons = addr; @@ -38,16 +40,14 @@ static void cons_move(void *addr) { struct ao_lisp_cons *cons = addr; - for (;;) { - struct ao_lisp_cons *cdr; + if (!cons) + return; - cons->car = ao_lisp_poly_move(cons->car); - cdr = ao_lisp_poly_cons(cons->cdr); - cdr = ao_lisp_move_memory(cdr, sizeof (struct ao_lisp_cons)); - if (!cdr) + for (;;) { + (void) ao_lisp_poly_move(&cons->car); + if (ao_lisp_poly_move(&cons->cdr)) break; - cons->cdr = ao_lisp_cons_poly(cdr); - cons = cdr; + cons = ao_lisp_poly_cons(cons->cdr); } } @@ -83,3 +83,14 @@ ao_lisp_cons_print(ao_poly c) } printf(")"); } + +void +ao_lisp_cons_patom(ao_poly c) +{ + struct ao_lisp_cons *cons = ao_lisp_poly_cons(c); + + while (cons) { + ao_lisp_poly_patom(cons->car); + cons = ao_lisp_poly_cons(cons->cdr); + } +}