From 323a11fa9ff25345567124f108013b8704d53b9a Mon Sep 17 00:00:00 2001 From: RDW Date: Sat, 16 Aug 2025 18:57:52 +0200 Subject: [PATCH] Runtime: Fix oversights in the high-level iconv wrapper When converting multiple inputs using the same read buffer, appending to it without first resetting the cursor ensures the result is garbled. It also looks like the default values for input and output encoding were accidentally hardcoded. --- Runtime/Bindings/FFI/iconv/iconv.lua | 5 +++-- Tests/BDD/iconv-library.spec.lua | 18 +++++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Runtime/Bindings/FFI/iconv/iconv.lua b/Runtime/Bindings/FFI/iconv/iconv.lua index 6e6eafc2a..e3247b845 100644 --- a/Runtime/Bindings/FFI/iconv/iconv.lua +++ b/Runtime/Bindings/FFI/iconv/iconv.lua @@ -73,9 +73,10 @@ function iconv.convert(input, inputEncoding, outputEncoding) readBuffer = readBuffer or buffer.new(256) writeBuffer = writeBuffer or buffer.new(256) + readBuffer:reset() readBuffer:put(input) local readCursor = readBuffer:ref() - request.input.charset = "CP949" + request.input.charset = inputEncoding request.input.buffer = readCursor request.input.length = #input request.input.remaining = #input @@ -85,7 +86,7 @@ function iconv.convert(input, inputEncoding, outputEncoding) writeBuffer:reset() local writeCursor, writeBufferCapacity = writeBuffer:reserve(maxRequiredWriteBufferSize) - request.output.charset = "UTF-8" + request.output.charset = outputEncoding request.output.buffer = writeCursor request.output.length = writeBufferCapacity request.output.remaining = writeBufferCapacity diff --git a/Tests/BDD/iconv-library.spec.lua b/Tests/BDD/iconv-library.spec.lua index 5021806eb..6ab857cdf 100644 --- a/Tests/BDD/iconv-library.spec.lua +++ b/Tests/BDD/iconv-library.spec.lua @@ -166,14 +166,16 @@ describe("iconv", function() local input = "유저인터페이스" assertFailure(function() return iconv.convert(input, "INVALID_ENCODING", "UTF-8") - end, iconv.strerror(ffi.C.ICONV_CONVERSION_FAILED)) + -- TBD: This is what the library returns - even though it's misleading at best (?) + end, iconv.strerror(ffi.C.ICONV_INCOMPLETE_INPUT)) end) it("should fail if given an invalid output encoding", function() local input = "유저인터페이스" assertFailure(function() - return iconv.convert(input, "UTF-8", "INVALID_ENCODING") - end, iconv.strerror(ffi.C.ICONV_CONVERSION_FAILED)) + return iconv.convert(input, "CP949", "INVALID_ENCODING") + -- TBD: This is what the library returns - even though it's misleading at best (?) + end, iconv.strerror(ffi.C.ICONV_INCOMPLETE_INPUT)) end) it("should throw if a non-string input was passed", function() @@ -202,6 +204,16 @@ describe("iconv", function() "Expected argument outputEncoding to be a string value, but received a number value instead" assertThrows(convertWithInvalidOutputEncoding, expectedErrorMessage) end) + + it("should be able to convert multiple inputs using the same buffer", function() + local output, result = iconv.convert("First", "ASCII", "UTF-8") + assertEquals(output, "First") + assertEquals(result, iconv.strerror(ffi.C.ICONV_RESULT_OK)) + + output, result = iconv.convert("Second", "ASCII", "UTF-8") + assertEquals(output, "Second") + assertEquals(result, iconv.strerror(ffi.C.ICONV_RESULT_OK)) + end) end) describe("strerror", function()