+#else
+
+#ifdef __linux__
+
+int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FILE *fd);
+int jumpnrun_load_level_from_file (jumpnrun_level *dest, FILE *fd);
+
+#define JUMPNRUN_LEVEL_LOAD(lv, lvname) \
+ memset(&(lv), 0, sizeof(lv)); \
+ FILE *fd = fopen((lvname), "r"); \
+ if(fd == NULL) return JUMPNRUN_ERROR; \
+ int err = jumpnrun_load_level_header_from_file(&(lv), fd); \
+ if(err != 0) { \
+ fclose(fd); \
+ return JUMPNRUN_ERROR; \
+ } \
+ JUMPNRUN_LEVEL_MAKE_SPACE(lv); \
+ err = jumpnrun_load_level_from_file(&(lv), fd); \
+ fclose(fd); \
+ if(err != 0) return JUMPNRUN_ERROR;
+#else
+#include <drivers/fatfs/ff.h>
+
+int jumpnrun_load_level_header_from_file(jumpnrun_level *dest, FIL *fd);
+int jumpnrun_load_level_from_file (jumpnrun_level *dest, FIL *fd);
+
+#define JUMPNRUN_LEVEL_LOAD(lv, lvname) \
+ memset(&(lv), 0, sizeof(lv)); \
+ FIL fd; \
+ if(FR_OK != f_open(&fd, (lvname), FA_OPEN_EXISTING | FA_READ)) { \
+ return JUMPNRUN_ERROR; \
+ } \
+ if(0 != jumpnrun_load_level_header_from_file(&(lv), &fd)) { \
+ f_close(&fd); \
+ return JUMPNRUN_ERROR; \
+ } \
+ JUMPNRUN_LEVEL_MAKE_SPACE(lv); \
+ int err = jumpnrun_load_level_from_file(&(lv), &fd); \
+ f_close(&fd); \
+ if(err != 0) { \
+ return JUMPNRUN_ERROR; \
+ }
+#endif