2 * Copyright © 2016 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
20 static void string_mark(void *addr)
25 static int string_size(void *addr)
29 return strlen(addr) + 1;
32 static void string_move(void *addr)
37 const struct ao_lisp_type ao_lisp_string_type = {
45 ao_lisp_string_copy(char *a)
49 ao_lisp_string_stash(0, a);
50 char *r = ao_lisp_alloc(alen + 1);
51 a = ao_lisp_string_fetch(0);
59 ao_lisp_string_cat(char *a, char *b)
64 ao_lisp_string_stash(0, a);
65 ao_lisp_string_stash(1, b);
66 char *r = ao_lisp_alloc(alen + blen + 1);
67 a = ao_lisp_string_fetch(0);
68 b = ao_lisp_string_fetch(1);
77 ao_lisp_string_pack(struct ao_lisp_cons *cons)
79 int len = ao_lisp_cons_length(cons);
80 ao_lisp_cons_stash(0, cons);
81 char *r = ao_lisp_alloc(len + 1);
82 cons = ao_lisp_cons_fetch(0);
86 if (ao_lisp_poly_type(cons->car) != AO_LISP_INT)
87 return ao_lisp_error(AO_LISP_INVALID, "non-int passed to pack");
88 *s++ = ao_lisp_poly_int(cons->car);
89 cons = ao_lisp_poly_cons(cons->cdr);
92 return ao_lisp_string_poly(r);
96 ao_lisp_string_unpack(char *a)
98 struct ao_lisp_cons *cons = NULL, *tail = NULL;
102 for (i = 0; (c = a[i]); i++) {
103 ao_lisp_cons_stash(0, cons);
104 ao_lisp_cons_stash(1, tail);
105 ao_lisp_string_stash(0, a);
106 struct ao_lisp_cons *n = ao_lisp_cons_cons(ao_lisp_int_poly(c), NULL);
107 a = ao_lisp_string_fetch(0);
108 cons = ao_lisp_cons_fetch(0);
109 tail = ao_lisp_cons_fetch(1);
116 tail->cdr = ao_lisp_cons_poly(n);
121 return ao_lisp_cons_poly(cons);
125 ao_lisp_string_print(ao_poly p)
127 char *s = ao_lisp_poly_string(p);
151 ao_lisp_string_patom(ao_poly p)
153 char *s = ao_lisp_poly_string(p);