diff options
author | Johnny Richard <johnny@johnnyrichard.com> | 2023-04-16 01:10:35 +0200 |
---|---|---|
committer | Johnny Richard <johnny@johnnyrichard.com> | 2023-04-16 01:31:44 +0200 |
commit | d55938b34d6b7ee2c2d7da8483aaed5c8b9078a0 (patch) | |
tree | 38ac553f06bc09da6e8fb967a74662d636838181 /src | |
parent | 3c9ac4da54548e2a6446e78b4fbb979b47cfc4d9 (diff) |
util: Create string_view tool to optimize memory usage
We are allocating heap memory to create tokens value, we can minimize the
number of allocations if we start using string_view.
We have other problems, right now the tokens value ownership are quite
unclear once the AST nodes also share the memory allocation done by
token_get_next_token function.
It's important to clarify we also have memory leaks on the current
implementation. Hence, we are going to start using string_view to make
the memory management easier. :^)
Signed-off-by: Johnny Richard <johnny@johnnyrichard.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/string_view.c | 49 | ||||
-rw-r--r-- | src/string_view.h | 38 |
2 files changed, 87 insertions, 0 deletions
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 */ |