mirror of
https://github.com/libretro/Play-.git
synced 2025-02-23 13:10:32 +00:00
Implement strtok in SYSCLIB.
This commit is contained in:
parent
0af2355c52
commit
285cc21778
@ -83,6 +83,9 @@ std::string CSysclib::GetFunctionName(unsigned int functionId) const
|
||||
case 34:
|
||||
return "strstr";
|
||||
break;
|
||||
case 35:
|
||||
return "strtok";
|
||||
break;
|
||||
case 36:
|
||||
return "strtol";
|
||||
break;
|
||||
@ -228,6 +231,12 @@ void CSysclib::Invoke(CMIPS& context, unsigned int functionId)
|
||||
context.m_State.nGPR[CMIPS::A1].nV0
|
||||
);
|
||||
break;
|
||||
case 35:
|
||||
context.m_State.nGPR[CMIPS::V0].nD0 = __strtok(
|
||||
context.m_State.nGPR[CMIPS::A0].nV0,
|
||||
context.m_State.nGPR[CMIPS::A1].nV0
|
||||
);
|
||||
break;
|
||||
case 36:
|
||||
context.m_State.nGPR[CMIPS::V0].nD0 = static_cast<int32>(__strtol(
|
||||
context.m_State.nGPR[CMIPS::A0].nV0,
|
||||
@ -456,6 +465,40 @@ uint32 CSysclib::__strstr(uint32 str1Ptr, uint32 str2Ptr)
|
||||
return str1Ptr + ptrDiff;
|
||||
}
|
||||
|
||||
uint32 CSysclib::__strtok(uint32 sPtr, uint32 delimPtr)
|
||||
{
|
||||
auto delim = reinterpret_cast<const char*>(m_ram + delimPtr);
|
||||
|
||||
if(sPtr != 0)
|
||||
{
|
||||
m_strtok_prevSPtr = sPtr;
|
||||
}
|
||||
else if(m_strtok_prevSPtr == 0)
|
||||
{
|
||||
//If sPtr == 0 && prevSPtr == 0
|
||||
return 0;
|
||||
}
|
||||
auto s = reinterpret_cast<char*>(m_ram + m_strtok_prevSPtr);
|
||||
|
||||
auto str = s + strspn(s, delim);
|
||||
s = str + strcspn(str, delim);
|
||||
if(s == str)
|
||||
{
|
||||
m_strtok_prevSPtr = 0;
|
||||
return 0;
|
||||
}
|
||||
if(*s)
|
||||
{
|
||||
(*s) = 0;
|
||||
m_strtok_prevSPtr = (reinterpret_cast<uint8*>(s) - m_ram) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_strtok_prevSPtr = 0;
|
||||
}
|
||||
return reinterpret_cast<uint8*>(str) - m_ram;
|
||||
}
|
||||
|
||||
uint32 CSysclib::__strcspn(uint32 str1Ptr, uint32 str2Ptr)
|
||||
{
|
||||
auto str1 = reinterpret_cast<const char*>(m_ram + str1Ptr);
|
||||
|
@ -52,12 +52,15 @@ namespace Iop
|
||||
uint32 __strchr(uint32, uint32);
|
||||
uint32 __strrchr(uint32, uint32);
|
||||
uint32 __strstr(uint32, uint32);
|
||||
uint32 __strtok(uint32, uint32);
|
||||
uint32 __strcspn(uint32, uint32);
|
||||
uint32 __strtol(uint32, uint32, uint32);
|
||||
uint32 __wmemcopy(uint32, uint32, uint32);
|
||||
uint32 __vsprintf(CMIPS&, uint32, uint32, uint32);
|
||||
|
||||
uint8* m_ram = nullptr;
|
||||
uint8* m_spr = nullptr;
|
||||
uint32 m_strtok_prevSPtr = 0;
|
||||
CStdio& m_stdio;
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user