Author: tridge
Date: 2004-11-15 07:31:16 +0000 (Mon, 15 Nov 2004)
New Revision: 3749

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=3749

Log:
don't consider it a failure if we fail to re-encode a codepoint above
1M, or in the case of non-UTF charsets, above 256


Modified:
   branches/SAMBA_4_0/source/torture/local/iconv.c


Changeset:
Modified: branches/SAMBA_4_0/source/torture/local/iconv.c
===================================================================
--- branches/SAMBA_4_0/source/torture/local/iconv.c     2004-11-15 06:59:03 UTC 
(rev 3748)
+++ branches/SAMBA_4_0/source/torture/local/iconv.c     2004-11-15 07:31:16 UTC 
(rev 3749)
@@ -128,21 +128,7 @@
                last_charset = charset;
        }
 
-#if 0
-       int i;
-       for (i=0;i<50;i++) {
-               ptr_in = inbuf;
-               ptr_out = buf1;
-               size_in1 = size;
-               outsize1 = sizeof(buf1);
-
-               memset(ptr_out, 0, outsize1);
-               errno = 0;
-               ret1 = smb_iconv(cd2, &ptr_in, &size_in1, &ptr_out, &outsize1);
-               errno1 = errno;
-       }
-#endif
-
+       /* internal convert to charset - placing result in buf1 */
        ptr_in = inbuf;
        ptr_out = buf1;
        size_in1 = size;
@@ -153,6 +139,7 @@
        ret1 = smb_iconv(cd2, &ptr_in, &size_in1, &ptr_out, &outsize1);
        errno1 = errno;
 
+       /* system convert to charset - placing result in buf2 */
        ptr_in = inbuf;
        ptr_out = buf2;
        size_in2 = size;
@@ -221,7 +208,8 @@
 
                ok = 0;
        }
-       
+
+       /* convert back to UTF-16, putting result in buf3 */
        size = size - size_in1;
        ptr_in = buf1;
        ptr_out = buf3;
@@ -230,12 +218,26 @@
 
        memset(ptr_out, 0, outsize3);
        ret3 = smb_iconv(cd3, &ptr_in, &size_in3, &ptr_out, &outsize3);
-       
+
+       /* we only internally support the first 1M codepoints */
+       if (outsize3 != sizeof(buf3) - size &&
+           get_codepoint(inbuf+sizeof(buf3) - outsize3, 
+                         size - (sizeof(buf3) - outsize3),
+                         "UTF-16LE") >= (1<<20)) {
+               return ok;
+       }
+
        if (ret3 != 0) {
                printf("pull failed - %s\n", strerror(errno));
                ok = 0;
        }
-       
+
+       if (strncmp(charset, "UTF", 3) != 0) {
+               /* don't expect perfect mappings for non UTF charsets */
+               return ok;
+       }
+
+
        if (outsize3 != sizeof(buf3) - size) {
                printf("wrong outsize3 - %d should be %d\n", 
                       outsize3, sizeof(buf3) - size);
@@ -245,8 +247,12 @@
        if (memcmp(buf3, inbuf, size) != 0) {
                printf("pull bytes mismatch:\n");
                show_buf("inbuf", inbuf, size);
-               show_buf(" buf3", buf3, size);
+               show_buf(" buf3", buf3, sizeof(buf3) - outsize3);
                ok = 0;
+               printf("next codepoint is %u\n", 
+                      get_codepoint(inbuf+sizeof(buf3) - outsize3, 
+                                    size - (sizeof(buf3) - outsize3),
+                                    "UTF-16LE"));
        }
 
        if (!ok) {

Reply via email to