89 lines
2.5 KiB
C++
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;
|
|
}
|
|
|