Re: [patch] combine mount_udf(8) with kiconv(3)

"R. Imura" <[email protected]>
Newsgroups gmane.os.freebsd.devel.internationalization
Message-ID <20031104163359.GA8303%[email protected]>
Hi,

On Tue, Nov 04, 2003 at 03:26:20AM -0700, Scott Long wrote:
> Hi,
> 
> This looks very good.  I have one question, however,  Why do you
> copy transname into unibuf?  Is it because of endian problems?
> If so, feel free to modify the OSTA code to produce the correct
> format.  Doing a second zalloc() and copy for every single
> filename gets expensive and should be avoided.

Ah, yes, you're right. I now modified the OSTA code and add
udf_UncompressUnicodeByte() to it.  When iconv is available
udf_UncompressUnicodeByte() is used, and when not udf_UncompressUnicode()
is used.  New patch is

  http://www.ryu16.org/FreeBSD/kiconv/udf_5_current_20031104.diff

Difference from previous version's udf_vnops.c is as follows.

diff -u -r1.1.2.6 udf_vnops.c
--- udf_vnops.c	4 Nov 2003 15:17:48 -0000	1.1.2.6
+++ udf_vnops.c	4 Nov 2003 15:45:41 -0000
@@ -459,42 +459,43 @@
 	unicode_t *transname;
 	char *unibuf, *unip;
 	int i, unilen = 0, destlen;
-	size_t unileft, destleft = MAXNAMLEN;
-
-	/* allocate a buffer big enough to hold an 8->16 bit expansion */
-	transname = uma_zalloc(udf_zone_trans, M_WAITOK);
-
-	if ((unilen = udf_UncompressUnicode(len, cs0string, transname)) == -1) {
-		printf("udf: Unicode translation failed\n");
-		uma_zfree(udf_zone_trans, transname);
-		return 0;
-	}
+	size_t destleft = MAXNAMLEN;
 
 	/* Convert 16-bit Unicode to destname */
 	if (udfmp->im_flags & UDFMNT_KICONV && udf_iconv) {
+		/* allocate a buffer big enough to hold an 8->16 bit expansion */
 		unibuf = uma_zalloc(udf_zone_trans, M_WAITOK);
 		unip = unibuf;
-		for (i = 0; i < unilen ; i++) {
-			*unibuf++ = (char)(transname[i] >> 8);
-			*unibuf++ = (char)transname[i];
+		if ((unilen = udf_UncompressUnicodeByte(len, cs0string, unibuf)) == -1) {
+			printf("udf: Unicode translation failed\n");
+			uma_zfree(udf_zone_trans, unibuf);
+			return 0;
 		}
-		unibuf = unip;
-		unileft = (size_t)unilen * 2;
-		while (unileft > 0 && destleft > 0) {
+
+		while (unilen > 0 && destleft > 0) {
 			udf_iconv->conv(udfmp->im_d2l, (const char **)&unibuf,
-				&unileft, (char **)&destname, &destleft);
+				(size_t *)&unilen, (char **)&destname, &destleft);
 			/* Unconverted character found */
-			if (unileft > 0 && destleft > 0) {
+			if (unilen > 0 && destleft > 0) {
 				*destname++ = '?';
 				destleft--;
 				unibuf += 2;
-				unileft -= 2;
+				unilen -= 2;
 			}
 		}
 		uma_zfree(udf_zone_trans, unip);
 		*destname = '\0';
 		destlen = MAXNAMLEN - (int)destleft;
 	} else {
+		/* allocate a buffer big enough to hold an 8->16 bit expansion */
+		transname = uma_zalloc(udf_zone_trans, M_WAITOK);
+
+		if ((unilen = udf_UncompressUnicode(len, cs0string, transname)) == -1) {
+			printf("udf: Unicode translation failed\n");
+			uma_zfree(udf_zone_trans, transname);
+			return 0;
+		}
+
 		for (i = 0; i < unilen ; i++) {
 			if (transname[i] & 0xff00) {
 				destname[i] = '.';	/* Fudge the 16bit chars */
@@ -502,11 +503,10 @@
 				destname[i] = transname[i] & 0xff;
 			}
 		}
+		uma_zfree(udf_zone_trans, transname);
 		destname[unilen] = 0;
 		destlen = unilen;
 	}
-
-	uma_zfree(udf_zone_trans, transname);
 
 	return (destlen);
 }


- R. Imura
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-i18n
To unsubscribe, send any mail to "[email protected]"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.