SDL: Filesystem module

From 41d6c80b0710f5a977fb4ccffc5f6833819cebb7 Mon Sep 17 00:00:00 2001
From: Ivan Epifanov <[EMAIL REDACTED]>
Date: Mon, 2 Nov 2020 19:01:25 +0300
Subject: [PATCH] Filesystem module

---
 Makefile.vita.dolce                     |  2 +-
 include/SDL_config_vita.h               |  4 +-
 src/filesystem/vita/SDL_sysfilesystem.c | 95 +++++++++++++++++++++++++
 3 files changed, 97 insertions(+), 4 deletions(-)
 create mode 100644 src/filesystem/vita/SDL_sysfilesystem.c

diff --git a/Makefile.vita.dolce b/Makefile.vita.dolce
index c9ca1ca88..2b12b25d1 100644
--- a/Makefile.vita.dolce
+++ b/Makefile.vita.dolce
@@ -18,7 +18,7 @@ SOURCES = \
 	src/loadso/dummy/*.c \
 	src/power/*.c \
 	src/power/vita/*.c \
-	src/filesystem/dummy/*.c \
+	src/filesystem/vita/*.c \
 	src/render/*.c \
 	src/render/software/*.c \
 	src/render/opengles2/SDL_render_gles2.c \
diff --git a/include/SDL_config_vita.h b/include/SDL_config_vita.h
index d03aae3e1..05cba8f73 100644
--- a/include/SDL_config_vita.h
+++ b/include/SDL_config_vita.h
@@ -136,15 +136,13 @@
 #define SDL_TIMERS_VITA 1
 #define SDL_POWER_VITA 1
 #define SDL_VIDEO_DRIVER_VITA  1
+#define SDL_FILESYSTEM_VITA   1
 
 
 #define SDL_VIDEO_RENDER_OGL_ES2 1
 #define SDL_VIDEO_OPENGL_ES2 1
 
 
-/* !!! FIXME: what does VITA do for filesystem stuff? */
-#define SDL_FILESYSTEM_DUMMY   1
-
 /* VITA doesn't have haptic device (src/haptic/dummy/\*.c) */
 #define SDL_HAPTIC_DISABLED    1
 
diff --git a/src/filesystem/vita/SDL_sysfilesystem.c b/src/filesystem/vita/SDL_sysfilesystem.c
new file mode 100644
index 000000000..ba7732e57
--- /dev/null
+++ b/src/filesystem/vita/SDL_sysfilesystem.c
@@ -0,0 +1,95 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "../../SDL_internal.h"
+
+#ifdef SDL_FILESYSTEM_VITA
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* System dependent filesystem routines                                */
+
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <psp2/kernel/iofilemgr.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <fcntl.h>
+
+#include "SDL_error.h"
+#include "SDL_stdinc.h"
+#include "SDL_filesystem.h"
+#include "SDL_rwops.h"
+
+char *
+SDL_GetBasePath(void)
+{
+    const char *basepath = "app:/";
+    char *retval = SDL_strdup(basepath);
+    return retval;
+}
+
+char *
+SDL_GetPrefPath(const char *org, const char *app)
+{
+    const char *envr = "ux0:/data/";
+    char *retval = NULL;
+    char *ptr = NULL;
+    size_t len = 0;
+
+    if (!app) {
+        SDL_InvalidParamError("app");
+        return NULL;
+    }
+    if (!org) {
+        org = "";
+    }
+
+    len = SDL_strlen(envr);
+
+    len += SDL_strlen(org) + SDL_strlen(app) + 3;
+    retval = (char *) SDL_malloc(len);
+    if (!retval) {
+        SDL_OutOfMemory();
+        return NULL;
+    }
+
+    if (*org) {
+        SDL_snprintf(retval, len, "%s%s/%s/", envr, org, app);
+    } else {
+        SDL_snprintf(retval, len, "%s%s/", envr, app);
+    }
+
+    for (ptr = retval+1; *ptr; ptr++) {
+        if (*ptr == '/') {
+            *ptr = '\0';
+            sceIoMkdir(retval, 0777);
+            *ptr = '/';
+        }
+    }
+    sceIoMkdir(retval, 0777);
+
+    return retval;
+}
+
+#endif /* SDL_FILESYSTEM_VITA */
+
+/* vi: set ts=4 sw=4 expandtab: */