4 #include "system/stacktrace.h"
5 #include "system/nth_alloc.h"
7 #include "system/line_stream.h"
8 #include "system/str.h"
9 #include "level_metadata.h"
18 LevelMetadata *create_level_metadata(const char *version, const char *title)
20 trace_assert(version);
25 LevelMetadata *level_metadata = PUSH_LT(
26 lt, nth_calloc(1, sizeof(LevelMetadata)), free);
27 if (level_metadata == NULL) {
30 level_metadata->lt = lt;
32 level_metadata->version = PUSH_LT(
34 trim_endline(string_duplicate(version, NULL)),
36 if (level_metadata->version == NULL) {
40 level_metadata->title = PUSH_LT(
42 trim_endline(string_duplicate(title, NULL)),
44 if (level_metadata->title == NULL) {
48 return level_metadata;
51 LevelMetadata *create_level_metadata_from_file(const char *filename)
53 trace_assert(filename);
55 LineStream *line_stream = create_line_stream(filename, "r", 256);
56 if (line_stream == NULL) {
60 LevelMetadata *level_metadata = create_level_metadata_from_line_stream(line_stream);
61 destroy_line_stream(line_stream);
63 return level_metadata;
66 LevelMetadata *create_level_metadata_from_line_stream(LineStream *line_stream)
68 trace_assert(line_stream);
72 const char *version_line = PUSH_LT(
74 string_duplicate(line_stream_next(line_stream), NULL),
76 if (version_line == NULL) {
80 const char *title_line = PUSH_LT(
82 string_duplicate(line_stream_next(line_stream), NULL),
84 if (title_line == NULL) {
88 return create_level_metadata(version_line, title_line);
91 void destroy_level_metadata(LevelMetadata *level_metadata)
93 trace_assert(level_metadata);
94 RETURN_LT0(level_metadata->lt);
97 const char *level_metadata_version(const LevelMetadata *level_metadata)
99 trace_assert(level_metadata);
100 return level_metadata->version;
103 const char *level_metadata_title(const LevelMetadata *level_metadata)
105 trace_assert(level_metadata);
106 return level_metadata->title;