#include <sys/param.h>
#include <stdio.h>
#include <db.h>
#include "btree.h"
static void mswap(PAGE *);
void
__bt_pgin(void *t, pgno_t pg, void *pp)
{
PAGE *h;
indx_t i, top;
unsigned char flags;
char *p;
if (!F_ISSET(((BTREE *)t), B_NEEDSWAP))
return;
if (pg == P_META) {
mswap(pp);
return;
}
h = pp;
M_32_SWAP(h->pgno);
M_32_SWAP(h->prevpg);
M_32_SWAP(h->nextpg);
M_32_SWAP(h->flags);
M_16_SWAP(h->lower);
M_16_SWAP(h->upper);
top = NEXTINDEX(h);
if ((h->flags & P_TYPE) == P_BINTERNAL)
for (i = 0; i < top; i++) {
M_16_SWAP(h->linp[i]);
p = (char *)GETBINTERNAL(h, i);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(pgno_t);
if (*(unsigned char *)p & P_BIGKEY) {
p += sizeof(unsigned char);
P_32_SWAP(p);
p += sizeof(pgno_t);
P_32_SWAP(p);
}
}
else if ((h->flags & P_TYPE) == P_BLEAF)
for (i = 0; i < top; i++) {
M_16_SWAP(h->linp[i]);
p = (char *)GETBLEAF(h, i);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
flags = *(unsigned char *)p;
if (flags & (P_BIGKEY | P_BIGDATA)) {
p += sizeof(unsigned char);
if (flags & P_BIGKEY) {
P_32_SWAP(p);
p += sizeof(pgno_t);
P_32_SWAP(p);
}
if (flags & P_BIGDATA) {
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(pgno_t);
P_32_SWAP(p);
}
}
}
}
void
__bt_pgout(void *t, pgno_t pg, void *pp)
{
PAGE *h;
indx_t i, top;
unsigned char flags;
char *p;
if (!F_ISSET(((BTREE *)t), B_NEEDSWAP))
return;
if (pg == P_META) {
mswap(pp);
return;
}
h = pp;
top = NEXTINDEX(h);
if ((h->flags & P_TYPE) == P_BINTERNAL)
for (i = 0; i < top; i++) {
p = (char *)GETBINTERNAL(h, i);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(pgno_t);
if (*(unsigned char *)p & P_BIGKEY) {
p += sizeof(unsigned char);
P_32_SWAP(p);
p += sizeof(pgno_t);
P_32_SWAP(p);
}
M_16_SWAP(h->linp[i]);
}
else if ((h->flags & P_TYPE) == P_BLEAF)
for (i = 0; i < top; i++) {
p = (char *)GETBLEAF(h, i);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
flags = *(unsigned char *)p;
if (flags & (P_BIGKEY | P_BIGDATA)) {
p += sizeof(unsigned char);
if (flags & P_BIGKEY) {
P_32_SWAP(p);
p += sizeof(pgno_t);
P_32_SWAP(p);
}
if (flags & P_BIGDATA) {
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(pgno_t);
P_32_SWAP(p);
}
}
M_16_SWAP(h->linp[i]);
}
M_32_SWAP(h->pgno);
M_32_SWAP(h->prevpg);
M_32_SWAP(h->nextpg);
M_32_SWAP(h->flags);
M_16_SWAP(h->lower);
M_16_SWAP(h->upper);
}
static void
mswap(PAGE *pg)
{
char *p;
p = (char *)pg;
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
P_32_SWAP(p);
p += sizeof(uint32_t);
}