diff --git a/src/core/hle/libraries/libc/libc.cpp b/src/core/hle/libraries/libc/libc.cpp index 127c3eb9c..b73e1d8f5 100644 --- a/src/core/hle/libraries/libc/libc.cpp +++ b/src/core/hle/libraries/libc/libc.cpp @@ -455,6 +455,9 @@ void libcSymbolsRegister(Loader::SymbolsResolver* sym) { LIB_FUNCTION("DfivPArhucg", "libc", 1, "libc", 1, 1, ps4_memcmp); LIB_FUNCTION("Q3VBxCXhUHs", "libc", 1, "libc", 1, 1, ps4_memcpy); LIB_FUNCTION("8zTFvBIAIN8", "libc", 1, "libc", 1, 1, ps4_memset); + LIB_FUNCTION("9yDWMxEFdJU", "libc", 1, "libc", 1, 1, ps4_strrchr); + LIB_FUNCTION("aesyjrHVWy4", "libc", 1, "libc", 1, 1, ps4_strncmp); + LIB_FUNCTION("g7zzzLDYGw0", "libc", 1, "libc", 1, 1, ps4_strdup); // stdio functions LIB_FUNCTION("xeYO4u7uyJ0", "libc", 1, "libc", 1, 1, ps4_fopen); @@ -462,6 +465,11 @@ void libcSymbolsRegister(Loader::SymbolsResolver* sym) { LIB_FUNCTION("Q2V+iqvjgC0", "libc", 1, "libc", 1, 1, ps4_vsnprintf); LIB_FUNCTION("YQ0navp+YIc", "libc", 1, "libc", 1, 1, ps4_puts); LIB_FUNCTION("fffwELXNVFA", "libc", 1, "libc", 1, 1, ps4_fprintf); + LIB_FUNCTION("QMFyLoqNxIg", "libc", 1, "libc", 1, 1, ps4_setvbuf); + LIB_FUNCTION("uodLYyUip20", "libc", 1, "libc", 1, 1, ps4_fclose); + LIB_FUNCTION("rQFVBXp-Cxg", "libc", 1, "libc", 1, 1, ps4_fseek); + LIB_FUNCTION("SHlt7EhOtqA", "libc", 1, "libc", 1, 1, ps4_fgetpos); + LIB_FUNCTION("lbB+UlZqVG0", "libc", 1, "libc", 1, 1, ps4_fread); // misc LIB_OBJ("P330P3dFF68", "libc", 1, "libc", 1, 1, &g_need_sceLibc); diff --git a/src/core/hle/libraries/libc/libc_stdio.cpp b/src/core/hle/libraries/libc/libc_stdio.cpp index 67568e297..4292ed1ff 100644 --- a/src/core/hle/libraries/libc/libc_stdio.cpp +++ b/src/core/hle/libraries/libc/libc_stdio.cpp @@ -10,7 +10,38 @@ namespace Core::Libraries::LibC { std::FILE* PS4_SYSV_ABI ps4_fopen(const char* filename, const char* mode) { auto* mnt = Common::Singleton::Instance(); - return std::fopen(mnt->GetHostFile(filename).c_str(), mode); + FILE* f = std::fopen(mnt->GetHostFile(filename).c_str(), mode); + if (f != nullptr) { + LOG_INFO(Lib_LibC, "fopen = {}", mnt->GetHostFile(filename).c_str()); + } else { + LOG_INFO(Lib_LibC, "fopen can't open = {}", mnt->GetHostFile(filename).c_str()); + } + return f; +} + +int PS4_SYSV_ABI ps4_fclose(FILE* stream) { + LOG_INFO(Lib_LibC, "callled"); + int ret = 0; + if (stream != nullptr) { + ret = fclose(stream); + } + return ret; +} + +int PS4_SYSV_ABI ps4_setvbuf(FILE* stream, char* buf, int mode, size_t size) { + return setvbuf(stream, buf, mode, size); +} + +int PS4_SYSV_ABI ps4_fseek(FILE* stream, long offset, int whence) { + return fseek(stream, offset, whence); +} + +int PS4_SYSV_ABI ps4_fgetpos(FILE* stream, fpos_t* pos) { + return fgetpos(stream, pos); +} + +std::size_t PS4_SYSV_ABI ps4_fread(void* ptr, size_t size, size_t nmemb, FILE* stream) { + return fread(ptr, size, nmemb, stream); } int PS4_SYSV_ABI ps4_printf(VA_ARGS) { diff --git a/src/core/hle/libraries/libc/libc_stdio.h b/src/core/hle/libraries/libc/libc_stdio.h index c2911f36a..4ba18e9f6 100644 --- a/src/core/hle/libraries/libc/libc_stdio.h +++ b/src/core/hle/libraries/libc/libc_stdio.h @@ -13,5 +13,10 @@ int PS4_SYSV_ABI ps4_printf(VA_ARGS); int PS4_SYSV_ABI ps4_vsnprintf(char* s, size_t n, const char* format, VaList* arg); int PS4_SYSV_ABI ps4_puts(const char* s); int PS4_SYSV_ABI ps4_fprintf(FILE* file, VA_ARGS); +int PS4_SYSV_ABI ps4_setvbuf(FILE* stream, char* buf, int mode, size_t size); +int PS4_SYSV_ABI ps4_fclose(FILE* stream); +int PS4_SYSV_ABI ps4_fseek(FILE* stream, long offset, int whence); +int PS4_SYSV_ABI ps4_fgetpos(FILE* stream, fpos_t* pos); +std::size_t PS4_SYSV_ABI ps4_fread(void* ptr, size_t size, size_t nmemb, FILE* stream); } // namespace Core::Libraries::LibC diff --git a/src/core/hle/libraries/libc/libc_string.cpp b/src/core/hle/libraries/libc/libc_string.cpp index 80ce63253..55fb3f1fc 100644 --- a/src/core/hle/libraries/libc/libc_string.cpp +++ b/src/core/hle/libraries/libc/libc_string.cpp @@ -42,4 +42,19 @@ size_t PS4_SYSV_ABI ps4_strlen(const char* str) { return std::strlen(str); } +char* PS4_SYSV_ABI ps4_strrchr(const char* s, int c) { + return (char*)strrchr(s, c); +} + +int PS4_SYSV_ABI ps4_strncmp(const char* s1, const char* s2, size_t n) { + return strncmp(s1, s2, n); +} + +char* PS4_SYSV_ABI ps4_strdup(const char* str1) { + char* dup = (char*)std::malloc(std::strlen(str1) + 1); + if (dup != NULL) + strcpy(dup, str1); + return dup; +} + } // namespace Core::Libraries::LibC diff --git a/src/core/hle/libraries/libc/libc_string.h b/src/core/hle/libraries/libc/libc_string.h index f8a197ee3..d446146b9 100644 --- a/src/core/hle/libraries/libc/libc_string.h +++ b/src/core/hle/libraries/libc/libc_string.h @@ -17,5 +17,8 @@ void* PS4_SYSV_ABI ps4_memmove(void* dest, const void* src, std::size_t count); char* PS4_SYSV_ABI ps4_strcpy(char* destination, const char* source); char* PS4_SYSV_ABI ps4_strcat(char* dest, const char* src); size_t PS4_SYSV_ABI ps4_strlen(const char* str); +char* PS4_SYSV_ABI ps4_strrchr(const char* s, int c); +int PS4_SYSV_ABI ps4_strncmp(const char* s1, const char* s2, size_t n); +char* PS4_SYSV_ABI ps4_strdup(const char* str1); } // namespace Core::Libraries::LibC