+ao_poly
+ao_lisp_string_pack(struct ao_lisp_cons *cons)
+{
+ int len = ao_lisp_cons_length(cons);
+ ao_lisp_cons_stash(0, cons);
+ char *r = ao_lisp_alloc(len + 1);
+ cons = ao_lisp_cons_fetch(0);
+ char *s = r;
+
+ while (cons) {
+ if (ao_lisp_poly_type(cons->car) != AO_LISP_INT)
+ return ao_lisp_error(AO_LISP_INVALID, "non-int passed to pack");
+ *s++ = ao_lisp_poly_int(cons->car);
+ cons = ao_lisp_poly_cons(cons->cdr);
+ }
+ *s++ = 0;
+ return ao_lisp_string_poly(r);
+}
+
+ao_poly
+ao_lisp_string_unpack(char *a)
+{
+ struct ao_lisp_cons *cons = NULL, *tail = NULL;
+ int c;
+ int i;
+
+ for (i = 0; (c = a[i]); i++) {
+ ao_lisp_cons_stash(0, cons);
+ ao_lisp_cons_stash(1, tail);
+ ao_lisp_string_stash(0, a);
+ struct ao_lisp_cons *n = ao_lisp_cons_cons(ao_lisp_int_poly(c), NULL);
+ cons = ao_lisp_cons_fetch(0);
+ tail = ao_lisp_cons_fetch(1);
+ a = ao_lisp_string_fetch(0);
+
+ if (!n) {
+ cons = NULL;
+ break;
+ }
+ if (tail)
+ tail->cdr = ao_lisp_cons_poly(n);
+ else
+ cons = n;
+ tail = n;
+ }
+ return ao_lisp_cons_poly(cons);
+}