mirror of
https://github.com/libretro/parallel-gx1.git
synced 2026-11-07 12:37:59 -10:00
Every file the core touches goes through libretro-common's filestream, path and dirent layers, taken from RetroArch: vfs_hybrid opens local paths with libretro-common's own implementation and hands URI paths (and, on Android, anything a local open cannot reach) to the frontend's VFS. File::IOFile and File::DirectIOFile sit on RFILE, and FileUtil, FileSearch and the directory walks on path_stat, path_mkdir and retro_opendir. Dolphin's fopen, POSIX and Win32 file code, std::filesystem and std::fstream are gone, with the dual VFS paths and the core option that chose between them. Files opened for reading alone are memory-mapped where the platform can: reads copy straight out of the page cache, DirectIOFile's offset reads on one mapped object are thread safe, and GetMappedPtr(), View() and Prefetch() lend and warm without a copy. Text files are read a line at a time through File::LineReader, lent from the mapping or a window refilled a block at a time, never a byte at a time; JSON is parsed straight from the mapping. Ini files and the cheat file are built in memory and written once, an ini only when it changed and then atomically.
92 lines
2.5 KiB
C++
92 lines
2.5 KiB
C++
// Copyright 2009 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#ifdef _WIN32
|
|
#include <optional>
|
|
#ifdef __LIBRETRO__
|
|
#include <windows.h>
|
|
#include <appmodel.h>
|
|
#endif
|
|
#endif
|
|
#include <string>
|
|
#ifdef __MINGW32__
|
|
#include <sys/stat.h>
|
|
#endif
|
|
|
|
#ifdef __APPLE__
|
|
#include "Common/CommonTypes.h"
|
|
#endif
|
|
|
|
#ifndef _WIN32
|
|
|
|
// go to debugger mode
|
|
#define Crash() \
|
|
{ \
|
|
__builtin_trap(); \
|
|
}
|
|
|
|
#else // WIN32
|
|
// Function Cross-Compatibility
|
|
#define strcasecmp _stricmp
|
|
#define strncasecmp _strnicmp
|
|
#define unlink _unlink
|
|
#define vscprintf _vscprintf
|
|
|
|
#define atoll _atoi64
|
|
#ifndef __MINGW32__
|
|
#define stat _stat64
|
|
#define fstat _fstat64
|
|
#endif
|
|
#define fileno _fileno
|
|
|
|
extern "C" {
|
|
__declspec(dllimport) void __stdcall DebugBreak(void);
|
|
}
|
|
#define Crash() \
|
|
{ \
|
|
DebugBreak(); \
|
|
}
|
|
#endif // _WIN32
|
|
|
|
namespace Common
|
|
{
|
|
// strerror_r wrapper to handle XSI and GNU versions.
|
|
const char* StrErrorWrapper(int error, char* buffer, std::size_t length);
|
|
|
|
// Wrapper functions to get strerror(errno) string, which itself is not threadsafe.
|
|
// These functions might change the error code.
|
|
std::string StrerrorString(int error);
|
|
std::string LastStrerrorString();
|
|
|
|
#ifdef _WIN32
|
|
// Wrapper function to get GetLastError() string.
|
|
// This function might change the error code.
|
|
std::string GetLastErrorString();
|
|
|
|
// Like GetLastErrorString() but if you have already queried the error code.
|
|
std::string GetWin32ErrorString(unsigned long error_code);
|
|
|
|
// Obtains a full path to the specified module.
|
|
std::optional<std::wstring> GetModuleName(void* hInstance);
|
|
#endif
|
|
|
|
#ifdef __APPLE__
|
|
struct MacOSVersion // NSOperatingSystemVersion
|
|
{
|
|
s64 major; // NSInteger majorVersion
|
|
s64 minor; // NSInteger minorVersion
|
|
s64 patch; // NSInteger patchVersion
|
|
};
|
|
|
|
// Helper function to get the current macOS version, which is easy to do with
|
|
// from Objective-C code, but a little harder from C++.
|
|
MacOSVersion GetMacOSVersion();
|
|
#endif
|
|
|
|
#ifdef __LIBRETRO__
|
|
extern bool is_uwp();
|
|
#endif
|
|
} // namespace Common
|