}
-/* Create a new list_node with a joySymbol head. */
struct list_node*
-make_symbol_node(char *text, size_t size)
+make_non_list_node(char *text, size_t size)
{
struct list_node *node;
char * sym;
strncat(sym, text, size);
node = GC_malloc(sizeof(struct list_node));
+
if (!strncmp(sym, FALSE, 6)) { /* I know it's wrong to hardcode the length here. Sorry. */
/* If head was a pointer we could reuse Boolean singletons... */
node->head.kind = joyFalse;
node->head.value.boolean = 0;
+
} else if (!strncmp(sym, TRUE, 5)) { /* I know it's wrong to hardcode the length here. Sorry. */
node->head.kind = joyTrue;
node->head.value.boolean = 1;
- } else {
+
+ } else if (mpz_init_set_str(node->head.value.i, sym, 10)) {
+ /* Non-zero (-1) return value means the string is not an int. */
+ mpz_clear(node->head.value.i);
node->head.kind = joySymbol;
node->head.value.symbol = sym;
+
+ } else {
+ node->head.kind = joyInt;
+ GC_register_finalizer(node->head.value.i, my_callback, NULL, NULL, NULL);
}
return node;
diff = rest - *text;
if (diff) {
- result = make_symbol_node(*text, diff);
+ result = make_non_list_node(*text, diff);
*text = rest;
} else if ('[' == rest[0]) {
*text = ++rest;
done, and we can just return a list with one symbol in it.
*/
if (NULL == rest) {
- thing = make_symbol_node(*text, strlen(*text));
+ thing = make_non_list_node(*text, strlen(*text));
*text = rest;
return thing;
}
diff = rest - *text;
if (diff) {
- thing = make_symbol_node(*text, diff);
+ thing = make_non_list_node(*text, diff);
*text = rest;
return thing;
}