1 /*  _______         ____    __         ___    ___
2  * \    _  \       \    /  \  /       \   \  /   /       '   '  '
3  *  |  | \  \       |  |    ||         |   \/   |         .      .
4  *  |  |  |  |      |  |    ||         ||\  /|  |
5  *  |  |  |  |      |  |    ||         || \/ |  |         '  '  '
6  *  |  |  |  |      |  |    ||         ||    |  |         .      .
7  *  |  |_/  /        \  \__//          ||    |  |
8  * /_______/ynamic    \____/niversal  /__\  /____\usic   /|  .  . ibliotheque
9  *                                                      /  \
10  *                                                     / .  \
11  * readany.c - Code to detect and read any of the     / / \  \
12  *             module formats supported by DUMB.     | <  /   \_
13  *                                                   |  \/ /\   /
14  * By Chris Moeller.                                  \_  /  > /
15  *                                                      | \ / /
16  *                                                      |  ' /
17  *                                                       \__/
18  */
19 
20 #include <stdlib.h>
21 #include <string.h>
22 
23 #include "dumb.h"
24 
25 #ifdef _MSC_VER
26 	#define strnicmp _strnicmp
it_riff_am_process_sample(IT_SAMPLE * sample,DUMBFILE * f,int len,int ver)27 #else
28 	#if defined(unix) || defined(__unix__) || defined(__unix)
29 		#include <strings.h>
30 	#endif
31 	#define strnicmp strncasecmp
32 #endif
33 
34 enum { maximum_signature_size = 0x30 };
35 
36 DUH *DUMBEXPORT dumb_read_any_quick(DUMBFILE *f, int restrict_, int subsong)
37 {
38     unsigned char signature[ maximum_signature_size ];
39     unsigned long signature_size;
40     DUH * duh = NULL;
41 
42     signature_size = dumbfile_get_size(f);
43 
44     signature_size = dumbfile_getnc( (char *)signature, maximum_signature_size, f );
45     dumbfile_seek( f, 0, DFS_SEEK_SET );
46 
47     if (signature_size >= 4 &&
48         signature[0] == 'I' && signature[1] == 'M' &&
49         signature[2] == 'P' && signature[3] == 'M')
50     {
51         duh = dumb_read_it_quick( f );
52     }
53     else if (signature_size >= 17 && !memcmp(signature, "Extended Module: ", 17))
54     {
55         duh = dumb_read_xm_quick( f );
56     }
57     else if (signature_size >= 0x30 &&
58         signature[0x2C] == 'S' && signature[0x2D] == 'C' &&
59         signature[0x2E] == 'R' && signature[0x2F] == 'M')
60     {
61         duh = dumb_read_s3m_quick( f );
62     }
63     else if (signature_size >= 30 &&
64         /*signature[28] == 0x1A &&*/ signature[29] == 2 &&
65         ( ! strnicmp( ( const char * ) signature + 20, "!Scream!", 8 ) ||
66         ! strnicmp( ( const char * ) signature + 20, "BMOD2STM", 8 ) ||
67         ! strnicmp( ( const char * ) signature + 20, "WUZAMOD!", 8 ) ) )
68     {
69         duh = dumb_read_stm_quick( f );
70     }
71     else if (signature_size >= 2 &&
72         ((signature[0] == 0x69 && signature[1] == 0x66) ||
73         (signature[0] == 0x4A && signature[1] == 0x4E)))
74     {
75         duh = dumb_read_669_quick( f );
76     }
77     else if (signature_size >= 0x30 &&
78         signature[0x2C] == 'P' && signature[0x2D] == 'T' &&
79         signature[0x2E] == 'M' && signature[0x2F] == 'F')
80     {
81         duh = dumb_read_ptm_quick( f );
82     }
83     else if (signature_size >= 4 &&
84         signature[0] == 'P' && signature[1] == 'S' &&
85         signature[2] == 'M' && signature[3] == ' ')
86     {
87         duh = dumb_read_psm_quick( f, subsong );
88     }
89     else if (signature_size >= 4 &&
90         signature[0] == 'P' && signature[1] == 'S' &&
91         signature[2] == 'M' && signature[3] == 254)
92     {
93         duh = dumb_read_old_psm_quick( f );
94     }
95     else if (signature_size >= 3 &&
96         signature[0] == 'M' && signature[1] == 'T' &&
97         signature[2] == 'M')
98     {
99         duh = dumb_read_mtm_quick( f );
100     }
101     else if ( signature_size >= 4 &&
102         signature[0] == 'R' && signature[1] == 'I' &&
103         signature[2] == 'F' && signature[3] == 'F')
104     {
105         duh = dumb_read_riff_quick( f );
106     }
107     else if ( signature_size >= 24 &&
108         !memcmp( signature, "ASYLUM Music Format", 19 ) &&
109         !memcmp( signature + 19, " V1.0", 5 ) )
110     {
111         duh = dumb_read_asy_quick( f );
112     }
113     else if ( signature_size >= 3 &&
114         signature[0] == 'A' && signature[1] == 'M' &&
115         signature[2] == 'F')
116     {
117         duh = dumb_read_amf_quick( f );
118     }
119     else if ( signature_size >= 8 &&
120         !memcmp( signature, "OKTASONG", 8 ) )
121     {
122         duh = dumb_read_okt_quick( f );
123     }
124 
125     if ( !duh )
126     {
127         dumbfile_seek( f, 0, DFS_SEEK_SET );
128         duh = dumb_read_mod_quick( f, restrict_ );
129     }
130 
131     return duh;
132 }
133