192 lines
7.0 KiB
C

/*****************************************************************************\
* efs - General purpose Embedded Filesystem library *
* --------------------- ----------------------------------- *
* *
* Filename : extract.c *
* Description : This file contains functions to copy structures that get *
* corrupted when using direct memory copy *
* *
* 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; version 2 *
* of the License. *
*
* This program is distributed in the hope that it will 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. *
* *
* As a special exception, if other files instantiate templates or *
* use macros or inline functions from this file, or you compile this *
* file and link it with other works to produce a work based on this file, *
* this file does not by itself cause the resulting work to be covered *
* by the GNU General Public License. However the source code for this *
* file must still be made available in accordance with section (3) of *
* the GNU General Public License. *
* *
* This exception does not invalidate any other reasons why a work based *
* on this file might be covered by the GNU General Public License. *
* *
* (c)2006 Lennart Yseboodt *
* (c)2006 Michael De Nil *
\*****************************************************************************/
/*****************************************************************************/
#include "extract.h"
/*****************************************************************************/
/*****************************************************************************/
#ifdef BYTE_ALIGNMENT
/*****************************************************************************/
euint16 ex_getb16(euint8* buf,euint32 offset)
{
return(ltb_end16(*((euint16*)(buf+offset))));
}
/*****************************************************************************/
euint32 ex_getb32(euint8* buf,euint32 offset)
{
return(ltb_end32(*((euint32*)(buf+offset))));
}
/*****************************************************************************/
void ex_setb16(euint8* buf,euint32 offset,euint16 data)
{
*((euint16*)(buf+offset)) = btl_end16(data);
}
/*****************************************************************************/
void ex_setb32(euint8* buf,euint32 offset,euint32 data)
{
*((euint32*)(buf+offset)) = btl_end32(data);
}
/*****************************************************************************/
void ex_getPartitionField(euint8* buf,PartitionField* pf, euint32 offset)
{
*pf=*((PartitionField*)(buf+offset));
}
/*****************************************************************************/
void ex_setPartitionField(euint8* buf,PartitionField* pf, euint32 offset)
{
}
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
#else
/*****************************************************************************/
/*****************************************************************************/
#if 0
euint16 ex_getb16(euint8* buf,euint32 offset)
{
return(ltb_end16(((*(buf+offset+1))<<8) + ((*(buf+offset+0))<<0)));
}
euint32 ex_getb32(euint8* buf,euint32 offset)
{
return(ltb_end32(((euint32)buf[offset+3]<<24)+
((euint32)buf[offset+2]<<16)+
((euint32)buf[offset+1]<<8)+
((euint32)buf[offset+0]<<0)));
}
#else
#warning "mthomas - modification enabled"
euint32 ex_getb32(euint8* buf,euint32 offset)
{
#ifdef BIG_ENDIAN
return ((euint32)*(euint8*)(buf+offset)<<24UL) |
((euint32)*(euint8*)(buf+offset+1)<<16UL) |
((euint16)*(euint8*)(buf+offset+2)<<8UL) |
(*(euint8*)(buf+offset+3)) ;
#else
return ((euint32)*(euint8*)(buf+offset+3)<<24UL) |
((euint32)*(euint8*)(buf+offset+2)<<16UL) |
((euint16)*(euint8*)(buf+offset+1)<<8UL) |
(*(euint8*)(buf+offset)) ;
#endif
}
euint16 ex_getb16(euint8* buf,euint32 offset)
{
#ifdef BIG_ENDIAN
return ((euint16)*(euint8*)(buf+offset)<<8UL) |
(*(euint8*)(buf+offset+1)) ;
#else
return ((euint16)*(euint8*)(buf+offset+1)<<8UL) |
(*(euint8*)(buf+offset)) ;
#endif
}
#endif
/* end mod mthomas */
/*****************************************************************************/
void ex_setb16(euint8* buf,euint32 offset,euint16 data)
{
#ifdef BIG_ENDIAN
*(buf+offset+1) = data>>0;
*(buf+offset+0) = data>>8;
#else
*(buf+offset+0) = data>>0;
*(buf+offset+1) = data>>8;
#endif
}
/*****************************************************************************/
void ex_setb32(euint8* buf,euint32 offset,euint32 data)
{
#ifdef BIG_ENDIAN
*(buf+offset+3) = data>> 0;
*(buf+offset+2) = data>> 8;
*(buf+offset+1) = data>>16;
*(buf+offset+0) = data>>24;
#else
*(buf+offset+0) = data>> 0;
*(buf+offset+1) = data>> 8;
*(buf+offset+2) = data>>16;
*(buf+offset+3) = data>>24;
#endif
}
/*****************************************************************************/
void ex_getPartitionField(euint8* buf,PartitionField* pf, euint32 offset)
{
pf->bootFlag = *(buf + offset);
pf->CHS_begin[0] = *(buf + offset + 1);
pf->CHS_begin[1] = *(buf + offset + 2);
pf->CHS_begin[2] = *(buf + offset + 3);
pf->type = *(buf + offset + 4);
pf->CHS_end[0] = *(buf + offset + 5);
pf->CHS_end[1] = *(buf + offset + 6);
pf->CHS_end[2] = *(buf + offset + 7);
pf->LBA_begin = ex_getb32(buf + offset,8);
pf->numSectors = ex_getb32(buf + offset,12);
}
/*****************************************************************************/
void ex_setPartitionField(euint8* buf,PartitionField* pf, euint32 offset)
{
}
/*****************************************************************************/
/*****************************************************************************/
#endif
/*****************************************************************************/