diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 7 | ||||
-rw-r--r-- | src/string_view.c | 49 | ||||
-rw-r--r-- | src/string_view.h | 38 | ||||
-rw-r--r-- | test/Makefile | 16 | ||||
-rw-r--r-- | test/string_view_test.c | 97 |
6 files changed, 207 insertions, 1 deletions
@@ -1,3 +1,4 @@ pipac build *.o +test/*_test @@ -15,9 +15,14 @@ $(TARGET): $(BUILD_DIR) $(OBJS) $(BUILD_DIR): @mkdir -p $@ +.PHONY: test +test: $(TARGET) + $(MAKE) -C test + .PHONY: clean clean: - @rm -rf $(BUILD_DIR) $(TARGET) + $(RM) -rf $(BUILD_DIR) $(TARGET) + $(MAKE) -C test clean $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(CC) $(CFLAGS) -c $< -o $@ diff --git a/src/string_view.c b/src/string_view.c new file mode 100644 index 0000000..d511e63 --- /dev/null +++ b/src/string_view.c @@ -0,0 +1,49 @@ +/* +* Copyright (C) 2023 Johnny Richard +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ +#include "string_view.h" +#include <assert.h> +#include <stdio.h> +#include <string.h> + +string_view_t +string_view_new(const char *str, int size) +{ + assert(str); + + return (string_view_t) { + .size = size, + .str = str + }; +} + +string_view_t +string_view_from_str(const char *str) +{ + return string_view_new(str, strlen(str)); +} + +bool +string_view_to_str(string_view_t *sv, char *ret) +{ + return sprintf(ret, SVFMT, SVARG(sv)) < 0; +} + +bool +string_view_eq(string_view_t a, string_view_t b) +{ + return a.size == b.size && memcmp(a.str, b.str, a.size) == 0; +} diff --git a/src/string_view.h b/src/string_view.h new file mode 100644 index 0000000..41094a2 --- /dev/null +++ b/src/string_view.h @@ -0,0 +1,38 @@ +/* +* Copyright (C) 2023 Johnny Richard +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ +#ifndef STRING_VIEW +#define STRING_VIEW + +#define SVFMT "%.*s" +#define SVARG(sv) (sv)->size, (sv)->str + +#include <stdbool.h> + +typedef struct string_view_t { + const char *str; + int size; +} string_view_t; + +string_view_t string_view_new(const char *str, int size); + +string_view_t string_view_from_str(const char *str); + +bool string_view_to_str(string_view_t *sv, char *ret); + +bool string_view_eq(string_view_t a, string_view_t b); + +#endif /* STRING_VIEW */ diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..7a37dfe --- /dev/null +++ b/test/Makefile @@ -0,0 +1,16 @@ +SRCS := $(wildcard *_test.c) +OBJS := $(patsubst %_test.c, %_test.o, $(SRCS)) +CFLAGS := -I../src +TESTS := $(patsubst %_test.c, %_test, $(SRCS)) +EXEC_TESTS := $(patsubst %_test, ./%_test, $(TESTS)) + +.PHONY: all +all: munit.o $(TESTS) + $(EXEC_TESTS) + +.PHONY: clean +clean: + $(RM) *.o *_test + +string_view_test: munit.o string_view_test.o ../build/string_view.o + $(CC) $? $(CFLAGS) -o $@ diff --git a/test/string_view_test.c b/test/string_view_test.c new file mode 100644 index 0000000..130ec2c --- /dev/null +++ b/test/string_view_test.c @@ -0,0 +1,97 @@ +/* +* Copyright (C) 2023 Johnny Richard +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <https://www.gnu.org/licenses/>. +*/ +#define MUNIT_ENABLE_ASSERT_ALIASES +#include "munit.h" +#include "string_view.h" + +static MunitResult +test_create_new(const MunitParameter params[], + void *user_data_or_fixture) +{ + char *str = "hello world"; + string_view_t sv = string_view_new(str, strlen(str)); + + assert_string_equal("hello world", (char *) sv.str); + assert_int(sv.size, ==, strlen(str)); + + return MUNIT_OK; +} + +static MunitResult +test_from_str(const MunitParameter params[], + void *user_data_or_fixture) +{ + char *str = "hello world"; + + string_view_t sv = string_view_from_str(str); + + assert_string_equal(str, (char *) sv.str); + assert_int(sv.size, ==, strlen(str)); + + return MUNIT_OK; +} + +static MunitResult +test_to_str(const MunitParameter params[], + void *user_data_or_fixture) +{ + char *str = "hello world"; + + string_view_t sv = string_view_new(str, 5); + + char actual[sv.size + 1]; + string_view_to_str(&sv, actual); + + assert_string_equal(actual, "hello"); + + return MUNIT_OK; +} + +static MunitResult +test_eq(const MunitParameter params[], + void *user_data_or_fixture) +{ + string_view_t a = string_view_from_str("hello"); + string_view_t b = string_view_from_str("world"); + + assert_false(string_view_eq(a, b)); + + b = string_view_from_str("hello"); + + assert_true(string_view_eq(a, b)); + + return MUNIT_OK; +} + +static MunitTest tests[] = { + { "/test_create_new", test_create_new, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { "/test_from_str", test_from_str, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { "/test_to_str", test_to_str, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { "/test_eq", test_eq, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL }, + { NULL, NULL, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL } +}; + +static const MunitSuite suite = { + "/string_view", tests, NULL, 1, MUNIT_SUITE_OPTION_NONE +}; + +int +main(int argc, char *argv[]) +{ + return munit_suite_main(&suite, NULL, argc, argv); + return EXIT_SUCCESS; +} |