[patch] combine mount_udf(8) with kiconv(3)
R. Imura
imura at ryu16.org
Tue Nov 4 08:34:08 PST 2003
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
More information about the freebsd-i18n
mailing list