summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnny Richard <johnny@johnnyrichard.com>2022-04-16 03:39:09 +0200
committerJohnny Richard <johnny@johnnyrichard.com>2022-04-16 03:39:09 +0200
commitc6071aae178ff9c44820d533701c09577c8840c5 (patch)
treeb93fef00dded87a360453df844b8041ff456fc62
parent02cdc2f8ef501a0fd8294946cce9ee3449853151 (diff)
Create string_view struct
-rw-r--r--Makefile2
-rw-r--r--string_view.c60
-rw-r--r--string_view.h51
-rw-r--r--test/Makefile7
-rw-r--r--test/string_view_test.c102
5 files changed, 220 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 32c0a02..115bbf6 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CC=gcc
.PHONY: all
-all: main.c server.c log.o hash_table.o
+all: main.c server.c log.o hash_table.o string_view.o
$(CC) -ggdb -o papo main.c server.c log.o hash_table.o
.PHONY: test
diff --git a/string_view.c b/string_view.c
new file mode 100644
index 0000000..d9d6632
--- /dev/null
+++ b/string_view.c
@@ -0,0 +1,60 @@
+/*
+ * Papo IRC Server
+ * Copyright (C) 2021 Johnny Richard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+#include "string_view.h"
+
+#include <assert.h>
+#include <string.h>
+
+string_view_t
+string_view_new(const char *cstr, size_t size)
+{
+ assert(cstr);
+
+ return (string_view_t) {
+ .size = size,
+ .data = cstr
+ };
+}
+
+string_view_t
+string_view_from_cstr(const char *cstr)
+{
+ return string_view_new(cstr, strlen(cstr));
+}
+
+
+string_view_t
+string_view_chop_by_delim(string_view_t *sv, char delim)
+{
+ size_t i = 0;
+ while (sv->data[i] != delim && i < sv->size) {
+ ++i;
+ }
+
+ string_view_t chopped_sv = string_view_new(sv->data, i);
+
+ if (i < sv->size) {
+ sv->size -= i + 1;
+ sv->data += i + 1;
+ } else {
+ sv->size -= i;
+ sv->data += i;
+ }
+
+ return chopped_sv;
+}
diff --git a/string_view.h b/string_view.h
new file mode 100644
index 0000000..2aa4402
--- /dev/null
+++ b/string_view.h
@@ -0,0 +1,51 @@
+/*
+ * Papo IRC Server
+ * Copyright (C) 2021 Johnny Richard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+#ifndef STRING_VIEW_H
+#define STRING_VIEW_H
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+typedef struct string_view {
+ size_t size;
+ const char *data;
+} string_view_t;
+
+
+string_view_t string_view_new(const char *cstr, size_t size);
+
+string_view_t string_view_from_cstr(const char *cstr);
+
+string_view_t string_view_chop_by_delim(string_view_t *sv, char delim);
+
+/*
+bool string_view_index_of(string_view_t sv, char c, size_t *index);
+
+bool string_view_eq(string_view_t a, string_view_t b);
+
+bool string_view_eqi(string_view_t a, string_view_t b);
+
+bool string_view_starts_with(string_view_t sv, string_view_t prefix);
+
+bool string_view_ends_with(string_view_t sv, string_view_t suffix);
+
+uint64_t string_view_to_u64(string_view_t sv);
+*/
+
+#endif /* STRING_VIEW_H */
diff --git a/test/Makefile b/test/Makefile
index 3d86f0e..7ef1bcc 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,13 +1,18 @@
CC=gcc
.PHONY: all
-all: hash_table_test
+all: hash_table_test string_view_test
.PHONY: hash_table_test
hash_table_test: ../hash_table.o hash_table_test.c
$(CC) -o hash_table_test ../hash_table.o hash_table_test.c
./hash_table_test
+.PHONY: string_view_test
+string_view_test: ../string_view.o string_view_test.c
+ $(CC) -o string_view_test ../string_view.o string_view_test.c
+ ./string_view_test
+
.PHONY: clean
clean:
@$(RM) hash_table_test
diff --git a/test/string_view_test.c b/test/string_view_test.c
new file mode 100644
index 0000000..d4ecf9e
--- /dev/null
+++ b/test/string_view_test.c
@@ -0,0 +1,102 @@
+/*
+ * Papo IRC Server
+ * Copyright (C) 2021 Johnny Richard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+#define MUNIT_ENABLE_ASSERT_ALIASES
+#include "munit/munit.c"
+#include "../string_view.h"
+
+#include <stdlib.h>
+
+static MunitResult
+test_create_new(const MunitParameter params[],
+ void *user_data_or_fixture)
+{
+ char *data = "hello world";
+ string_view_t sv = string_view_new(data, strlen(data));
+
+ assert_string_equal("hello world", (char *) sv.data);
+ assert_int(sv.size, ==, strlen(data));
+
+ return MUNIT_OK;
+}
+
+static MunitResult
+test_from_cstr(const MunitParameter params[],
+ void *user_data_or_fixture)
+{
+ char *cstr = "hello world";
+
+ string_view_t sv = string_view_from_cstr(cstr);
+
+ assert_string_equal(cstr, (char *) sv.data);
+ assert_int(sv.size, ==, strlen(cstr));
+
+ return MUNIT_OK;
+}
+
+static MunitResult
+test_chop_by_delim_when_has_delim(const MunitParameter params[],
+ void *user_data_or_fixture)
+{
+ string_view_t sv = string_view_from_cstr("hello world");
+ string_view_t result = string_view_chop_by_delim(&sv, ' ');
+
+ char actual[10];
+ sprintf(actual, "%.*s", sv.size, sv.data);
+ assert_string_equal(actual, "world");
+
+ sprintf(actual, "%.*s", result.size, result.data);
+ assert_string_equal(actual, "hello");
+
+ return MUNIT_OK;
+}
+
+static MunitResult
+test_chop_by_delim_when_has_no_delim(const MunitParameter params[],
+ void *user_data_or_fixture)
+{
+ string_view_t sv = string_view_from_cstr("helloworld");
+ string_view_t result = string_view_chop_by_delim(&sv, ' ');
+
+ char actual[10];
+ sprintf(actual, "%.*s", sv.size, sv.data);
+ assert_string_equal(actual, "");
+
+ sprintf(actual, "%.*s", result.size, result.data);
+ assert_string_equal(actual, "helloworld");
+
+ return MUNIT_OK;
+}
+
+static MunitTest tests[] = {
+ { "/test_create_new", test_create_new, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL },
+ { "/test_from_cstr", test_from_cstr, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL },
+ { "/test_chop_by_delim_when_has_delim", test_chop_by_delim_when_has_delim, NULL, NULL, MUNIT_TEST_OPTION_NONE, NULL },
+ { "/test_chop_by_delim_when_has_no_delim", test_chop_by_delim_when_has_no_delim, 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;
+}