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 /string_view.c | |
parent | 02cdc2f8ef501a0fd8294946cce9ee3449853151 (diff) |
Create string_view struct
Diffstat (limited to 'string_view.c')
-rw-r--r-- | string_view.c | 60 |
1 files changed, 60 insertions, 0 deletions
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; +} |