]> git.lizzy.rs Git - nothing.git/blob - src/game/level_metadata.c
Merge pull request #1 from tsoding/master
[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 *title;
15 };
16
17 LevelMetadata *create_level_metadata_from_file(const char *filename)
18 {
19     trace_assert(filename);
20
21     LineStream *line_stream = create_line_stream(filename, "r", 256);
22     if (line_stream == NULL) {
23         return NULL;
24     }
25
26     LevelMetadata *level_metadata = create_level_metadata_from_line_stream(line_stream);
27     destroy_line_stream(line_stream);
28
29     return level_metadata;
30 }
31
32 LevelMetadata *create_level_metadata_from_line_stream(LineStream *line_stream)
33 {
34     trace_assert(line_stream);
35
36     Lt *lt = create_lt();
37     if (lt == NULL) {
38         return NULL;
39     }
40
41     LevelMetadata *level_metadata = PUSH_LT(
42         lt, nth_calloc(1, sizeof(LevelMetadata)), free);
43     if (level_metadata == NULL) {
44         RETURN_LT(lt, NULL);
45     }
46     level_metadata->lt = lt;
47
48
49     level_metadata->title = PUSH_LT(
50         lt,
51         trim_endline(string_duplicate(line_stream_next(line_stream), NULL)),
52         free);
53     if (level_metadata->title == NULL) {
54         RETURN_LT(lt, NULL);
55     }
56
57     return level_metadata;
58 }
59
60 void destroy_level_metadata(LevelMetadata *level_metadata)
61 {
62     trace_assert(level_metadata);
63     RETURN_LT0(level_metadata->lt);
64 }
65
66 const char *level_metadata_title(const LevelMetadata *level_metadata)
67 {
68     trace_assert(level_metadata);
69     return level_metadata->title;
70 }