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 int name_size(char *name)
22 return sizeof(struct ao_lisp_atom) + strlen(name) + 1;
25 static int atom_size(void *addr)
27 struct ao_lisp_atom *atom = addr;
30 return name_size(atom->name);
33 static void atom_mark(void *addr)
35 struct ao_lisp_atom *atom = addr;
37 if (atom->next == AO_LISP_ATOM_CONST)
41 ao_lisp_poly_mark(atom->val);
45 if (ao_lisp_mark_memory(atom, atom_size(atom)))
50 static void atom_move(void *addr)
52 struct ao_lisp_atom *atom = addr;
54 if (atom->next == AO_LISP_ATOM_CONST)
58 struct ao_lisp_atom *next;
60 atom->val = ao_lisp_poly_move(atom->val);
61 next = ao_lisp_move_memory(atom->next, atom_size(atom->next));
69 const struct ao_lisp_mem_type ao_lisp_atom_type = {
75 struct ao_lisp_atom *atoms;
78 ao_lisp_atom_intern(char *name)
80 struct ao_lisp_atom *atom;
83 for (atom = atoms; atom; atom = atom->next) {
84 if (!strcmp(atom->name, name))
87 for (b = 0; ao_lisp_builtins[b]; b++)
88 if (!strcmp(ao_lisp_builtins[b]->name, name))
89 return (struct ao_lisp_atom *) ao_lisp_builtins[b];
91 ao_lisp_root_add(&ao_lisp_atom_type, (void **) &atoms);
92 atom = ao_lisp_alloc(name_size(name));
94 atom->type = AO_LISP_ATOM;
97 strcpy(atom->name, name);
98 atom->val = AO_LISP_NIL;
104 ao_lisp_atom_print(struct ao_lisp_atom *a)
106 fputs(a->name, stdout);