/* Copyright (C) 2025 Aryadev Chavali * 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 Version 2 for * details. * You may distribute and modify this code under the terms of the GNU General * Public License Version 2, which you should have received a copy of along with * this program. If not, please go to . * Created: 2025-04-14 * Description: String Views */ #ifndef SV_H #define SV_H #include typedef struct SV { u64 size; char *data; } sv_t; #define SV(DATA, SIZE) ((const sv_t){.size = (SIZE), .data = (DATA)}) #define SV_FMT(SV) (int)(SV).size, (SV).data #define PR_SV "%.*s" sv_t sv_make(arena_t *allocator, const char *data, u64 size); sv_t sv_copy(arena_t *allocator, sv_t sv); sv_t sv_append(arena_t *allocator, sv_t sv, const char *data, u64 size); sv_t sv_prepend(arena_t *allocator, sv_t sv, const char *data, u64 size); /** * @brief Concatenate two string views, returning that concatenation. * Allocates memory. */ sv_t sv_concat(arena_t *allocator, sv_t a, sv_t b); /** * @brief Allocates a string view with the given `printf` format. */ sv_t sv_fmt(arena_t *allocator, char *fmt, ...); /** * @brief Constructs a new string view at a different offset. Does not allocate * new memory. */ sv_t sv_substr(sv_t sv, u64 index, u64 size); /** * @brief Return a string view INDEX characters ahead (i.e. cut the string from * the left). */ sv_t sv_cut(sv_t sv, u64 index); /** * @brief Return a string view with SIZE (i.e. chopping the string from the * right) */ sv_t sv_chop(sv_t sv, u64 size); i64 sv_find_substr(const sv_t sv, const sv_t substr); i64 sv_find_subcstr(const sv_t sv, const char *substr, u64 size); i64 sv_find_any(const sv_t sv, const char *bag); u64 sv_while(const sv_t sv, bool (*pred)(char)); u64 sv_till(const sv_t sv, bool (*pred)(char)); #endif