#include #include #include "util.h" int properList(object list) { object *current = &list; while (TYPE(*current) == consObject) { current = &CDR(*current); } return TYPE(*current) == nilObject; } int listLength(object list) { object *current = &list; int i = 0; while (TYPE(*current) != nilObject) { current = &CDR(*current); ++i; } return i; } void deleteObject(object input) { if ((TYPE(input) == symbolObject) && SYM(input) != NULL) { free(SYM(input)); SYM(input) = NULL; } else if (TYPE(input) == consObject) { deleteObject(CAR(input)); deleteObject(CDR(input)); free(CONS(input)); CONS(input) = NULL; } TYPE(input) = nilObject; } object copyObject(object input) { object result; TYPE(result) = TYPE(input); if (TYPE(input) == errorObject) { ERR(result) = ERR(input); } else if (TYPE(input) == numberObject) { NUM(result) = NUM(input); } else if (TYPE(input) == symbolObject) { SYM(result) = malloc(sizeof(char) * (strlen(SYM(input)) + 1)); strcpy(SYM(result), SYM(input)); } else if (TYPE(input) == consObject) { CONS(result) = malloc(sizeof(cons)); CAR(result) = copyObject(CAR(input)); CDR(result) = copyObject(CDR(input)); } return result; }