Files
sigmaker-ida/idasdk76/ldr/aif/aifcmn.cpp
2021-10-31 21:20:46 +02:00

89 lines
2.5 KiB
C++

static const uint32 magic1[] = { ZERO_CODE1 };
static const uint32 magic2[] = { ZERO_CODE2 };
static const uint32 *const magics[] = { magic1, magic2 };
//--------------------------------------------------------------------------
static void swap_header(aif_header_t *hd)
{
uint32 *ptr = (uint32 *)hd;
const int size = sizeof(aif_header_t) / sizeof(uint32);
for ( size_t i=0; i < size; i++, ptr++ )
*ptr = swap32(*ptr);
}
//--------------------------------------------------------------------------
// 0-failed, 1-little endian, 2-big endian
static int match_zero_code(aif_header_t *hd)
{
int mostfirst = 0;
for ( int i=0; i < qnumber(magics); i++ )
{
if ( memcmp(hd->zero_code, magics[i], sizeof(hd->zero_code)) == 0 )
return mostfirst+1;
swap_header(hd);
mostfirst = !mostfirst;
if ( memcmp(hd->zero_code, magics[i], sizeof(hd->zero_code)) == 0 )
return mostfirst+1;
}
return 0;
}
//--------------------------------------------------------------------------
//
// check input file format. if recognized, then return 1
// otherwise return 0
//
bool is_aif_file(linput_t *li)
{
aif_header_t hd;
qlseek(li, 0);
if ( qlread(li, &hd, sizeof(hd)) != sizeof(hd) )
return false;
return match_zero_code(&hd) != 0;
}
//--------------------------------------------------------------------------
static void swap_section(section_t *s)
{
s->codestart = swap32(s->codestart);
s->datastart = swap32(s->datastart);
s->codesize = swap32(s->codesize);
s->datasize = swap32(s->datasize);
s->fileinfo = swap32(s->fileinfo);
s->debugsize = swap32(s->debugsize);
s->name = swap32(s->name);
}
//--------------------------------------------------------------------------
static void swap_dsym(dsym_t *s)
{
s->sym = swap32(s->sym);
s->value = swap32(s->value);
}
//--------------------------------------------------------------------------
// returns true - debug info with pascal symbols
static bool swap_symbols(dsym_t *ds, char *str, uchar *end, size_t nsyms)
{
int npascal = 0; // number of pascal strings
int nc = 0; // number of c strings
for ( int i=0; i < nsyms; i++,ds++ )
{
if ( is_mf() )
swap_dsym(ds);
if ( ds->sym & ASD_16BITSYM )
continue;
size_t off = size_t(ds->sym & ASD_SYMOFF);
char *name = str + off;
if ( name >= (char *)end )
continue;
if ( name[0] == strlen(name)-1 )
npascal++;
else
nc++;
}
return npascal > nc;
}