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