mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 16:43:05 -05:00
C17 has no binary prefix: with base 0 or 2, strtol("0b101", &end, base)
reads the subject "0", returns 0 and leaves end at the 'b'. With glibc
2.38 or later, g++ (which defines _GNU_SOURCE) binds std::strtoll,
strtoull, strtoul, strtoimax and strtoumax to the C23 __isoc23_*
functions, which accept 0b/0B: the Linux exports returned 5 and
consumed the whole string. The Windows UCRT already follows C17, so the
same guest call gave different results on the two hosts.
strtol, strtoul, strtoll, strtoull, _Stoull, strtoimax, strtoumax and
_Stoul now return 0 with the end pointer after the '0' when, after
white space and an optional sign, the text starts with 0b or 0B and a
binary digit, in base 0 or 2. Everything else still goes to the host
function. The scanf family's %i has the same glibc behaviour; it is
recorded in TechnicalDebt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
35 lines
1.4 KiB
C++
35 lines
1.4 KiB
C++
#ifndef CORE_LIBS_PRX_LIBC_INCLUDE_GENERAL_HPP
|
|
#define CORE_LIBS_PRX_LIBC_INCLUDE_GENERAL_HPP
|
|
|
|
#include <stdexcept>
|
|
#include <filesystem>
|
|
#include <vector>
|
|
|
|
#include "general/LogMacros.hpp"
|
|
#include "general/VabiMacros.hpp"
|
|
#include "general/ExportMacros.hpp"
|
|
|
|
extern "C" void NotImplemented_nid_no_patch(const char* funcName);
|
|
extern "C" void CxaFinalize_nid_no_patch(void* dsoHandle);
|
|
extern "C" bool StopAtBinaryPrefix_nid_no_patch(const char* str, char** endptr, int base);
|
|
|
|
extern "C" std::filesystem::path ResolvePath_nid_no_patch(const char* path);
|
|
// Guest path aliases: a guest prefix such as "/savedata0" (a save-data mount point) resolves to a host
|
|
// directory instead of the run directory; the prefix matches whole path components only.
|
|
extern "C" void AddPathAlias_nid_no_patch(const char* guestPrefix, const char* hostPath);
|
|
extern "C" void RemovePathAlias_nid_no_patch(const char* guestPrefix);
|
|
extern "C" void RecordWrittenPath_nid_no_patch(const std::filesystem::path& path);
|
|
extern "C" std::vector<std::filesystem::path> WrittenPaths_nid_no_patch();
|
|
extern "C" void SyncWrittenPaths_nid_no_patch();
|
|
extern "C" void BlockPathAlias_nid_no_patch(const char* guestPrefix);
|
|
|
|
#define APS5_INVALID_ARG_EX throw std::invalid_argument(std::string(__func__) + ": invalid argument")
|
|
|
|
#define APS5_DUMMY_FUN \
|
|
int DummyFunction_nid_no_patch() { \
|
|
NotImplemented_nid_no_patch(__func__); \
|
|
return 0; \
|
|
}
|
|
|
|
#endif
|