From 2bdbf387261285d07e4b62d1e23c9e43efb14604 Mon Sep 17 00:00:00 2001 From: Ákos Kőrösi Date: Tue, 19 May 2026 21:13:19 +0200 Subject: restructure dir, create makefile --- src/utils.h | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/utils.h (limited to 'src/utils.h') diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..a213c71 --- /dev/null +++ b/src/utils.h @@ -0,0 +1,111 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + + +#define DECLARE_VEC(T, Name) \ + typedef struct { \ + T **blocks; \ + size_t count; \ + size_t used; \ + size_t cap; \ + size_t block_size; \ + } Name; \ + \ + static inline Name make_##Name(size_t block_size) { \ + return (Name){ \ + .blocks = NULL, \ + .count = 0, \ + .used = 0, \ + .cap = 0, \ + .block_size = block_size, \ + }; \ + } \ + \ + static inline T *push_to_##Name(Name *vec, T item) { \ + size_t block_index = vec->count / vec->block_size; \ + size_t item_index = vec->count % vec->block_size; \ + \ + if (block_index == vec->used) { \ + if (vec->used == vec->cap) { \ + size_t new_cap = vec->cap \ + ? vec->cap * 2 \ + : 8; \ + \ + T **new_blocks = realloc( \ + vec->blocks, \ + new_cap * sizeof(T *) \ + ); \ + \ + if (!new_blocks) abort(); \ + \ + vec->blocks = new_blocks; \ + vec->cap = new_cap; \ + } \ + \ + vec->blocks[vec->used] = \ + malloc(vec->block_size * sizeof(T)); \ + \ + if (!vec->blocks[vec->used]) abort(); \ + \ + vec->used++; \ + } \ + \ + T *ptr = &vec->blocks[block_index][item_index]; \ + *ptr = item; \ + \ + vec->count++; \ + return ptr; \ + } \ + \ + static inline T* get_from_##Name(Name *vec, size_t index) { \ + if (index >= vec->count) return NULL; \ + \ + return &vec->blocks \ + [index / vec->block_size] \ + [index % vec->block_size]; \ + } + + +DECLARE_VEC(int, IntVec) + +DECLARE_VEC(char, String); +DECLARE_VEC(char*, StrVec) + + +void append_str_to_String(String* target, const char* src_str); +char* inner(String* str); + + + +#define DECLARE_MAYBE(T, Name) \ + typedef struct { \ + bool some; \ + T value; \ + } Name; + +DECLARE_MAYBE(char*, MaybeStr) + + +typedef struct { + char* key; + char* val; +} StrPair; +DECLARE_VEC(StrPair, KeyValMap) + +void set_map_pair(KeyValMap* map, char* key, char* val); +MaybeStr get_map_value(KeyValMap* map, char* key); +void unset_map_key(KeyValMap* map, char* key); + + +typedef struct { + KeyValMap aliases; + KeyValMap shell_vars; +} ShellState; + +char* get_var(char* varname, ShellState* shstate); -- cgit v1.2.3