Mercurial > hg > dmlib
annotate tools/dumpmod.c @ 1110:ea2cc4932714
Improve output of dumpmod.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 04 Mar 2015 01:10:35 +0200 |
parents | 03322ee5bb32 |
children | 14bd24790929 |
rev | line source |
---|---|
0 | 1 /* |
942
38cad00b41dd
Rename viewmod utility to dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
860
diff
changeset
|
2 * dumpmod - View information about given module file |
0 | 3 * Programmed and designed by Matti 'ccr' Hamalainen |
942
38cad00b41dd
Rename viewmod utility to dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
860
diff
changeset
|
4 * (C) Copyright 2006-2015 Tecnic Software productions (TNSP) |
0 | 5 * |
6 * Please read file 'COPYING' for information on license and distribution. | |
7 */ | |
8 #include "jss.h" | |
9 #include "jssmod.h" | |
10 #include <errno.h> | |
11 #include <string.h> | |
12 #include "dmargs.h" | |
285
245b15cd1919
Don't link libSDL uselessly to utilities that do not actually use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
152
diff
changeset
|
13 #include "dmmutex.h" |
0 | 14 |
15 | |
16 char *optFilename = NULL; | |
17 BOOL optViewPatterns = FALSE, | |
18 optViewInstruments = FALSE, | |
19 optViewExtInstruments = FALSE, | |
795 | 20 optViewGeneralInfo = FALSE, |
21 optDump = FALSE; | |
0 | 22 |
23 | |
860
daebbf28953d
The argument handling API in dmargs* was synced with th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
797
diff
changeset
|
24 static const DMOptArg optList[] = |
0 | 25 { |
26 { 0, '?', "help", "Show this help and exit", OPT_NONE }, | |
27 { 1, 'p', "patterns", "View patterns", OPT_NONE }, | |
28 { 2, 'i', "instruments", "View instruments", OPT_NONE }, | |
29 { 5, 'e', "extinstruments", "View extended instruments", OPT_NONE }, | |
30 { 3, 'g', "general", "General information", OPT_NONE }, | |
31 { 4, 'v', "verbose", "Be more verbose", OPT_NONE }, | |
795 | 32 { 6, 'd', "dump", "Dump mode", OPT_NONE }, |
0 | 33 }; |
34 | |
35 const int optListN = sizeof(optList) / sizeof(optList[0]); | |
36 | |
37 | |
38 void argShowHelp() | |
39 { | |
40 dmPrintBanner(stdout, dmProgName, "[options] [modfile]"); | |
860
daebbf28953d
The argument handling API in dmargs* was synced with th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
797
diff
changeset
|
41 dmArgsPrintHelp(stdout, optList, optListN, 0); |
0 | 42 } |
43 | |
44 | |
45 BOOL argHandleOpt(const int optN, char *optArg, char *currArg) | |
46 { | |
47 (void) optArg; | |
48 | |
49 switch (optN) | |
50 { | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
51 case 0: |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
52 argShowHelp(); |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
53 exit(0); |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
54 break; |
0 | 55 |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
56 case 1: |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
57 optViewPatterns = TRUE; |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
58 break; |
0 | 59 |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
60 case 2: |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
61 optViewInstruments = TRUE; |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
62 break; |
0 | 63 |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
64 case 3: |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
65 optViewGeneralInfo = TRUE; |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
66 break; |
0 | 67 |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
68 case 4: |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
69 dmVerbosity++; |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
70 break; |
0 | 71 |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
72 case 5: |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
73 optViewExtInstruments = TRUE; |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
74 break; |
0 | 75 |
795 | 76 case 6: |
77 optDump = TRUE; | |
78 break; | |
79 | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
80 default: |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
942
diff
changeset
|
81 dmErrorMsg("Unknown argument '%s'.\n", currArg); |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
82 return FALSE; |
0 | 83 } |
84 | |
85 return TRUE; | |
86 } | |
87 | |
88 | |
89 BOOL argHandleFile(char *currArg) | |
90 { | |
91 // Was not option argument | |
92 if (!optFilename) | |
93 optFilename = currArg; | |
94 else { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
942
diff
changeset
|
95 dmErrorMsg("Gay error '%s'!\n", currArg); |
0 | 96 return FALSE; |
97 } | |
98 | |
99 return TRUE; | |
100 } | |
101 | |
102 | |
103 const char patNoteTable[12][3] = | |
104 { | |
105 "C-", "C#", "D-", | |
106 "D#", "E-", "F-", | |
107 "F#", "G-", "G#", | |
108 "A-", "A#", "B-" | |
109 }; | |
110 | |
111 #define jmpNMODEffectTable (36) | |
112 static const char jmpMODEffectTable[jmpNMODEffectTable] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |
113 | |
114 | |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
115 void printEscaped(FILE *f, const char *str) |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
116 { |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
117 while (*str) |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
118 { |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
119 fputc(isprint(*str) ? *str : '*', f); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
120 str++; |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
121 } |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
122 } |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
123 |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
124 |
0 | 125 /* Print a given pattern |
126 */ | |
127 void printPattern(FILE *f, JSSPattern *p) | |
128 { | |
129 int i, j; | |
130 char c; | |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
131 JSSNote *n = p->data; |
0 | 132 |
133 for (i = 0; i < p->nrows; i++) | |
134 { | |
135 fprintf(f, "%.2x: ", i); | |
136 | |
137 for (j = 0; j < p->nchannels; j++) | |
138 { | |
139 switch (n->note) | |
140 { | |
141 case jsetNotSet: | |
142 fprintf(f, "... "); | |
143 break; | |
144 case jsetNoteOff: | |
145 fprintf(f, "=== "); | |
146 break; | |
147 default: | |
148 fprintf(f, "%s%i ", patNoteTable[n->note % 12], n->note / 12); | |
149 break; | |
150 } | |
151 | |
152 if (n->instrument != jsetNotSet) | |
153 fprintf(f, "%.2x ", n->instrument + 1); // Because FT2 is 1-based and we use 0 internally | |
154 else | |
155 fprintf(f, ".. "); | |
156 | |
157 if (n->volume == jsetNotSet) | |
158 fprintf(f, ".. "); | |
159 else if (n->volume >= 0x00 && n->volume <= 0x40) | |
160 fprintf(f, "%.2x ", n->volume); | |
161 else | |
162 { | |
163 switch (n->volume & 0xf0) | |
164 { | |
165 case 0x50: c = '-'; break; | |
166 case 0x60: c = '+'; break; | |
167 case 0x70: c = '/'; break; | |
168 case 0x80: c = '\\'; break; | |
169 case 0x90: c = 'S'; break; | |
170 case 0xa0: c = 'V'; break; | |
171 case 0xb0: c = 'P'; break; | |
172 case 0xc0: c = '<'; break; | |
173 case 0xd0: c = '>'; break; | |
174 case 0xe0: c = 'M'; break; | |
175 default: c = '?'; break; | |
176 } | |
177 fprintf(f, "%c%x ", c, (n->volume & 0x0f)); | |
178 } | |
179 | |
180 if (n->effect >= 0 && n->effect < jmpNMODEffectTable) | |
181 fprintf(f, "%c", jmpMODEffectTable[n->effect]); | |
182 else if (n->effect == jsetNotSet) | |
183 fprintf(f, "."); | |
184 else | |
185 fprintf(f, "?"); | |
186 | |
187 if (n->param != jsetNotSet) | |
188 fprintf(f, "%.2x|", n->param); | |
189 else | |
190 fprintf(f, "..|"); | |
191 | |
192 n++; | |
193 } | |
194 | |
195 fprintf(f, "\n"); | |
196 } | |
197 } | |
198 | |
199 | |
200 /* | |
201 * Print given extended instrument | |
202 */ | |
203 void printEnvelope(FILE *f, JSSEnvelope *e, char *s) | |
204 { | |
205 int i; | |
206 | |
207 fprintf(f, | |
208 "\t%s-envelope:\n" | |
209 "\t - flags.....: %.4x", s, e->flags); | |
210 | |
211 if (e->flags & jenvfUsed) | |
212 fprintf(f, " [used]"); | |
213 if (e->flags & jenvfSustain) | |
214 fprintf(f, " [sust]"); | |
215 if (e->flags & jenvfLooped) | |
216 fprintf(f, " [loop]"); | |
217 | |
218 fprintf(f, "\n" | |
219 "\t - npoints...: %i\n" | |
220 "\t - sustain...: %i\n" | |
221 "\t - loopS.....: %i\n" | |
222 "\t - loopE.....: %i\n", | |
223 e->npoints, e->sustain, e->loopS, e->loopE); | |
224 | |
225 if (dmVerbosity >= 2) | |
226 { | |
227 fprintf(f, "\t - Points....:"); | |
228 for (i = 0; i < e->npoints; i++) | |
229 { | |
230 fprintf(f, " [%i:%i]", | |
231 e->points[i].frame, e->points[i].value); | |
232 } | |
233 | |
234 fprintf(f, "\n"); | |
235 } | |
236 } | |
237 | |
238 | |
239 void printExtInstrument(FILE *f, JSSExtInstrument *i) | |
240 { | |
241 #ifndef JSS_LIGHT | |
795 | 242 if (i->desc && !optDump) |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
243 { |
0 | 244 fprintf(f, |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
245 "Description: '"); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
246 printEscaped(f, i->desc); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
247 fprintf(f, "'\n"); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
248 } |
0 | 249 #endif |
250 fprintf(f, | |
251 "nsamples.......: %i\n" | |
252 "vibratoType....: %i\n" | |
253 "vibratoSweep...: %i\n" | |
254 "vibratoDepth...: %i\n" | |
255 "vibratoRate....: %i\n" | |
256 "fadeOut........: %i\n", | |
257 i->nsamples, i->vibratoType, i->vibratoSweep, | |
258 i->vibratoDepth, i->vibratoRate, i->fadeOut); | |
259 | |
260 if (dmVerbosity >= 1) | |
261 { | |
262 printEnvelope(f, &i->volumeEnv, "Volume"); | |
263 printEnvelope(f, &i->panningEnv, "Panning"); | |
264 } | |
265 fprintf(f, "\n"); | |
266 } | |
267 | |
268 | |
269 void printInstrument(FILE *f, JSSInstrument *i) | |
270 { | |
271 if (dmVerbosity >= 1) | |
272 { | |
273 #ifndef JSS_LIGHT | |
795 | 274 if (i->desc && !optDump) |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
275 { |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
276 fprintf(f, |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
277 "Description: '"); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
278 printEscaped(f, i->desc); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
279 fprintf(f, "'\n"); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
280 } |
0 | 281 #endif |
282 fprintf(f, | |
283 "size...........: %ld (0x%lx)\n" | |
284 "loopStart......: %ld (0x%lx)\n" | |
285 "loopEnd........: %ld (0x%lx)\n" | |
286 "volume.........: %d (0x%x)\n" | |
287 "flags..........: 0x%x ", | |
288 (unsigned long) i->size, (unsigned long) i->size, | |
289 (unsigned long) i->loopS, (unsigned long) i->loopE, | |
290 (unsigned long) i->loopS, (unsigned long) i->loopE, | |
291 i->volume, i->volume, | |
292 i->flags); | |
293 | |
294 if (i->flags & jsfLooped) fprintf(f, "[loop] "); | |
295 if (i->flags & jsfBiDi) fprintf(f, "[bi-di] "); | |
296 if (i->flags & jsf16bit) fprintf(f, "[16bit] "); | |
297 | |
298 fprintf(f, | |
299 "\nC4BaseSpeed....: %d (0x%x)\n" | |
300 "ERelNote.......: %d (%s%d)\n" | |
301 "EFineTune......: %d\n" | |
302 "EPanning,,,....: %d (0x%x)\n\n", | |
303 i->C4BaseSpeed, i->C4BaseSpeed, | |
304 i->ERelNote, patNoteTable[(48 + i->ERelNote) % 12], (48 + i->ERelNote) / 12, | |
305 i->EFineTune, i->EPanning, i->EPanning); | |
306 } | |
307 else | |
308 { | |
309 #ifndef JSS_LIGHT | |
795 | 310 if (i->desc && !optDump) |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
311 { |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
312 printEscaped(f, i->desc); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
313 fprintf(f, "|"); |
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
314 } |
0 | 315 #endif |
316 fprintf(f, | |
1092
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
317 "%8ld|%8ld..%-8ld|%03d|%-2s %-2s %-2s|" |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
318 "%4d|%s%d|%d|%d\n", |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
319 (unsigned long) i->size, |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
320 (unsigned long) i->loopS, |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
321 (unsigned long) i->loopE, |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
322 i->volume, |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
323 |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
324 (i->flags & jsfLooped) ? "lp" : "", |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
325 (i->flags & jsfBiDi) ? "bi" : "", |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
326 (i->flags & jsf16bit) ? "16" : "8", |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
327 |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
328 i->C4BaseSpeed, |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
329 patNoteTable[(48 + i->ERelNote) % 12], |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
330 (48 + i->ERelNote) / 12, i->EFineTune, |
03322ee5bb32
Change dumpmod short format sample instrument output.
Matti Hamalainen <ccr@tnsp.org>
parents:
958
diff
changeset
|
331 i->EPanning); |
0 | 332 } |
333 } | |
334 | |
335 | |
336 void printGeneralInfo(FILE *f, JSSModule *m) | |
337 { | |
338 int i; | |
339 | |
340 if (!m) | |
341 return; | |
342 | |
795 | 343 if (!optDump) |
344 { | |
0 | 345 fprintf(f, "Module type.....: %i\n", m->moduleType); |
346 #ifndef JSS_LIGHT | |
347 if (m->moduleName) | |
348 fprintf(f, "Module name.....: '%s'\n", m->moduleName); | |
349 if (m->trackerName) | |
350 fprintf(f, "Tracker name....: '%s'\n", m->trackerName); | |
351 #endif | |
795 | 352 } |
0 | 353 fprintf(f, |
354 "Speed...........: %d ticks\n" | |
355 "Tempo...........: %d bpm\n" | |
356 "Flags...........: %x ", | |
357 m->defSpeed, m->defTempo, m->defFlags); | |
358 | |
359 if (m->defFlags & jmdfAmigaPeriods) fprintf(f, "[Amiga periods] "); | |
360 if (m->defFlags & jmdfAmigaLimits) fprintf(f, "[Amiga limits] "); | |
361 if (m->defFlags & jmdfStereo) fprintf(f, "[stereo] "); | |
362 if (m->defFlags & jmdfFT2Replay) fprintf(f, "[FT2 replay] "); | |
363 if (m->defFlags & jmdfST300Slides) fprintf(f, "[ST300 slides] "); | |
364 if (m->defFlags & jmdfByteLStart) fprintf(f, "[ByteStart] "); | |
365 | |
366 fprintf(f, "\n" | |
367 "Restart pos.....: %d (order)\n" | |
368 "IntVersion......: %x\n" | |
369 "Channels........: %d\n" | |
370 "Instruments.....: %d\n" | |
371 "Ext.instruments.: %d\n" | |
372 "Patterns........: %d\n" | |
373 "Orders..........: %d\n", | |
374 m->defRestartPos, m->intVersion, m->nchannels, | |
375 m->ninstruments, m->nextInstruments, m->npatterns, | |
376 m->norders); | |
377 | |
378 if (dmVerbosity >= 1) | |
379 { | |
380 fprintf(f, "Orderlist: "); | |
381 for (i = 0; i < m->norders - 1; i++) | |
382 fprintf(f, "%d, ", m->orderList[i]); | |
383 if (i < m->norders) | |
384 fprintf(f, "%d", m->orderList[i]); | |
385 fprintf(f, "\n"); | |
386 } | |
387 } | |
388 | |
389 | |
390 | |
391 int main(int argc, char *argv[]) | |
392 { | |
393 int result = -1, i; | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
730
diff
changeset
|
394 DMResource *file = NULL; |
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
730
diff
changeset
|
395 JSSModule *mod = NULL; |
0 | 396 |
942
38cad00b41dd
Rename viewmod utility to dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
860
diff
changeset
|
397 dmInitProg("dumpmod", "miniJSS Module Viewer", "0.4", NULL, NULL); |
0 | 398 dmVerbosity = 0; |
399 | |
400 // Parse arguments | |
401 if (!dmArgsProcess(argc, argv, optList, optListN, | |
860
daebbf28953d
The argument handling API in dmargs* was synced with th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
797
diff
changeset
|
402 argHandleOpt, argHandleFile, OPTH_BAILOUT)) |
0 | 403 exit(1); |
404 | |
405 // Initialize miniJSS | |
406 jssInit(); | |
407 | |
408 // Open the file | |
409 dmMsg(1, "Reading module file '%s'\n", optFilename); | |
410 if (optFilename == NULL) | |
730
3d813c81f33c
More work on resources API.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
411 result = dmf_create_stdio_stream(stdin, &file); |
3d813c81f33c
More work on resources API.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
412 else |
3d813c81f33c
More work on resources API.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
413 result = dmf_create_stdio(optFilename, "rb", &file); |
3d813c81f33c
More work on resources API.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
414 |
3d813c81f33c
More work on resources API.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
415 if (result != DMERR_OK) |
0 | 416 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
942
diff
changeset
|
417 dmErrorMsg("Error opening input file '%s', #%d: %s\n", |
730
3d813c81f33c
More work on resources API.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
418 optFilename, result, dmErrorStr(result)); |
0 | 419 return 1; |
420 } | |
421 | |
422 // Read module file | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
423 dmMsg(1, "Reading file: %s\n", optFilename); |
0 | 424 #ifdef JSS_SUP_XM |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
425 dmMsg(1, "* Trying XM...\n"); |
797
f066e9dccf29
Oops, fix some inverted booleans.
Matti Hamalainen <ccr@tnsp.org>
parents:
796
diff
changeset
|
426 result = jssLoadXM(file, &mod, TRUE); |
0 | 427 #endif |
428 #ifdef JSS_SUP_JSSMOD | |
429 if (result != 0) | |
430 { | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
431 dmfseek(file, 0L, SEEK_SET); |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
730
diff
changeset
|
432 dmMsg(1, "* Trying JSSMOD ...\n"); |
796 | 433 result = jssLoadJSSMOD(file, &mod, TRUE); |
0 | 434 } |
435 #endif | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
436 dmf_close(file); |
8
fc097f7717df
Fix JSSMod loading in viewmod and testpl.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
437 if (result != DMERR_OK) |
0 | 438 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
942
diff
changeset
|
439 dmErrorMsg("Error loading module file, %d: %s\n", |
8
fc097f7717df
Fix JSSMod loading in viewmod and testpl.
Matti Hamalainen <ccr@tnsp.org>
parents:
0
diff
changeset
|
440 result, dmErrorStr(result)); |
0 | 441 return 3; |
442 } | |
443 | |
444 // Print out information | |
445 if (optViewGeneralInfo) | |
79
d6c2efa25aa4
Oops, missed one s/m/mod/ .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents:
77
diff
changeset
|
446 printGeneralInfo(stdout, mod); |
0 | 447 |
448 if (optViewPatterns) | |
449 { | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
450 for (i = 0; i < mod->npatterns; i++) |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
451 if (mod->patterns[i] != NULL) |
0 | 452 { |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
453 printf("\nPattern #%02x:\n", i); |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
454 printPattern(stdout, mod->patterns[i]); |
0 | 455 } |
456 } | |
457 | |
458 if (optViewExtInstruments) | |
459 { | |
460 printf("\n" | |
461 "ExtInstruments:\n" | |
462 "---------------\n" | |
463 ); | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
464 for (i = 0; i < mod->nextInstruments; i++) |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
465 if (mod->extInstruments[i] != NULL) |
0 | 466 { |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
467 printf("#%02x: ", i + 1); |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
468 printExtInstrument(stdout, mod->extInstruments[i]); |
0 | 469 } |
470 } | |
471 | |
472 if (optViewInstruments) | |
473 { | |
474 printf("\n" | |
475 "Instruments:\n" | |
476 "------------\n" | |
477 ); | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
478 for (i = 0; i < mod->ninstruments; i++) |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
479 if (mod->instruments[i] != NULL) |
0 | 480 { |
1110
ea2cc4932714
Improve output of dumpmod.
Matti Hamalainen <ccr@tnsp.org>
parents:
1092
diff
changeset
|
481 printf("#%02x: ", i + 1); |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
482 printInstrument(stdout, mod->instruments[i]); |
0 | 483 } |
484 } | |
485 | |
486 // Free module data | |
77
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
487 jssFreeModule(mod); |
c6cdaa675801
Add the file mode parameter to dmf_create_stdio() calls, and throw in some
Matti Hamalainen <ccr@tnsp.org>
parents:
8
diff
changeset
|
488 jssClose(); |
0 | 489 |
490 exit(0); | |
491 return 0; | |
492 } |