/*
- * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
+ * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like. Any license provided herein, whether implied or
- * otherwise, applies only to this software file. Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc., 59
- * Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA 94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+ *
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <libxfs.h>
+#include <xfs/libxfs.h>
#include "bit.h"
#undef setbit /* defined in param.h on Linux */
__int64_t rval;
int signext;
int z1, z2, z3, z4;
-
- ASSERT(nbits<=64);
+
+ ASSERT(nbits<=64);
p = (char *)obj + byteize(bitoff);
bit = bitoffs(bitoff);
else
return (__int64_t)INT_GET(*(__uint8_t *)p, ARCH_CONVERT);
}
-
-
+
+
for (i = 0, rval = 0LL; i < nbits; i++) {
if (getbit(p, bit + i)) {
- /* If the last bit is on and we care about sign
- * bits and we don't have a full 64 bit
- * container, turn all bits on between the
- * sign bit and the most sig bit.
- */
-
- /* handle endian swap here */
+ /* If the last bit is on and we care about sign
+ * bits and we don't have a full 64 bit
+ * container, turn all bits on between the
+ * sign bit and the most sig bit.
+ */
+
+ /* handle endian swap here */
#if __BYTE_ORDER == LITTLE_ENDIAN
if (i == 0 && signext && nbits < 64)
rval = -1LL << nbits;
rval |= 1LL << (nbits - i - 1);
#else
if ((i == (nbits - 1)) && signext && nbits < 64)
- rval |= (-1LL << nbits);
- rval |= 1LL << i;
+ rval |= (-1LL << nbits);
+ rval |= 1LL << (nbits - i - 1);
#endif
}
}
{
char *in = (char *)ibuf;
char *out = (char *)obuf;
-
+
int bit;
-
+
#if BYTE_ORDER == LITTLE_ENDIAN
- int big = 0;
+ int big = 0;
#else
- int big = 1;
+ int big = 1;
#endif
-
- /* only need to swap LE integers */
- if (big || (nbits!=2 && nbits!=4 && nbits!=8) ) {
- /* We don't have type info, so we can only assume
- * that 2,4 & 8 byte values are integers. sigh.
- */
-
- /* byte aligned ? */
- if (bitoff%NBBY) {
- /* no - bit copy */
- for (bit=0; bit<nbits; bit++)
- setbit(out, bit+bitoff, getbit(in, bit));
- } else {
- /* yes - byte copy */
- memcpy(out+byteize(bitoff), in, byteize(nbits));
- }
-
- } else {
- int ibit;
- int obit;
-
- /* we need to endian swap this value */
-
- out+=byteize(bitoff);
- obit=bitoffs(bitoff);
-
- ibit=nbits-NBBY;
-
- for (bit=0; bit<nbits; bit++) {
- setbit(out, bit+obit, getbit(in, ibit));
- if (ibit%NBBY==NBBY-1)
- ibit-=NBBY*2-1;
- else
- ibit++;
- }
- }
+
+ /* only need to swap LE integers */
+ if (big || (nbits!=16 && nbits!=32 && nbits!=64) ) {
+ /* We don't have type info, so we can only assume
+ * that 2,4 & 8 byte values are integers. sigh.
+ */
+
+ /* byte aligned ? */
+ if (bitoff%NBBY) {
+ /* no - bit copy */
+ for (bit=0; bit<nbits; bit++)
+ setbit(out, bit+bitoff, getbit(in, bit));
+ } else {
+ /* yes - byte copy */
+ memcpy(out+byteize(bitoff), in, byteize(nbits));
+ }
+
+ } else {
+ int ibit;
+ int obit;
+
+ /* we need to endian swap this value */
+
+ out+=byteize(bitoff);
+ obit=bitoffs(bitoff);
+
+ ibit=nbits-NBBY;
+
+ for (bit=0; bit<nbits; bit++) {
+ setbit(out, bit+obit, getbit(in, ibit));
+ if (ibit%NBBY==NBBY-1)
+ ibit-=NBBY*2-1;
+ else
+ ibit++;
+ }
+ }
}