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);
32 LevelFolder *level_folder = PUSH_LT(
34 nth_calloc(1, sizeof(LevelFolder)),
36 if (level_folder == NULL) {
39 level_folder->lt = lt;
41 level_folder->filenames = PUSH_LT(
43 create_dynarray(sizeof(const char*)),
45 if (level_folder->filenames == NULL) {
49 level_folder->titles = PUSH_LT(
51 create_dynarray(sizeof(const char*)),
53 if (level_folder->titles == NULL) {
57 char path[LEVEL_FOLDER_MAX_LENGTH];
58 snprintf(path, LEVEL_FOLDER_MAX_LENGTH, "%s/meta.txt", dirpath);
60 LineStream *meta = PUSH_LT(
65 LEVEL_FOLDER_MAX_LENGTH),
71 const char *line = line_stream_next(meta);
73 snprintf(path, LEVEL_FOLDER_MAX_LENGTH, "%s/%s", dirpath, line);
74 line = PUSH_LT(lt, string_duplicate(trim_endline(path), NULL), free);
79 LevelMetadata *level_metadata = create_level_metadata_from_file(line);
80 if (level_metadata == NULL) {
83 const char *title = PUSH_LT(
85 string_duplicate(level_metadata_title(level_metadata), NULL),
87 destroy_level_metadata(level_metadata);
89 dynarray_push(level_folder->titles, &title);
90 dynarray_push(level_folder->filenames, &line);
92 line = line_stream_next(meta);
95 destroy_line_stream(RELEASE_LT(lt, meta));
100 void destroy_level_folder(LevelFolder *level_folder)
102 trace_assert(level_folder);
103 RETURN_LT0(level_folder->lt);
106 const char **level_folder_filenames(const LevelFolder *level_folder)
108 trace_assert(level_folder);
109 return dynarray_data(level_folder->filenames);
112 const char **level_folder_titles(const LevelFolder *level_folder)
114 trace_assert(level_folder);
115 return dynarray_data(level_folder->titles);
118 size_t level_folder_count(const LevelFolder *level_folder)
120 trace_assert(level_folder);
121 return dynarray_count(level_folder->filenames);