Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions core/libs/prx/libc/include/Api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -941,7 +941,12 @@ const char* APS5_VABI strchr_nid_postfix(const char* s, int c);
char* APS5_VABI index_nid_postfix(const char* s, int c);
char* APS5_VABI strrchr_nid_postfix(const char* s, int c);
char* APS5_VABI rindex_nid_postfix(const char* s, int c);
int APS5_VABI ffs_nid_postfix(int value);
int APS5_VABI ffsl_nid_postfix(std::int64_t value);
int APS5_VABI ffsll_nid_postfix(std::int64_t value);
int APS5_VABI fls_nid_postfix(int mask);
int APS5_VABI flsl_nid_postfix(std::int64_t mask);
int APS5_VABI flsll_nid_postfix(std::int64_t mask);
char* APS5_VABI strstr_nid_postfix(const char* haystack, const char* needle);
size_t APS5_VABI strlcpy_nid_postfix(char* dest, const char* src, size_t size);
std::int64_t APS5_VABI strtol_nid_postfix(const char* str, char** endptr, int base);
Expand Down
20 changes: 20 additions & 0 deletions core/libs/prx/libc/src/Strings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,10 +339,30 @@ char* APS5_VABI rindex_nid_postfix(const char* s, int c) {
return strrchr_nid_postfix(s, c);
}

int APS5_VABI ffs_nid_postfix(int value) {
return value == 0 ? 0 : std::countr_zero(static_cast<unsigned int>(value)) + 1;
}

int APS5_VABI ffsl_nid_postfix(std::int64_t value) {
return value == 0 ? 0 : std::countr_zero(static_cast<std::uint64_t>(value)) + 1;
}

int APS5_VABI ffsll_nid_postfix(std::int64_t value) {
return value == 0 ? 0 : std::countr_zero(static_cast<std::uint64_t>(value)) + 1;
}

int APS5_VABI fls_nid_postfix(int mask) {
return mask == 0 ? 0 : 32 - std::countl_zero(static_cast<std::uint32_t>(mask));
}

int APS5_VABI flsl_nid_postfix(std::int64_t mask) {
return mask == 0 ? 0 : 64 - std::countl_zero(static_cast<std::uint64_t>(mask));
}

int APS5_VABI flsll_nid_postfix(std::int64_t mask) {
return mask == 0 ? 0 : 64 - std::countl_zero(static_cast<std::uint64_t>(mask));
}

char* APS5_VABI strstr_nid_postfix(const char* haystack, const char* needle) {
return std::strstr(const_cast<char*>(haystack), needle);
}
Expand Down
10 changes: 10 additions & 0 deletions core/libs/tests/GuestWideStrings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,8 +400,18 @@ int main() {
const char path[] = "a/b/c";
require(rindex_nid_postfix(path, '/') == path + 3 && rindex_nid_postfix(path, 'x') == nullptr);
require(rindex_nid_postfix(path, 0) == path + 5);
require(ffs_nid_postfix(0) == 0 && ffs_nid_postfix(1) == 1 && ffs_nid_postfix(0x80) == 8);
require(ffs_nid_postfix(0x1000) == 13 && ffs_nid_postfix(INT_MIN) == 32 && ffs_nid_postfix(-1) == 1);
require(ffsl_nid_postfix(0) == 0 && ffsl_nid_postfix(1) == 1 && ffsl_nid_postfix(0x80) == 8);
require(ffsl_nid_postfix(0x100000000ll) == 33 && ffsl_nid_postfix(INT64_MIN) == 64 && ffsl_nid_postfix(-1) == 1);
require(ffsll_nid_postfix(0) == 0 && ffsll_nid_postfix(1) == 1 && ffsll_nid_postfix(0x80) == 8);
require(ffsll_nid_postfix(0x100000000ll) == 33 && ffsll_nid_postfix(LLONG_MIN) == 64 && ffsll_nid_postfix(-1) == 1);
require(fls_nid_postfix(0) == 0 && fls_nid_postfix(1) == 1 && fls_nid_postfix(0x80) == 8);
require(fls_nid_postfix(0x40000000) == 31 && fls_nid_postfix(INT_MIN) == 32 && fls_nid_postfix(-1) == 32);
require(flsl_nid_postfix(0) == 0 && flsl_nid_postfix(1) == 1 && flsl_nid_postfix(0x80) == 8);
require(flsl_nid_postfix(0x100000000ll) == 33 && flsl_nid_postfix(INT64_MIN) == 64 && flsl_nid_postfix(-1) == 64);
require(flsll_nid_postfix(0) == 0 && flsll_nid_postfix(1) == 1 && flsll_nid_postfix(0x80) == 8);
require(flsll_nid_postfix(0x100000000ll) == 33 && flsll_nid_postfix(LLONG_MIN) == 64 && flsll_nid_postfix(-1) == 64);
}
return 0;
}
Loading