+struct ao_lisp_cons *ao_lisp_read_cons;
+struct ao_lisp_cons *ao_lisp_read_cons_tail;
+struct ao_lisp_cons *ao_lisp_read_stack;
+
+#define READ_IN_QUOTE 0x01
+#define READ_SAW_DOT 0x02
+#define READ_DONE_DOT 0x04
+
+static int
+push_read_stack(int cons, int read_state)
+{
+ RDBGI("push read stack %p 0x%x\n", ao_lisp_read_cons, read_state);
+ RDBG_IN();
+ if (cons) {
+ ao_lisp_read_stack = ao_lisp_cons_cons(ao_lisp_cons_poly(ao_lisp_read_cons),
+ ao_lisp__cons(ao_lisp_int_poly(read_state),
+ ao_lisp_cons_poly(ao_lisp_read_stack)));
+ if (!ao_lisp_read_stack)
+ return 0;
+ }
+ ao_lisp_read_cons = NULL;
+ ao_lisp_read_cons_tail = NULL;
+ return 1;
+}
+
+static int
+pop_read_stack(int cons)
+{
+ int read_state = 0;
+ if (cons) {
+ ao_lisp_read_cons = ao_lisp_poly_cons(ao_lisp_read_stack->car);
+ ao_lisp_read_stack = ao_lisp_poly_cons(ao_lisp_read_stack->cdr);
+ read_state = ao_lisp_poly_int(ao_lisp_read_stack->car);
+ ao_lisp_read_stack = ao_lisp_poly_cons(ao_lisp_read_stack->cdr);
+ for (ao_lisp_read_cons_tail = ao_lisp_read_cons;
+ ao_lisp_read_cons_tail && ao_lisp_read_cons_tail->cdr;
+ ao_lisp_read_cons_tail = ao_lisp_poly_cons(ao_lisp_read_cons_tail->cdr))
+ ;
+ } else {
+ ao_lisp_read_cons = 0;
+ ao_lisp_read_cons_tail = 0;
+ ao_lisp_read_stack = 0;
+ }
+ RDBG_OUT();
+ RDBGI("pop read stack %p %d\n", ao_lisp_read_cons, read_state);
+ return read_state;
+}
+
+ao_poly
+ao_lisp_read(void)