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 = {
44 ao_lisp_string_new(int len) {
45 char *a = ao_lisp_alloc(len + 1);
53 ao_lisp_string_copy(char *a)
57 char *r = ao_lisp_alloc(alen + 1);
65 ao_lisp_string_cat(char *a, char *b)
69 char *r = ao_lisp_alloc(alen + blen + 1);
78 ao_lisp_string_pack(struct ao_lisp_cons *cons)
80 int len = ao_lisp_cons_length(cons);
81 char *r = ao_lisp_alloc(len + 1);
85 if (ao_lisp_poly_type(cons->car) != AO_LISP_INT)
86 return ao_lisp_error(AO_LISP_INVALID, "non-int passed to pack");
87 *s++ = ao_lisp_poly_int(cons->car);
88 cons = ao_lisp_poly_cons(cons->cdr);
91 return ao_lisp_string_poly(r);
95 ao_lisp_string_unpack(char *a)
97 struct ao_lisp_cons *cons = NULL, *tail = NULL;
100 ao_lisp_root_add(&ao_lisp_cons_type, &cons);
101 ao_lisp_root_add(&ao_lisp_cons_type, &tail);
103 struct ao_lisp_cons *n = ao_lisp_cons_cons(ao_lisp_int_poly(c), NULL);
109 tail->cdr = ao_lisp_cons_poly(n);
114 ao_lisp_root_clear(&cons);
115 ao_lisp_root_clear(&tail);
116 return ao_lisp_cons_poly(cons);
120 ao_lisp_string_print(ao_poly p)
122 char *s = ao_lisp_poly_string(p);
146 ao_lisp_string_patom(ao_poly p)
148 char *s = ao_lisp_poly_string(p);