Okay, this one should actually work as advertised.  Pardon the mental
meltdown earlier.

This also changes "extern inline" to "static inline" (per Linus' request)
and always ignores the bigendian part of a bi-endian datum (per Tim
Riker's observation that lots of [Windoze?] programs get that wrong.)

It's still a bit of a loss to have to do unaligned load and endianness
conversion as two operations; on some machines it's doubtlessly faster to
do both at the same time.  However, *those* macros I didn't find...

        -hpa
diff -ur stock3/linux-2.4.4/fs/isofs/util.c linux-2.4.4/fs/isofs/util.c
--- stock3/linux-2.4.4/fs/isofs/util.c  Wed Nov 29 10:11:38 2000
+++ linux-2.4.4/fs/isofs/util.c Mon Apr 30 20:49:33 2001
@@ -1,90 +1,9 @@
 /*
  *  linux/fs/isofs/util.c
- *
- *  The special functions in the file are numbered according to the section
- *  of the iso 9660 standard in which they are described.  isonum_733 will
- *  convert numbers according to section 7.3.3, etc.
- *
- *  isofs special functions.  This file was lifted in its entirety from
- *  the 386BSD iso9660 filesystem, by Pace Willisson <[EMAIL PROTECTED]>.
  */
 
 #include <linux/time.h>
-
-int
-isonum_711 (char * p)
-{
-       return (*p & 0xff);
-}
-
-int
-isonum_712 (char * p)
-{
-       int val;
-       
-       val = *p;
-       if (val & 0x80)
-               val |= 0xffffff00;
-       return (val);
-}
-
-int
-isonum_721 (char * p)
-{
-       return ((p[0] & 0xff) | ((p[1] & 0xff) << 8));
-}
-
-int
-isonum_722 (char * p)
-{
-       return (((p[0] & 0xff) << 8) | (p[1] & 0xff));
-}
-
-int
-isonum_723 (char * p)
-{
-#if 0
-       if (p[0] != p[3] || p[1] != p[2]) {
-               fprintf (stderr, "invalid format 7.2.3 number\n");
-               exit (1);
-       }
-#endif
-       return (isonum_721 (p));
-}
-
-int
-isonum_731 (char * p)
-{
-       return ((p[0] & 0xff)
-               | ((p[1] & 0xff) << 8)
-               | ((p[2] & 0xff) << 16)
-               | ((p[3] & 0xff) << 24));
-}
-
-int
-isonum_732 (char * p)
-{
-       return (((p[0] & 0xff) << 24)
-               | ((p[1] & 0xff) << 16)
-               | ((p[2] & 0xff) << 8)
-               | (p[3] & 0xff));
-}
-
-int
-isonum_733 (char * p)
-{
-#if 0
-       int i;
-
-       for (i = 0; i < 4; i++) {
-               if (p[i] != p[7-i]) {
-                       fprintf (stderr, "bad format 7.3.3 number\n");
-                       exit (1);
-               }
-       }
-#endif
-       return (isonum_731 (p));
-}
+#include <linux/iso_fs.h>
 
 /* 
  * We have to convert from a MM/DD/YY format to the Unix ctime format.
diff -ur stock3/linux-2.4.4/include/linux/iso_fs.h linux-2.4.4/include/linux/iso_fs.h
--- stock3/linux-2.4.4/include/linux/iso_fs.h   Fri Apr 27 15:48:20 2001
+++ linux-2.4.4/include/linux/iso_fs.h  Tue May  1 11:45:21 2001
@@ -165,14 +165,46 @@
 #define ISOFS_SUPER_MAGIC 0x9660
 
 #ifdef __KERNEL__
-extern int isonum_711(char *);
-extern int isonum_712(char *);
-extern int isonum_721(char *);
-extern int isonum_722(char *);
-extern int isonum_723(char *);
-extern int isonum_731(char *);
-extern int isonum_732(char *);
-extern int isonum_733(char *);
+/* Number conversion inlines, named after the section in ISO 9660
+   they correspond to. */
+
+#include <asm/byteorder.h>
+#include <asm/unaligned.h>
+
+static inline int isonum_711(char *p)
+{
+       return *(u8 *)p;
+}
+static inline int isonum_712(char *p)
+{
+       return *(s8 *)p;
+}
+static inline int isonum_721(char *p)
+{
+       return le16_to_cpu(get_unaligned((u16 *)p));
+}
+static inline int isonum_722(char *p)
+{
+       return be16_to_cpu(get_unaligned((u16 *)p));
+}
+static inline int isonum_723(char *p)
+{
+       /* Ignore bigendian datum due to broken mastering programs */
+       return le16_to_cpu(get_unaligned((u16 *)p));
+}
+static inline int isonum_731(char *p)
+{
+       return le32_to_cpu(get_unaligned((u32 *)p));
+}
+static inline int isonum_732(char *p)
+{
+       return be32_to_cpu(get_unaligned((u32 *)p));
+}
+static inline int isonum_733(char *p)
+{
+       /* Ignore bigendian datum due to broken mastering programs */
+       return le32_to_cpu(get_unaligned((u32 *)p));
+}
 extern int iso_date(char *, int);
 
 extern int parse_rock_ridge_inode(struct iso_directory_record *, struct inode *);

Reply via email to