2013-09-28 00:24:23 -03:00
|
|
|
/* _______ ____ __ ___ ___
|
|
|
|
* \ _ \ \ / \ / \ \ / / ' ' '
|
|
|
|
* | | \ \ | | || | \/ | . .
|
|
|
|
* | | | | | | || ||\ /| |
|
|
|
|
* | | | | | | || || \/ | | ' ' '
|
|
|
|
* | | | | | | || || | | . .
|
|
|
|
* | |_/ / \ \__// || | |
|
|
|
|
* /_______/ynamic \____/niversal /__\ /____\usic /| . . ibliotheque
|
|
|
|
* / \
|
|
|
|
* / . \
|
|
|
|
* readany.c - Code to detect and read any of the / / \ \
|
|
|
|
* module formats supported by DUMB. | < / \_
|
|
|
|
* | \/ /\ /
|
|
|
|
* By Chris Moeller. \_ / > /
|
|
|
|
* | \ / /
|
|
|
|
* | ' /
|
|
|
|
* \__/
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "dumb.h"
|
|
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define strnicmp _strnicmp
|
|
|
|
#else
|
|
|
|
#if defined(unix) || defined(__unix__) || defined(__unix)
|
|
|
|
#include <strings.h>
|
|
|
|
#endif
|
|
|
|
#define strnicmp strncasecmp
|
|
|
|
#endif
|
|
|
|
|
|
|
|
enum { maximum_signature_size = 0x30 };
|
|
|
|
|
|
|
|
DUH *dumb_read_any_quick(DUMBFILE *f, int restrict_, int subsong)
|
|
|
|
{
|
|
|
|
unsigned char signature[ maximum_signature_size ];
|
|
|
|
unsigned long signature_size;
|
|
|
|
DUH * duh = NULL;
|
|
|
|
|
2017-09-17 01:37:49 -03:00
|
|
|
/* signature_size = dumbfile_get_size(f); */
|
2013-09-28 00:24:23 -03:00
|
|
|
|
|
|
|
signature_size = dumbfile_getnc( (char *)signature, maximum_signature_size, f );
|
|
|
|
dumbfile_seek( f, 0, DFS_SEEK_SET );
|
|
|
|
|
|
|
|
if (signature_size >= 4 &&
|
|
|
|
signature[0] == 'I' && signature[1] == 'M' &&
|
|
|
|
signature[2] == 'P' && signature[3] == 'M')
|
|
|
|
{
|
|
|
|
duh = dumb_read_it_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 17 && !memcmp(signature, "Extended Module: ", 17))
|
|
|
|
{
|
|
|
|
duh = dumb_read_xm_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 0x30 &&
|
|
|
|
signature[0x2C] == 'S' && signature[0x2D] == 'C' &&
|
|
|
|
signature[0x2E] == 'R' && signature[0x2F] == 'M')
|
|
|
|
{
|
|
|
|
duh = dumb_read_s3m_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 30 &&
|
|
|
|
/*signature[28] == 0x1A &&*/ signature[29] == 2 &&
|
|
|
|
( ! strnicmp( ( const char * ) signature + 20, "!Scream!", 8 ) ||
|
|
|
|
! strnicmp( ( const char * ) signature + 20, "BMOD2STM", 8 ) ||
|
|
|
|
! strnicmp( ( const char * ) signature + 20, "WUZAMOD!", 8 ) ) )
|
|
|
|
{
|
|
|
|
duh = dumb_read_stm_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 2 &&
|
|
|
|
((signature[0] == 0x69 && signature[1] == 0x66) ||
|
|
|
|
(signature[0] == 0x4A && signature[1] == 0x4E)))
|
|
|
|
{
|
|
|
|
duh = dumb_read_669_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 0x30 &&
|
|
|
|
signature[0x2C] == 'P' && signature[0x2D] == 'T' &&
|
|
|
|
signature[0x2E] == 'M' && signature[0x2F] == 'F')
|
|
|
|
{
|
|
|
|
duh = dumb_read_ptm_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 4 &&
|
|
|
|
signature[0] == 'P' && signature[1] == 'S' &&
|
|
|
|
signature[2] == 'M' && signature[3] == ' ')
|
|
|
|
{
|
|
|
|
duh = dumb_read_psm_quick( f, subsong );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 4 &&
|
|
|
|
signature[0] == 'P' && signature[1] == 'S' &&
|
|
|
|
signature[2] == 'M' && signature[3] == 254)
|
|
|
|
{
|
|
|
|
duh = dumb_read_old_psm_quick( f );
|
|
|
|
}
|
|
|
|
else if (signature_size >= 3 &&
|
|
|
|
signature[0] == 'M' && signature[1] == 'T' &&
|
|
|
|
signature[2] == 'M')
|
|
|
|
{
|
|
|
|
duh = dumb_read_mtm_quick( f );
|
|
|
|
}
|
|
|
|
else if ( signature_size >= 4 &&
|
|
|
|
signature[0] == 'R' && signature[1] == 'I' &&
|
|
|
|
signature[2] == 'F' && signature[3] == 'F')
|
|
|
|
{
|
|
|
|
duh = dumb_read_riff_quick( f );
|
|
|
|
}
|
|
|
|
else if ( signature_size >= 24 &&
|
|
|
|
!memcmp( signature, "ASYLUM Music Format", 19 ) &&
|
|
|
|
!memcmp( signature + 19, " V1.0", 5 ) )
|
|
|
|
{
|
|
|
|
duh = dumb_read_asy_quick( f );
|
|
|
|
}
|
|
|
|
else if ( signature_size >= 3 &&
|
|
|
|
signature[0] == 'A' && signature[1] == 'M' &&
|
|
|
|
signature[2] == 'F')
|
|
|
|
{
|
|
|
|
duh = dumb_read_amf_quick( f );
|
|
|
|
}
|
|
|
|
else if ( signature_size >= 8 &&
|
|
|
|
!memcmp( signature, "OKTASONG", 8 ) )
|
|
|
|
{
|
|
|
|
duh = dumb_read_okt_quick( f );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( !duh )
|
|
|
|
{
|
|
|
|
dumbfile_seek( f, 0, DFS_SEEK_SET );
|
|
|
|
duh = dumb_read_mod_quick( f, restrict_ );
|
|
|
|
}
|
|
|
|
|
|
|
|
return duh;
|
|
|
|
}
|