From d45a5b21de22438c004e1db96a8f154da09cdc0e Mon Sep 17 00:00:00 2001 From: Oskari Timperi Date: Wed, 14 May 2014 22:27:34 +0300 Subject: Initial commit - tokenizing, parsing and basic eval support - arithmetic (+, -, *, /) - quote - atom for checking if the arg is an atom (i.e. not a list) - eq for checking equality - > for checking order - if - some unit testing - simple repl - mem management needs improvement :-) --- atom.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 atom.c (limited to 'atom.c') diff --git a/atom.c b/atom.c new file mode 100644 index 0000000..73ecd7e --- /dev/null +++ b/atom.c @@ -0,0 +1,100 @@ +#include "atom.h" +#include "list.h" + +#include +#include + +struct atom true_atom; +struct atom false_atom; +struct atom nil_atom; + +struct atom *atom_new(char type) +{ + struct atom *atom = calloc(1, sizeof(*atom)); + atom->type = type; + return atom; +} + +struct atom *atom_new_int(long l) +{ + struct atom *atom = atom_new(ATOM_INT); + atom->l = l; + return atom; +} + +struct atom *atom_new_str(const char *str, int len) +{ + struct atom *atom = atom_new(ATOM_STR); + atom->str.str = strndup(str, len); + atom->str.len = len; + return atom; +} + +struct atom *atom_new_sym(const char *sym, int len) +{ + struct atom *atom = atom_new_str(sym, len); + atom->type = ATOM_SYMBOL; + return atom; +} + +struct atom *atom_new_list(struct list *list) +{ + struct atom *atom = atom_new(ATOM_LIST); + atom->list = list; + return atom; +} + +#ifdef BUILD_TEST + +#include "test_util.h" + +TEST(atom_new) +{ + struct atom *atom = atom_new(ATOM_STR); + ASSERT_TRUE(atom != NULL); + ASSERT_EQ(ATOM_STR, atom->type); +} + +TEST(atom_new_int) +{ + struct atom *atom = atom_new_int(42); + ASSERT_TRUE(atom != NULL); + ASSERT_EQ(42, atom->l); +} + +TEST(atom_new_str) +{ + struct atom *atom = atom_new_str("foobar", 6); + ASSERT_TRUE(atom != NULL); + ASSERT_STREQ("foobar", atom->str.str); + + atom = atom_new_str("foobar", 3); + ASSERT_TRUE(atom != NULL); + ASSERT_STREQ("foo", atom->str.str); + + ASSERT_EQ(ATOM_STR, atom->type); +} + +TEST(atom_new_sym) +{ + struct atom *atom = atom_new_sym("foobar", 6); + ASSERT_TRUE(atom != NULL); + ASSERT_STREQ("foobar", atom->str.str); + + atom = atom_new_sym("foobar", 3); + ASSERT_TRUE(atom != NULL); + ASSERT_STREQ("foo", atom->str.str); + + ASSERT_EQ(ATOM_SYMBOL, atom->type); +} + +TEST(atom_new_list) +{ + struct list list; + struct atom *atom = atom_new_list(&list); + ASSERT_TRUE(atom != NULL); + ASSERT_EQ(&list, atom->list); + ASSERT_EQ(ATOM_LIST, atom->type); +} + +#endif -- cgit v1.2.3