diff options
author | Johnny Richard <johnny@johnnyrichard.com> | 2022-04-16 03:39:09 +0200 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2022-04-16 03:39:09 +0200 |
commit | c6071aae178ff9c44820d533701c09577c8840c5 (patch) | |
tree | b93fef00dded87a360453df844b8041ff456fc62 | |
parent | 02cdc2f8ef501a0fd8294946cce9ee3449853151 (diff) |
Create string_view struct
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | string_view.c | 60 | ||||
-rw-r--r-- | string_view.h | 51 | ||||
-rw-r--r-- | test/Makefile | 7 | ||||
-rw-r--r-- | test/string_view_test.c | 102 |
5 files changed, 220 insertions, 2 deletions
@@ -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; +} |