Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 05 Mar 2005 23:42:18 -0800
From:      Nate Lawson <nate@root.org>
To:        arch@freebsd.org
Subject:   patch: clean up msdosfs conversion routine
Message-ID:  <422AB45A.9040809@root.org>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
The attached patch optimizes the unix2win conversion routine.  It uses 
16 bit accesses instead of 8 bit and jumps to "out" once it hits the 
trailing NUL rather than drop through each loop.  I'd like to make sure 
my use of the endian routines is correct, if someone can check this.

Thanks,
-- 
Nate

[-- Attachment #2 --]
Index: msdosfs_conv.c
===================================================================
RCS file: /home/ncvs/src/sys/fs/msdosfs/msdosfs_conv.c,v
retrieving revision 1.39
diff -u -r1.39 msdosfs_conv.c
--- msdosfs_conv.c	8 Feb 2005 07:51:14 -0000	1.39
+++ msdosfs_conv.c	2 Mar 2005 17:48:52 -0000
@@ -52,6 +52,7 @@
  * System include files.
  */
 #include <sys/param.h>
+#include <sys/endian.h>
 #include <sys/time.h>
 #include <sys/kernel.h>		/* defines tz */
 #include <sys/systm.h>
@@ -708,9 +711,8 @@
 	int chksum;
 	struct msdosfsmount *pmp;
 {
-	u_int8_t *wcp;
-	int i, end;
-	u_int16_t code;
+	u_int16_t *wcp;
+	int end, i;
 
 	/*
 	 * Drop trailing blanks and dots
@@ -726,7 +728,7 @@
 	/*
 	 * Initialize winentry to some useful default
 	 */
-	for (wcp = (u_int8_t *)wep, i = sizeof(*wep); --i >= 0; *wcp++ = 0xff);
+	memset(wep, 0xff, sizeof(*wep));
 	wep->weCnt = cnt;
 	wep->weAttributes = ATTR_WIN95;
 	wep->weReserved1 = 0;
@@ -737,29 +739,34 @@
 	 * Now convert the filename parts
 	 */
 	end = 0;
-	for (wcp = wep->wePart1, i = sizeof(wep->wePart1)/2; --i >= 0 && !end;) {
-		code = unix2winchr(&un, &unlen, 0, pmp);
-		*wcp++ = code;
-		*wcp++ = code >> 8;
-		if (!code)
+	wcp = (uint16_t *)wep->wePart1;
+	for (i = sizeof(wep->wePart1)/2; --i >= 0;) {
+		*wcp = htole16(unix2winchr(&un, &unlen, 0, pmp));
+		if (*wcp++ == 0) {
 			end = WIN_LAST;
+			goto out;
+		}
 	}
-	for (wcp = wep->wePart2, i = sizeof(wep->wePart2)/2; --i >= 0 && !end;) {
-		code = unix2winchr(&un, &unlen, 0, pmp);
-		*wcp++ = code;
-		*wcp++ = code >> 8;
-		if (!code)
+	wcp = (uint16_t *)wep->wePart2;
+	for (i = sizeof(wep->wePart2)/2; --i >= 0;) {
+		*wcp = htole16(unix2winchr(&un, &unlen, 0, pmp));
+		if (*wcp++ == 0) {
 			end = WIN_LAST;
+			goto out;
+		}
 	}
-	for (wcp = wep->wePart3, i = sizeof(wep->wePart3)/2; --i >= 0 && !end;) {
-		code = unix2winchr(&un, &unlen, 0, pmp);
-		*wcp++ = code;
-		*wcp++ = code >> 8;
-		if (!code)
+	wcp = (uint16_t *)wep->wePart3;
+	for (i = sizeof(wep->wePart3)/2; --i >= 0;) {
+		*wcp = htole16(unix2winchr(&un, &unlen, 0, pmp));
+		if (*wcp++ == 0) {
 			end = WIN_LAST;
+			goto out;
+		}
 	}
 	if (*un == '\0')
 		end = WIN_LAST;
+
+out:
 	wep->weCnt |= end;
 	return !end;
 }

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?422AB45A.9040809>