diff options
| author | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-13 00:09:06 +0200 |
|---|---|---|
| committer | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-13 00:09:06 +0200 |
| commit | 98c18a13d25075e1bc876885bb95267ed9f2a1f8 (patch) | |
| tree | 72a492999f4848f85a22aba4f1f30ab4cfa323fc /exec.c | |
| parent | e097a4306efd2a45a531d2da09de634f80ba30f1 (diff) | |
outline state management; change maybe macro
Diffstat (limited to 'exec.c')
| -rw-r--r-- | exec.c | 85 |
1 files changed, 73 insertions, 12 deletions
@@ -1,39 +1,100 @@ #include "lex.h" #include "parse.h" #include "typeutils.h" +#include <string.h> +typedef struct { + char* key; + char* val; +} StrPair; + +DECLARE_VEC(StrPair, KeyValMap) +DECLARE_MAYBE(char*, MaybeStr) -DECLARE_VEC(char*, StdStrVec) +void set_map_pair(KeyValMap* map, char* key, char* val) { +for (int i = 0; i < map->count; i++) { + char* key_i = get_from_KeyValMap(map, i)->key; + if (key_i == NULL) continue; + if (strcmp(key_i, key) == 0) { + // TODO: maybe copy instead + strcpy( + map->blocks[i / map->block_size][i % map->block_size].val, + val + ); + break; + } + } +} + +MaybeStr get_map_value(KeyValMap* map, char* key) { + for (int i = 0; i < map->count; i++) { + char* key_i = get_from_KeyValMap(map, i)->key; + if (key_i == NULL) continue; + if (strcmp(key_i, key) == 0) { + return (MaybeStr){ + .some = true, + .value = get_from_KeyValMap(map, i)->val + }; + } + } + return (MaybeStr){.some = false}; +} + +void unset_map_key(KeyValMap* map, char* key) { + for (int i = 0; i < map->count; i++) { + char* key_i = get_from_KeyValMap(map, i)->key; + if (key_i == NULL) continue; + if (strcmp(key_i, key) == 0) { + map->blocks[i / map->block_size][i % map->block_size].key = NULL; + break; + } + } +} typedef struct { + KeyValMap aliases; + KeyValMap shell_vars; +} ShellState; + + +char* get_var(char* varname, ShellState* shstate) { + MaybeStr maybe_varval = get_map_value(&shstate->shell_vars, varname); + if (maybe_varval.some == true) return maybe_varval.value; + return getenv(varname); +} + +typedef struct { QuotationMode qmode; char* content; } ExpandedChunk; -ExpandedChunk expand_chunk(Chunk chunk) { + + + +ExpandedChunk expand_chunk(Chunk chunk, ShellState* shstate) { char* content; if (chunk.qmode == SINGLE_Q || chunk.kind == LITERAL) { if (chunk.qmode == SINGLE_Q && chunk.kind != LITERAL) exit(69); content = chunk.as.literal_str; } else if (chunk.kind == VAR_EXP) { - // TODO: we need a ShellState to query + content = get_var(chunk.as.varname, shstate); + } else if (chunk.kind == REGION_EXP) { + exit(7); // Not supported yet; arithm } + return (ExpandedChunk){.qmode = chunk.qmode, .content = content}; +} - match (chunk.kind) { - case L - } - switch (chunk.qmode) { - case SINGLE_Q: - +char* expand_token(Token token, ShellState* shstate) { - } + // TODO: make some kind of extractor for the Vec-s that returns a regular T*-type NULL-term array + // TODO: we need to split strs on spaces + exit(1); } - -void run_pipeline(Pipeline pl) { +void run_pipeline(Pipeline pl, ShellState* shstate) { } |
