From: rexim Date: Sat, 21 Dec 2019 19:20:10 +0000 (+0700) Subject: Implement chop_player_layer X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=bf5d08c21beb3a37bbee2c849268b2b0d5a7f708;p=nothing.git Implement chop_player_layer --- diff --git a/src/game/level/level_editor/player_layer.c b/src/game/level/level_editor/player_layer.c index 711ade5b..f3c312fe 100644 --- a/src/game/level/level_editor/player_layer.c +++ b/src/game/level/level_editor/player_layer.c @@ -8,6 +8,7 @@ #include "system/nth_alloc.h" #include "system/log.h" #include "undo_history.h" +#include "system/memory.h" typedef struct { PlayerLayer *layer; @@ -73,6 +74,19 @@ PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream) return create_player_layer(position, hexstr(colorstr)); } +PlayerLayer chop_player_layer(Memory *memory, String *input) +{ + trace_assert(memory); + trace_assert(input); + + String line = chop_by_delim(input, '\n'); + float x = strtof(string_to_cstr(memory, chop_word(&line)), NULL); + float y = strtof(string_to_cstr(memory, chop_word(&line)), NULL); + Color color = hexs(chop_word(&line)); + + return create_player_layer(vec(x, y), color); +} + LayerPtr player_layer_as_layer(PlayerLayer *player_layer) { LayerPtr layer = { diff --git a/src/game/level/level_editor/player_layer.h b/src/game/level/level_editor/player_layer.h index 3fa4c8e5..f89d22f1 100644 --- a/src/game/level/level_editor/player_layer.h +++ b/src/game/level/level_editor/player_layer.h @@ -5,6 +5,8 @@ #include "layer.h" #include "system/lt.h" #include "system/line_stream.h" +#include "system/memory.h" +#include "system/s.h" typedef struct { Vec2f position; @@ -14,6 +16,7 @@ typedef struct { PlayerLayer create_player_layer(Vec2f position, Color color); PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream); +PlayerLayer chop_player_layer(Memory *memory, String *input); LayerPtr player_layer_as_layer(PlayerLayer *player_layer); int player_layer_render(const PlayerLayer *player_layer, diff --git a/src/system/memory.h b/src/system/memory.h new file mode 100644 index 00000000..d099d5f6 --- /dev/null +++ b/src/system/memory.h @@ -0,0 +1,37 @@ +#ifndef MEMORY_H_ +#define MEMORY_H_ + +#include +#include + +#define KILO 1024 +#define MEGA (1024 * KILO) +#define GIGA (1024 * MEGA) + +typedef struct { + size_t capacity; + size_t size; + uint8_t *buffer; +} Memory; + +static inline +void *memory_alloc(Memory *memory, size_t size) +{ + assert(memory); + assert(memory->size + size <= memory->capacity); + + + void *result = memory->buffer + memory->size; + memory->size += size; + + return result; +} + +static inline +void memory_clean(Memory *memory) +{ + assert(memory); + memory->size = 0; +} + +#endif // MEMORY_H_ diff --git a/src/system/s.h b/src/system/s.h index 2b3c3566..688af2d1 100644 --- a/src/system/s.h +++ b/src/system/s.h @@ -1,8 +1,10 @@ #ifndef S_H_ #define S_H_ +#include #include #include "system/stacktrace.h" +#include "system/memory.h" typedef struct { size_t count; @@ -106,4 +108,15 @@ String chop_word(String *input) return result; } +static inline +char *string_to_cstr(Memory *memory, String s) +{ + trace_assert(memory); + + char *result = memory_alloc(memory, s.count + 1); + memset(result, 0, s.count + 1); + memcpy(result, s.data, s.count); + return result; +} + #endif // S_H_