4 #include "system/stacktrace.h"
6 #include "system/nth_alloc.h"
7 #include "system/line_stream.h"
8 #include "system/str.h"
10 #include "game/level_metadata.h"
12 #include "./level_folder.h"
14 #define LEVEL_FOLDER_MAX_LENGTH 512
23 LevelFolder *create_level_folder(const char *dirpath)
25 trace_assert(dirpath);
29 LevelFolder *level_folder = PUSH_LT(
31 nth_calloc(1, sizeof(LevelFolder)),
33 if (level_folder == NULL) {
36 level_folder->lt = lt;
38 level_folder->filenames = PUSH_LT(
40 create_dynarray(sizeof(const char*)),
42 if (level_folder->filenames == NULL) {
46 level_folder->titles = PUSH_LT(
48 create_dynarray(sizeof(const char*)),
50 if (level_folder->titles == NULL) {
54 char path[LEVEL_FOLDER_MAX_LENGTH];
55 snprintf(path, LEVEL_FOLDER_MAX_LENGTH, "%s/meta.txt", dirpath);
57 LineStream *meta = PUSH_LT(
62 LEVEL_FOLDER_MAX_LENGTH),
68 const char *line = line_stream_next(meta);
70 snprintf(path, LEVEL_FOLDER_MAX_LENGTH, "%s/%s", dirpath, line);
71 line = PUSH_LT(lt, string_duplicate(trim_endline(path), NULL), free);
76 LevelMetadata *level_metadata = create_level_metadata_from_file(line);
77 if (level_metadata == NULL) {
80 const char *title = PUSH_LT(
82 string_duplicate(level_metadata_title(level_metadata), NULL),
84 destroy_level_metadata(level_metadata);
86 dynarray_push(level_folder->titles, &title);
87 dynarray_push(level_folder->filenames, &line);
89 line = line_stream_next(meta);
92 destroy_line_stream(RELEASE_LT(lt, meta));
97 void destroy_level_folder(LevelFolder *level_folder)
99 trace_assert(level_folder);
100 RETURN_LT0(level_folder->lt);
103 const char **level_folder_filenames(const LevelFolder *level_folder)
105 trace_assert(level_folder);
106 return dynarray_data(level_folder->filenames);
109 const char **level_folder_titles(const LevelFolder *level_folder)
111 trace_assert(level_folder);
112 return dynarray_data(level_folder->titles);
115 size_t level_folder_count(const LevelFolder *level_folder)
117 trace_assert(level_folder);
118 return dynarray_count(level_folder->filenames);