4 #include "system/stacktrace.h"
6 #include "system/lt_adapters.h"
7 #include "system/nth_alloc.h"
8 #include "system/line_stream.h"
9 #include "system/str.h"
10 #include "system/file.h"
12 #include "game/level_metadata.h"
14 #include "./level_folder.h"
16 #define LEVEL_FOLDER_MAX_LENGTH 512
25 LevelFolder *create_level_folder(const char *dirpath)
27 trace_assert(dirpath);
31 LevelFolder *level_folder = PUSH_LT(
33 nth_calloc(1, sizeof(LevelFolder)),
35 if (level_folder == NULL) {
38 level_folder->lt = lt;
40 level_folder->filenames = PUSH_LT(
42 create_dynarray(sizeof(const char*)),
44 if (level_folder->filenames == NULL) {
48 level_folder->titles = PUSH_LT(
50 create_dynarray(sizeof(const char*)),
52 if (level_folder->titles == NULL) {
56 char path[LEVEL_FOLDER_MAX_LENGTH];
57 DIR *level_dir = PUSH_LT(lt, opendir(dirpath), closedir_lt);
59 for (struct dirent *d = readdir(level_dir);
61 d = readdir(level_dir)) {
62 if (*d->d_name == '.') {
66 snprintf(path, LEVEL_FOLDER_MAX_LENGTH, "%s/%s", dirpath, d->d_name);
67 const char *filepath = PUSH_LT(lt, string_duplicate(trim_endline(path), NULL), free);
68 if (filepath == NULL) {
72 LevelMetadata *level_metadata = create_level_metadata_from_file(filepath);
73 if (level_metadata == NULL) {
76 const char *title = PUSH_LT(
78 string_duplicate(level_metadata_title(level_metadata), NULL),
80 destroy_level_metadata(level_metadata);
82 dynarray_push(level_folder->titles, &title);
83 dynarray_push(level_folder->filenames, &filepath);
86 closedir(RELEASE_LT(lt, level_dir));
91 void destroy_level_folder(LevelFolder *level_folder)
93 trace_assert(level_folder);
94 RETURN_LT0(level_folder->lt);
97 const char **level_folder_filenames(const LevelFolder *level_folder)
99 trace_assert(level_folder);
100 return dynarray_data(level_folder->filenames);
103 const char **level_folder_titles(const LevelFolder *level_folder)
105 trace_assert(level_folder);
106 return dynarray_data(level_folder->titles);
109 size_t level_folder_count(const LevelFolder *level_folder)
111 trace_assert(level_folder);
112 return dynarray_count(level_folder->filenames);