From bc098d6b9ce015e9ab7332d67c2f2b436d66b0f3 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 17 Sep 2017 18:28:52 +0300 Subject: [PATCH] Rewrite _sys_strncat --- rpcs3/Emu/Cell/Modules/sys_libc_.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp index cfb6e84cc1..284cf7c64f 100644 --- a/rpcs3/Emu/Cell/Modules/sys_libc_.cpp +++ b/rpcs3/Emu/Cell/Modules/sys_libc_.cpp @@ -275,13 +275,27 @@ vm::cptr _sys_strchr(vm::cptr str, char ch) } } -vm::ptr _sys_strncat(vm::ptr dest, vm::cptr source, u32 len) +vm::ptr _sys_strncat(vm::ptr dst, vm::cptr src, u32 max) { - sysPrxForUser.trace("_sys_strncat(dest=*0x%x, source=%s, len=%d)", dest, source, len); + sysPrxForUser.trace("_sys_strncat(dst=*0x%x %s, src=%s, max=%u)", dst, dst, src, max); - verify(HERE), std::strncat(dest.get_ptr(), source.get_ptr(), len) == dest.get_ptr(); + auto str = dst; - return dest; + while (*str) + { + str++; + } + + for (u32 i = 0; i < max; i++) + { + if (!(str[i] = src[i])) + { + return dst; + } + } + + str[max] = '\0'; + return dst; } vm::ptr _sys_strcpy(vm::ptr dst, vm::cptr src)