]> git.lizzy.rs Git - nothing.git/blob - src/game/level_metadata.c
9a7c8cfe93551c83063919638fd50b661face9ce
[nothing.git] / src / game / level_metadata.c
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #include "system/stacktrace.h"
5 #include "system/nth_alloc.h"
6 #include "system/lt.h"
7 #include "system/line_stream.h"
8 #include "system/str.h"
9 #include "level_metadata.h"
10
11 struct LevelMetadata
12 {
13     Lt *lt;
14     const char *version;
15     const char *title;
16 };
17
18 LevelMetadata *create_level_metadata(const char *version, const char *title)
19 {
20     trace_assert(version);
21     trace_assert(title);
22
23     Lt *lt = create_lt();
24
25     LevelMetadata *level_metadata = PUSH_LT(
26         lt, nth_calloc(1, sizeof(LevelMetadata)), free);
27     if (level_metadata == NULL) {
28         RETURN_LT(lt, NULL);
29     }
30     level_metadata->lt = lt;
31
32     level_metadata->version = PUSH_LT(
33         lt,
34         trim_endline(string_duplicate(version, NULL)),
35         free);
36     if (level_metadata->version == NULL) {
37         RETURN_LT(lt, NULL);
38     }
39
40     level_metadata->title = PUSH_LT(
41         lt,
42         trim_endline(string_duplicate(title, NULL)),
43         free);
44     if (level_metadata->title == NULL) {
45         RETURN_LT(lt, NULL);
46     }
47
48     return level_metadata;
49 }
50
51 LevelMetadata *create_level_metadata_from_file(const char *filename)
52 {
53     trace_assert(filename);
54
55     LineStream *line_stream = create_line_stream(filename, "r", 256);
56     if (line_stream == NULL) {
57         return NULL;
58     }
59
60     LevelMetadata *level_metadata = create_level_metadata_from_line_stream(line_stream);
61     destroy_line_stream(line_stream);
62
63     return level_metadata;
64 }
65
66 LevelMetadata *create_level_metadata_from_line_stream(LineStream *line_stream)
67 {
68     trace_assert(line_stream);
69
70     Lt *lt = create_lt();
71
72     const char *version_line = PUSH_LT(
73             lt,
74             string_duplicate(line_stream_next(line_stream), NULL),
75             free);
76     if (version_line == NULL) {
77         RETURN_LT(lt, NULL);
78     }
79
80     const char *title_line = PUSH_LT(
81             lt,
82             string_duplicate(line_stream_next(line_stream), NULL),
83             free);
84     if (title_line == NULL) {
85         RETURN_LT(lt, NULL);
86     }
87
88     return create_level_metadata(version_line, title_line);
89 }
90
91 void destroy_level_metadata(LevelMetadata *level_metadata)
92 {
93     trace_assert(level_metadata);
94     RETURN_LT0(level_metadata->lt);
95 }
96
97 const char *level_metadata_version(const LevelMetadata *level_metadata)
98 {
99     trace_assert(level_metadata);
100     return level_metadata->version;
101 }
102
103 const char *level_metadata_title(const LevelMetadata *level_metadata)
104 {
105     trace_assert(level_metadata);
106     return level_metadata->title;
107 }