Files
AnyPS5/docs/dev/debt/libSceIcu.md
T
Dean f81c7a765c Merge pull request #12630 from Lindamea1/feat/icu-space-classifiers
feat(libSceIcu): implement u_isspace, u_isblank, u_isWhitespace, u_isJavaSpaceChar and u_isUWhiteSpace
2026-10-30 02:26:13 +13:00

4.7 KiB
Raw Blame History

libSceIcu technical debt

Unknown function info

  • ICU export availability across firmware versions remains unproven. The PS5 3.20 inventory includes the implemented escape, invariant-character and version helpers. BunnyFl’s firmware 13.42 report records u_getVersion returning 78.1.0.0 under an emulator, but neither escape function is in the checked native system_ex/common_ex/lib/libSceIcu.sprx export table. Only 104 of the 661 inventory NIDs appear among that module’s 299 exports. The exports for compatibility with older firmware are retained; availability and routing across firmware versions remain unproven.

Functional

  • Space classification is unverified on a console. u_isspace, u_isblank, u_isWhitespace, u_isJavaSpaceChar and u_isUWhiteSpace follow ICU 78.1 uchar.cpp over fixed Zs, Zl, Zp and White_Space sets instead of ICU's property data; the sets are unchanged from ICU 65.1 to 78.1. Firmware 13.42 exports u_isUWhiteSpace but not the other four (#11013), which are kept from the 3.20 inventory for older firmware (see ICU export availability). Closes when: compared with the console.

  • C string helpers have no console ABI or behavior verification. Their names/NIDs are in the PS5 3.20 inventory; signatures and behavior follow ICU 78.1's cstring.cpp, unchanged since 65.1 apart from casts. Formatting accepts radices 2–16; null buffers or other radices throw an invalid-argument exception, whereas ICU dereferences the buffer and only asserts the radix. Signed minima and outputs exceeding ICU's 30-byte temporary use unsigned arithmetic and caller storage without reproducing upstream undefined behavior. Parsing uses guest LP64 strtoul and keeps the low 32 bits; a null source throws. Cross-firmware availability, native invalid-input behavior and the undefined upstream cases remain unverified.

  • Escape decoding has no behavior or ABI verification on console hardware. It follows ICU 78.1's ustring.cpp, including rejection of eight-digit braced hexadecimal escapes although its public header advertises up to eight digits. Null source or offset pointers and null callbacks with an in-range offset, which ICU dereferences, throw std::invalid_argument. A negative capacity writes nothing, as in ICU; source lengths exceeding INT32_MAX and a capacity that overflows ICU's signed destCapacity - i throw. Null-destination preflight ignores capacity. Closes when: compared with the console, including callback ABI, byte conversion, capacity limits and braced hexadecimal parsing.

  • Invariant character and version helpers are unverified on a console. u_charsToUChars, u_UCharsToChars, u_versionFromString, u_versionFromUString and u_versionToString follow ICU 78.1 uinvchar.cpp and putil.cpp, unchanged since 65.1. Firmware 13.42 reports ICU 78.1 and exports none of them (#11013); the 3.20 table has all five. Version parts use the guest strtoul, truncated to eight bits; u_versionToString keeps ICU's dropped zero tens digit (105 becomes 15). A null buffer with a positive conversion length throws; ICU dereferences it. Closes when: compared with the console.

Known export names; ABI prototypes unverified

  • The 102 sceIcuUnknown_*_nid_no_patch exports in Export.cpp are present in the PS5 3.20 export inventory from PS5-3.20_Libs. Their prototypes and behavior are unverified. Each uses the no-parameter import-resolution convention and throws through NotImplemented_nid_no_patch; these declarations make no ABI or behavior claim.