#include "SceTypes.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include #include #include #include extern "C" { int APS5_VABI sceConvertKeycodeGetVirtualKeycode(std::uint16_t, std::uint32_t, std::uint16_t*); int APS5_VABI sceConvertKeycodeGetImeKeyboardType(std::int32_t, std::uint32_t*); int APS5_VABI sceConvertKeycodeGetCharacter(std::uint16_t, std::uint32_t, std::uint32_t, char16_t*); } static void Require(bool value) { if (!value) std::abort(); } int main() { constexpr int invalidAddress = static_cast(0x80BC0031u); constexpr int invalidUserId = static_cast(0x80BC0010u); Require(sceConvertKeycodeGetImeKeyboardType(0, nullptr) == invalidAddress); Require(sceConvertKeycodeGetImeKeyboardType(-1, nullptr) == invalidAddress); std::uint16_t virtualKey = 0xABCD; Require(sceConvertKeycodeGetVirtualKeycode(4, 0, nullptr) == invalidAddress); Require(sceConvertKeycodeGetVirtualKeycode(4, 0, &virtualKey) == static_cast(0x80BC001Du)); Require(virtualKey == 0xABCD); Require(sceConvertKeycodeGetVirtualKeycode(4, 40, &virtualKey) == static_cast(0x80BC001Du)); Require(sceConvertKeycodeGetVirtualKeycode(4, 4, &virtualKey) == 0 && virtualKey == 65); Require(sceConvertKeycodeGetVirtualKeycode(4, 9, &virtualKey) == 0 && virtualKey == 81); Require(sceConvertKeycodeGetVirtualKeycode(100, 4, &virtualKey) == 0 && virtualKey == 255); Require(sceConvertKeycodeGetVirtualKeycode(136, 24, &virtualKey) == 0 && virtualKey == 21); Require(sceConvertKeycodeGetVirtualKeycode(65535, 4, &virtualKey) == 0 && virtualKey == 255); for (std::uint32_t layout : {2u, 3u, 12u, 31u, 39u}) { virtualKey = 0xABCD; bool rejected = false; try { sceConvertKeycodeGetVirtualKeycode(28, layout, &virtualKey); } catch (const std::runtime_error&) { rejected = true; } Require(rejected && virtualKey == 0xABCD); } std::uint32_t type = 0xFFFFFFFFu; Require(sceConvertKeycodeGetImeKeyboardType(-1, &type) == invalidUserId); Require(type == 0xFFFFFFFFu); bool rejected = false; try { sceConvertKeycodeGetImeKeyboardType(0, &type); } catch (const std::runtime_error&) { rejected = true; } Require(rejected && type == 0xFFFFFFFFu); Require(sceConvertKeycodeGetCharacter(4, 0, 0, nullptr) == invalidAddress); char16_t character = u'?'; Require(sceConvertKeycodeGetCharacter(4, 0, 0, &character) == static_cast(0x80BC001Du)); Require(character == u'?'); Require(sceConvertKeycodeGetCharacter(4, 0, 40, &character) == static_cast(0x80BC001Du)); for (std::uint32_t state : {0u, 0x4000000u}) { Require(sceConvertKeycodeGetCharacter(4, state, 4, &character) == 0 && character == u'a'); Require(sceConvertKeycodeGetCharacter(30, state, 4, &character) == 0 && character == u'1'); Require(sceConvertKeycodeGetCharacter(58, state, 4, &character) == 0 && character == 0); Require(sceConvertKeycodeGetCharacter(65535, state, 4, &character) == 0 && character == 0); } Require(sceConvertKeycodeGetCharacter(4, 0x200, 4, &character) == 0 && character == u'A'); Require(sceConvertKeycodeGetCharacter(4, 0x20000, 4, &character) == 0 && character == u'A'); Require(sceConvertKeycodeGetCharacter(4, 0x20200, 4, &character) == 0 && character == u'a'); Require(sceConvertKeycodeGetCharacter(30, 0x200, 4, &character) == 0 && character == u'!'); Require(sceConvertKeycodeGetCharacter(89, 0, 4, &character) == 0 && character == 0); Require(sceConvertKeycodeGetCharacter(89, 0x10000, 4, &character) == 0 && character == u'1'); Require(sceConvertKeycodeGetCharacter(89, 0x10200, 4, &character) == 0 && character == u'1'); Require(sceConvertKeycodeGetCharacter(4, 0, 9, &character) == 0 && character == u'q'); Require(sceConvertKeycodeGetCharacter(28, 0, 2, &character) == 0 && character == u'z'); Require(sceConvertKeycodeGetCharacter(20, 0x4000, 2, &character) == 0 && character == u'@'); Require(sceConvertKeycodeGetCharacter(47, 0x20000, 3, &character) == 0 && character == 220); Require(sceConvertKeycodeGetCharacter(47, 0x20200, 3, &character) == 0 && character == 200); Require(sceConvertKeycodeGetCharacter(4, 0x4000000, 24, &character) == 0 && character == 0x3141); Require(sceConvertKeycodeGetCharacter(5, 0x4000000, 30, &character) == 0 && character == 1575); Require(sceConvertKeycodeGetCharacter(5, 0x4000200, 30, &character) == 0 && character == 1570); Require(sceConvertKeycodeGetCharacter(30, 0x4000300, 30, &character) == 0 && character == 0x200D); Require(sceConvertKeycodeGetCharacter(31, 0x4000300, 30, &character) == 0 && character == 0x200C); Require(sceConvertKeycodeGetCharacter(32, 0x4000300, 30, &character) == 0 && character == 0x200E); Require(sceConvertKeycodeGetCharacter(33, 0x4000300, 30, &character) == 0 && character == 0x200F); for (std::uint32_t layout = 1; layout <= 30; ++layout) { for (std::uint16_t key : {83, 224, 225, 226, 227, 228, 229, 230, 231}) { Require(sceConvertKeycodeGetCharacter(key, 0xFFFFFFFFu, layout, &character) == 0 && character == 0); } } return 0; }