brender-v1.1.2/FW/BSWAP.C

171 lines
2.7 KiB
C++
Raw Permalink Normal View History

2022-05-04 20:14:23 -05:00
/*
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
*
* $Id: bswap.c 1.12 1995/05/25 13:23:11 sam Exp $
* $Locker: $
*
* Byte swap routines for net<->host conversion
*/
#include "fw.h"
#include "brassert.h"
#include "brhton.h"
static char rscid[] = "$Id: bswap.c 1.12 1995/05/25 13:23:11 sam Exp $";
#ifndef __IBMC__
#undef _SWAP
#define _SWAP(a,b) { (a) ^= (b); (b) ^= (a); (a) ^= (b); }
/*
* Swap the bytes of a 4 byte word
*/
br_uint_32 BR_PUBLIC_ENTRY BrSwap32(br_uint_32 l)
{
union {
unsigned long l;
unsigned char c[4];
} u;
u.l = l;
_SWAP(u.c[0],u.c[3]);
_SWAP(u.c[1],u.c[2]);
return u.l;
}
/*
* Swap the bytes of a 2 byte word
*/
br_uint_16 BR_PUBLIC_ENTRY BrSwap16(br_uint_16 s)
{
union {
unsigned short s;
unsigned char c[2];
} u;
u.s = s;
_SWAP(u.c[0],u.c[1]);
return u.s;
}
/*
* Swap the bytes of a 4 byte float
*/
br_float BR_PUBLIC_ENTRY BrSwapFloat(br_float f)
{
union {
br_float f;
unsigned char c[4];
} u;
u.f = f;
_SWAP(u.c[0],u.c[3]);
_SWAP(u.c[1],u.c[2]);
return u.f;
}
/*
* Swap an array of items
*
*/
void * BR_PUBLIC_ENTRY BrSwapBlock(void *block, int count, int size)
{
br_uint_8 *cp;
int i,k;
ASSERT(block != NULL);
ASSERT(count != 0);
ASSERT(size != 0);
/*
* Go through block swapping elements of the appropriate size
*/
switch(size) {
case 1:
break;
/*
* Special case loops for the common sizes
*/
case 2:
for(i=0, cp = block; i< count; i++,cp+=2) {
_SWAP(cp[0],cp[1]);
}
break;
case 3:
for(i=0, cp = block; i< count; i++,cp+=3) {
_SWAP(cp[0],cp[2]);
}
break;
case 4:
for(i=0, cp = block; i< count; i++,cp+=4) {
_SWAP(cp[0],cp[3]);
_SWAP(cp[1],cp[2]);
}
break;
case 8:
for(i=0, cp = block; i< count; i++,cp+=8) {
_SWAP(cp[0],cp[7]);
_SWAP(cp[1],cp[6]);
_SWAP(cp[2],cp[5]);
_SWAP(cp[3],cp[4]);
}
break;
default:
/*
* Do any other strange size the long way
*/
for(i=0, cp = block; i< count; i++,cp+=size) {
for(k=0; k < size/2; k++)
_SWAP(cp[k],cp[size-k-1]);
}
break;
}
return block;
}
#else
/*
* Pull swap ops. from a BRender specific DLL
*/
br_uint_32 _System BrSupport2(br_uint_32 l);
br_uint_16 _System BrSupport3(br_uint_16 s);
br_float _System BrSupport4(br_float f);
void * _System BrSupport5(void *block, int count, int size);
br_uint_32 BR_PUBLIC_ENTRY BrSwap32(br_uint_32 l)
{
return BrSupport2(l);
}
br_uint_16 BR_PUBLIC_ENTRY BrSwap16(br_uint_16 s)
{
return BrSupport3(s);
}
br_float BR_PUBLIC_ENTRY BrSwapFloat(br_float f)
{
return BrSupport4(f);
}
void * BR_PUBLIC_ENTRY BrSwapBlock(void *block, int count, int size)
{
return BrSupport5(block, count, size);
}
#endif