From d90f91cda013e2d2b16a14d13bdea97ea77e5244 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Sun, 10 Aug 2025 16:38:59 +0100 Subject: [PATCH] Create print module --- lib/CMakeLists.txt | 1 + lib/include/print.h | 8 ++++++ lib/print.c | 26 +++++++++++++++++++ tests/CMakeLists.txt | 1 + tests/print_tests.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+) create mode 100644 lib/include/print.h create mode 100644 lib/print.c create mode 100644 tests/print_tests.c diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 5d7cded..1e95c07 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -6,6 +6,7 @@ add_library(imp memory_stream.c parse.c prim.c + print.c store.c token.c ) diff --git a/lib/include/print.h b/lib/include/print.h new file mode 100644 index 0000000..5172663 --- /dev/null +++ b/lib/include/print.h @@ -0,0 +1,8 @@ +#ifndef PRINT_H +#define PRINT_H + +#include "am.h" + +size_t print(am_t *am, char *buffer, size_t buffer_size); + +#endif diff --git a/lib/print.c b/lib/print.c new file mode 100644 index 0000000..258346e --- /dev/null +++ b/lib/print.c @@ -0,0 +1,26 @@ +#include "print.h" + +#include + +size_t print(am_t *am, char *buffer, size_t buffer_size) +{ + assert(am->val->is_atom); + assert(am->val->atom.type == ATOM_TYPE_INTEGER); + + int64_t value = am->val->atom.integer; + int divisor = 10; + while (divisor <= value) + divisor *= 10; + + size_t i = 0; + do { + divisor /= 10; + const int digit = value / divisor; + value = value % divisor; + + assert(i < buffer_size); + buffer[i++] = '0' + (char)digit; + } while (divisor > 1); + + return i; +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a530c7e..8d5f3a7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -15,6 +15,7 @@ add_test_suites( expr_tests.c parse_tests.c prim_tests.c + print_tests.c store_tests.c token_tests.c ) diff --git a/tests/print_tests.c b/tests/print_tests.c new file mode 100644 index 0000000..a0f366e --- /dev/null +++ b/tests/print_tests.c @@ -0,0 +1,61 @@ +#include "print.h" +#include "unity.h" + +#include + +#define BUFFER_SIZE 256U + +static am_t am; +static char buffer[BUFFER_SIZE]; + +void setUp(void) +{ + memset(buffer, 0, BUFFER_SIZE); + am_init(&am); +} + +void tearDown(void) +{ +} + +static void test_integer_5(void) +{ + am.val = expr_integer(&am, 5); + const size_t len = print(&am, buffer, BUFFER_SIZE); + TEST_ASSERT_EQUAL(1, len); + TEST_ASSERT_EQUAL_MEMORY("5", buffer, 1); +} + +static void test_integer_1234(void) +{ + am.val = expr_integer(&am, 1234); + const size_t len = print(&am, buffer, BUFFER_SIZE); + TEST_ASSERT_EQUAL(4, len); + TEST_ASSERT_EQUAL_MEMORY("1234", buffer, 4); +} + +static void test_integer_0(void) +{ + am.val = expr_integer(&am, 0); + const size_t len = print(&am, buffer, BUFFER_SIZE); + TEST_ASSERT_EQUAL(1, len); + TEST_ASSERT_EQUAL_MEMORY("0", buffer, 1); +} + +static void test_integer_10(void) +{ + am.val = expr_integer(&am, 10); + const size_t len = print(&am, buffer, BUFFER_SIZE); + TEST_ASSERT_EQUAL(2, len); + TEST_ASSERT_EQUAL_MEMORY("10", buffer, 2); +} + +int main(void) +{ + UNITY_BEGIN(); + RUN_TEST(test_integer_5); + RUN_TEST(test_integer_1234); + RUN_TEST(test_integer_0); + RUN_TEST(test_integer_10); + return UNITY_END(); +}