diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 265b1e59a57..4c3e646106b 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2562,6 +2562,12 @@ task jsinterop_math(type: RunStandaloneKonanTest) { flags = ["-r", "$buildDir", "-l", "jsmath"] } +task interop_libiconv(type: RunStandaloneKonanTest) { + disabled = (isWindows() || (project.testTarget != null)) + source = "interop/libiconv.kt" + goldValue = "72 72\n101 101\n108 108\n108 108\n111 111\n33 33\n" +} + task produce_dynamic(type: DynamicKonanTest) { disabled = (project.testTarget != null && project.testTarget != project.hostName) source = "produce_dynamic/simple/hello.kt" diff --git a/backend.native/tests/interop/libiconv.kt b/backend.native/tests/interop/libiconv.kt new file mode 100644 index 00000000000..539e5168652 --- /dev/null +++ b/backend.native/tests/interop/libiconv.kt @@ -0,0 +1,39 @@ +import kotlinx.cinterop.* +import platform.iconv.* +import platform.posix.size_tVar + +fun main(args: Array) { + + val sourceByteArray = "Hello!".toUtf8() + + val golden = listOf(0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x21) + + memScoped { + + val sourceLength = alloc() + val destLength = alloc() + + val sourceBytes = allocArrayOf(sourceByteArray) + val destBytes = allocArray(golden.size) + + val sourcePtr = alloc>() + sourcePtr.value = sourceBytes + + val destPtr = alloc>() + destPtr.value = destBytes + + sourceLength.value = sourceByteArray.size.signExtend(); + destLength.value = golden.size.signExtend(); + + val conversion = iconv_open("UTF-8", "LATIN1") + + iconv(conversion, sourcePtr.ptr, sourceLength.ptr, destPtr.ptr, destLength.ptr) + + golden.forEachIndexed { index, it -> + println("$it ${destBytes[index]}") + it == destBytes[index].toInt() + } + + iconv_close(conversion) + } +} diff --git a/platformLibs/src/platform/ios/iconv.def b/platformLibs/src/platform/ios/iconv.def new file mode 100644 index 00000000000..62478863f36 --- /dev/null +++ b/platformLibs/src/platform/ios/iconv.def @@ -0,0 +1,4 @@ +depends = posix +package = platform.iconv +headers = iconv.h +linkerOpts = -liconv diff --git a/platformLibs/src/platform/linux/iconv.def b/platformLibs/src/platform/linux/iconv.def new file mode 100644 index 00000000000..49dd9ec0ed2 --- /dev/null +++ b/platformLibs/src/platform/linux/iconv.def @@ -0,0 +1,3 @@ +depends = posix +package = platform.iconv +headers = iconv.h diff --git a/platformLibs/src/platform/linux/linux.def b/platformLibs/src/platform/linux/linux.def index 41ce9d4fd90..c4ce6bf1b6d 100644 --- a/platformLibs/src/platform/linux/linux.def +++ b/platformLibs/src/platform/linux/linux.def @@ -3,7 +3,7 @@ headers = aio.h aliases.h a.out.h argp.h argz.h byteswap.h cpio.h crypt.h \ ctype.h elf.h endian.h envz.h error.h execinfo.h features.h fmtmsg.h \ fpu_control.h \ fstab.h _G_config.h gconv.h glob.h gnu-versions.h \ - gshadow.h iconv.h ieee754.h ifaddrs.h langinfo.h lastlog.h \ + gshadow.h ieee754.h ifaddrs.h langinfo.h lastlog.h \ libintl.h libio.h link.h malloc.h mcheck.h mntent.h \ monetary.h mqueue.h \ nl_types.h nss.h obstack.h \ diff --git a/platformLibs/src/platform/osx/iconv.def b/platformLibs/src/platform/osx/iconv.def new file mode 100644 index 00000000000..62478863f36 --- /dev/null +++ b/platformLibs/src/platform/osx/iconv.def @@ -0,0 +1,4 @@ +depends = posix +package = platform.iconv +headers = iconv.h +linkerOpts = -liconv