2019-01-14 03:16:25 +01:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#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)
|
|
|
|
{
|
2019-01-16 23:24:23 +01:00
|
|
|
ERR(result) = ERR(input);
|
2019-01-14 03:16:25 +01:00
|
|
|
}
|
|
|
|
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;
|
|
|
|
}
|