iconv regression test
authorSzabolcs Nagy <nsz@port70.net>
Thu, 22 Jun 2017 23:27:15 +0000 (23:27 +0000)
committerSzabolcs Nagy <nsz@port70.net>
Thu, 22 Jun 2017 23:27:15 +0000 (23:27 +0000)
src/regression/iconv-roundtrips.c [new file with mode: 0644]

diff --git a/src/regression/iconv-roundtrips.c b/src/regression/iconv-roundtrips.c
new file mode 100644 (file)
index 0000000..279d25b
--- /dev/null
@@ -0,0 +1,59 @@
+// commit: b7bfb5c3a8330002250f304cb5deb522fa054eae
+// fix iconv conversions for iso88592-iso885916
+#include <iconv.h>
+#include <string.h>
+#include "test.h"
+
+int main(void)
+{
+       static char *test_charsets[] = {
+               "iso-8859-1",
+               "iso-8859-2",
+               "iso-8859-4",
+               "iso-8859-5",
+               "iso-8859-9",
+               "iso-8859-10",
+               "iso-8859-13",
+               "iso-8859-14",
+               "iso-8859-15",
+               "iso-8859-16",
+               0
+       };
+       char all_codepoints[256];
+       int i;
+
+       for (i=0; i<256; i++)
+               all_codepoints[i] = 255-i;
+
+       for (i=0; test_charsets[i]; i++) {
+               iconv_t there = iconv_open("UTF-8", test_charsets[i]);
+               if (there == (iconv_t)-1) continue;
+               iconv_t andback = iconv_open(test_charsets[i], "UTF-8");
+               if (andback == (iconv_t)-1) {
+                       iconv_close(there);
+                       continue;
+               }
+               char u8buf[1024];
+               char buf[256];
+               size_t u8rem = sizeof u8buf;
+               int r1 = iconv(there,
+                       &(char *){all_codepoints}, &(size_t){sizeof all_codepoints},
+                       &(char *){u8buf}, &u8rem);
+               size_t u8len = sizeof u8buf - u8rem;
+               int r2 = iconv(andback,
+                       &(char *){u8buf}, &(size_t){u8len},
+                       &(char *){buf}, &(size_t){sizeof buf});
+
+               if (r1) t_error("got %d converting from %s\n", r1, test_charsets[i]);
+               if (r2) t_error("got %d converting back to %s\n", r2, test_charsets[i]);
+
+               if (memcmp(all_codepoints, buf, sizeof buf)) {
+                       t_error("round trip corrupted %s characters\n", test_charsets[i]);
+               }
+
+               iconv_close(there);
+               iconv_close(andback);
+       }
+
+       return t_status;
+}