#ifdef __linux__
#include <endian.h>
#else
#ifdef __APPLE__
#include <machine/endian.h>
#else
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#define BYTE_ORDER 4321
#endif
#endif
#include "convert.h"
void reverse2(u8 *bytes);
void reverse4(u8 *bytes);
int
convert_dpme(DPME *data, int to_cpu_form)
{
#if BYTE_ORDER == LITTLE_ENDIAN
reverse2((u8 *)&data->dpme_signature);
reverse2((u8 *)&data->dpme_reserved_1);
reverse4((u8 *)&data->dpme_map_entries);
reverse4((u8 *)&data->dpme_pblock_start);
reverse4((u8 *)&data->dpme_pblocks);
reverse4((u8 *)&data->dpme_lblock_start);
reverse4((u8 *)&data->dpme_lblocks);
reverse4((u8 *)&data->dpme_flags);
reverse4((u8 *)&data->dpme_boot_block);
reverse4((u8 *)&data->dpme_boot_bytes);
reverse4((u8 *)&data->dpme_load_addr);
reverse4((u8 *)&data->dpme_load_addr_2);
reverse4((u8 *)&data->dpme_goto_addr);
reverse4((u8 *)&data->dpme_goto_addr_2);
reverse4((u8 *)&data->dpme_checksum);
convert_bzb((BZB *)data->dpme_bzb, to_cpu_form);
#endif
return 0;
}
#if BYTE_ORDER == LITTLE_ENDIAN
int
convert_bzb(BZB *data, int to_cpu_form)
{
if (to_cpu_form) {
reverse4((u8 *)&data->bzb_magic);
if (data->bzb_magic != BZBMAGIC) {
reverse4((u8 *)&data->bzb_magic);
if (data->bzb_magic != BZBMAGIC) {
return 0;
}
}
} else {
if (data->bzb_magic != BZBMAGIC) {
return 0;
}
reverse4((u8 *)&data->bzb_magic);
}
reverse2((u8 *)&data->bzb_inode);
reverse4((u8 *)&data->bzb_flags);
reverse4((u8 *)&data->bzb_tmade);
reverse4((u8 *)&data->bzb_tmount);
reverse4((u8 *)&data->bzb_tumount);
return 0;
}
#endif
int
convert_block0(Block0 *data, int to_cpu_form)
{
#if BYTE_ORDER == LITTLE_ENDIAN
DDMap *m;
u16 count;
int i;
if (to_cpu_form) {
reverse2((u8 *)&data->sbSig);
if (data->sbSig != BLOCK0_SIGNATURE) {
reverse2((u8 *)&data->sbSig);
if (data->sbSig != BLOCK0_SIGNATURE) {
return 0;
}
}
} else {
if (data->sbSig != BLOCK0_SIGNATURE) {
return 0;
}
reverse2((u8 *)&data->sbSig);
}
reverse2((u8 *)&data->sbBlkSize);
reverse4((u8 *)&data->sbBlkCount);
reverse2((u8 *)&data->sbDevType);
reverse2((u8 *)&data->sbDevId);
reverse4((u8 *)&data->sbData);
if (to_cpu_form) {
reverse2((u8 *)&data->sbDrvrCount);
count = data->sbDrvrCount;
} else {
count = data->sbDrvrCount;
reverse2((u8 *)&data->sbDrvrCount);
}
if (count > 0) {
m = (DDMap *) data->sbMap;
for (i = 0; i < count; i++) {
reverse4((u8 *)&m[i].ddBlock);
reverse2((u8 *)&m[i].ddSize);
reverse2((u8 *)&m[i].ddType);
}
}
#endif
return 0;
}
void
reverse2(u8 *bytes)
{
u8 t;
t = *bytes;
*bytes = bytes[1];
bytes[1] = t;
}
void
reverse4(u8 *bytes)
{
u8 t;
t = *bytes;
*bytes = bytes[3];
bytes[3] = t;
t = bytes[1];
bytes[1] = bytes[2];
bytes[2] = t;
}