summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kdx.42@42l.fr>2023-03-17 06:28:35 +0100
committerkdx <kdx.42@42l.fr>2023-03-17 06:28:35 +0100
commit2bc0161433869d21a8c99779f39ce2f932389ea0 (patch)
tree41f8298f92fb4937cff2c93abd6b4840ab48ad2e
parent19a77b5c755f6cca04cbea8ca91a6e809b53beae (diff)
downloadgolem-2bc0161433869d21a8c99779f39ce2f932389ea0.tar.gz
generate static memory
-rw-r--r--main.c7
-rw-r--r--memory.c59
-rw-r--r--memory.h9
-rw-r--r--slice.c18
-rw-r--r--slice.h2
5 files changed, 93 insertions, 2 deletions
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 <stdio.h>
#include <stdlib.h>
@@ -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 <stdlib.h>
+#include <stdio.h>
+
+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);