From 2bc0161433869d21a8c99779f39ce2f932389ea0 Mon Sep 17 00:00:00 2001 From: kdx Date: Fri, 17 Mar 2023 06:28:35 +0100 Subject: generate static memory --- main.c | 7 +++++++ memory.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ memory.h | 9 +++++++++ slice.c | 18 ++++++++++++++++-- slice.h | 2 ++ 5 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 memory.c create mode 100644 memory.h diff --git a/main.c b/main.c index ff6f17d..8fa5546 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,7 @@ #include "identify.h" #include "check.h" #include "scope.h" +#include "memory.h" #include #include @@ -36,6 +37,7 @@ main(int argc, char **argv) Token *tokens = lexer(slice); if (tokens != NULL) { + Memory memory = {0}; destroy_duplicates(&tokens, TOK_END); do { if (group_scope(&tokens) || @@ -66,8 +68,13 @@ main(int argc, char **argv) group->group.type = GROUP_SCOPE; scope_extract(tokens); scope_function(tokens); + if (memory_create(&memory, tokens)) { + fprintf(stderr, "memory_create failed\n"); + break; + } token_print(tokens, 1, 0); } while(0); + memory_destroy(&memory); token_destroy(tokens); } diff --git a/memory.c b/memory.c new file mode 100644 index 0000000..b65ad42 --- /dev/null +++ b/memory.c @@ -0,0 +1,59 @@ +#include "memory.h" +#include "slice.h" +#include +#include + +static int +strings_len(Token *list) +{ + int len = 0; + for (Token *e = list; e != NULL; e = e->next) + if (e->type == TOK_GROUP) + len += strings_len(e->group.tokens); + else if (e->type == TOK_STRING) + len += slice_len(e->slice) + 1; + return len; +} + +static int +strings_cat(char *mem, Token *list) +{ + int len = 0; + for (Token *e = list; e != NULL; e = e->next) + if (e->type == TOK_GROUP) + len += strings_cat(mem + len, e->group.tokens); + else if (e->type == TOK_STRING) { + slice_cpy(mem + len, e->slice); + len += slice_len(e->slice) + 1; + } + return len; +} + +int +memory_create(Memory *memory, Token *list) +{ + const int len = strings_len(list); + memory->strings = malloc(len); + if (memory->strings == NULL) { + perror("memory_create:malloc"); + return 1; + } + const int cated = strings_cat(memory->strings, list); + if (cated != len) { + fprintf(stderr, "strings_cat wrote %d bytes instead of %d", + cated, len); + free(memory->strings); + memory->strings = NULL; + return 1; + } + return 0; +} + +void +memory_destroy(Memory *memory) +{ + if (memory->strings != NULL) { + free(memory->strings); + memory->strings = NULL; + } +} diff --git a/memory.h b/memory.h new file mode 100644 index 0000000..0b6f8e5 --- /dev/null +++ b/memory.h @@ -0,0 +1,9 @@ +#pragma once +#include "token.h" + +typedef struct { + char *strings; +} Memory; + +int memory_create(Memory *memory, Token *list); +void memory_destroy(Memory *memory); diff --git a/slice.c b/slice.c index f2b64fc..d86a75e 100644 --- a/slice.c +++ b/slice.c @@ -37,8 +37,22 @@ slice_sub(Slice src, int begin, int end) int slice_equal(Slice s0, Slice s1) { - if (s0.end - s0.begin != s1.end - s1.begin) + if (slice_len(s0) != slice_len(s1)) return 0; return 0 == - strncmp(s0.str + s0.begin, s1.str + s1.begin, s0.end - s0.begin); + strncmp(s0.str + s0.begin, s1.str + s1.begin, slice_len(s0)); +} + +int +slice_len(Slice slice) +{ + return slice.end - slice.begin; +} + +void * +slice_cpy(void *dest, Slice slice) +{ + memcpy(dest, slice.str + slice.begin, slice_len(slice)); + ((char*)dest)[slice_len(slice)] = '\0'; + return dest; } diff --git a/slice.h b/slice.h index 0a69f78..2987f79 100644 --- a/slice.h +++ b/slice.h @@ -11,3 +11,5 @@ Slice slice_print(Slice slice); Slice slice_from_str(char *str); Slice slice_sub(Slice src, int begin, int end); int slice_equal(Slice s0, Slice s1); +int slice_len(Slice slice); +void *slice_cpy(void *dest, Slice slice); -- cgit v1.2.3