]> gitweb.michael.orlitzky.com - iconv-quirks.git/commitdiff
main.c: add test_nid_drops_untranslatable()
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 6 Jul 2026 23:16:22 +0000 (19:16 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 6 Jul 2026 23:16:22 +0000 (19:16 -0400)
main.c

diff --git a/main.c b/main.c
index 763f831ff511919e0130eb6ea07c034ad2d603e5..631fbb5e12e52d31eb3fe6684d6af641b93cd10c 100644 (file)
--- a/main.c
+++ b/main.c
@@ -466,6 +466,47 @@ static int test_translit_does_not_fail_on_untranslatable() {
   return SUCCESS;
 }
 
+static int test_nid_drops_untranslatable() {
+  iconv_t cd;
+  const char* fromcode = "UTF-8";
+  const char* tocode = "ASCII//NON_IDENTICAL_DISCARD";
+
+  printf("%-60s", "iconv() with //NON_IDENTICAL_DISCARD discards...");
+  if (_my_iconv_open(&cd, tocode, fromcode) == FAILURE) {
+    printf("ERROR (iconv_open)\n");
+    return FAILURE;
+  }
+
+  size_t insize = 4, outsize = 10;
+  char inbuf[4] = {'h', 0xC3, 0x96, 'i'}; // hüi
+  char outbuf[10] = {0};
+  char* inptr = inbuf;
+  char* outptr = outbuf;
+
+  size_t result = iconv(cd, &inptr, &insize, &outptr, &outsize);
+
+  if (result == (size_t)(-1)) {
+    int saved_errno = errno; // iconv_close() clobbers it
+
+    if (_my_iconv_close(&cd) == FAILURE) {
+      printf("ERROR (iconv_close)\n");
+    }
+    else {
+      printf("FAIL (%s)\n", ERRNO_STR(saved_errno));
+    }
+
+    return FAILURE;
+  }
+
+  if (strcmp(outbuf, "hi") != 0) {
+    printf("FAIL (outbuf=%s)\n", outbuf);
+    return FAILURE;
+  }
+
+  printf("OK\n", outbuf);
+  return SUCCESS;
+}
+
 int main(int argc, char** argv) {
   int result = SUCCESS;
 
@@ -510,7 +551,7 @@ int main(int argc, char** argv) {
   }
 
   if (non_identical_discard == SUCCESS) {
-    //result |= test_nid_drops_untranslatable();
+    result |= test_nid_drops_untranslatable();
     //result |= test_nid_fails_on_incomplete_multibyte();
   }