11#include < math.h>
22
3- #include < malloc.h>
4- #include < string.h>
53#include " core/VirtualStream.h"
64#include " core/cmdlib.h"
7- #include " core/dktypes.h "
8- #include " util/util.h "
5+ #include < string.h >
6+ #include < stdlib.h >
97
8+ #include < nstd/String.hpp>
9+ #include < nstd/File.hpp>
10+ #include < nstd/Directory.hpp>
1011
1112// WAV file header and smpl-chunk template - Quick and dirty solution because I'm lazy
1213int wavHeader[11 ] = {
@@ -186,9 +187,13 @@ int DecompressAndRestoreXM(char* destXM, char* xmData, int srcSize, PCMSample* s
186187
187188 unsigned short * version = (unsigned short *)(&destXM[58 ]);
188189
190+ bool decompress = false ;
191+
189192 // check if it's an XMPlay version (superpacked)
190193 if (*version != 0xDDBA )
191194 {
195+ MsgInfo (" Already a non-compressesd XM. Exiting\n " );
196+
192197 memcpy (destXM, xmData, srcSize);
193198 return srcSize;
194199 }
@@ -431,7 +436,9 @@ int LoadSoundBank(SAMPLE_DATA* out_sample_info, PCMSample* out_samples, FILE* fp
431436
432437void ExportSBK (FILE* sbkFp, const char * sbkFileName)
433438{
434- char tmpString[_MAX_PATH];
439+ String sbkName = String::fromCString (sbkFileName);
440+ String directory = File::dirname (sbkName) + " /" + File::basename (sbkName, File::extension (sbkName));
441+
435442 PCMSample pcmSamples[80 ];
436443 SAMPLE_DATA sampleDescs[80 ];
437444 memset (pcmSamples, 0 , sizeof (PCMSample) * 80 );
@@ -440,16 +447,16 @@ void ExportSBK(FILE* sbkFp, const char* sbkFileName)
440447 int numBankSamples = LoadSoundBank (sampleDescs, pcmSamples, sbkFp);
441448
442449 if (numBankSamples)
443- mkdirRecursive (sbkFileName, true );
450+ Directory::create (directory );
444451
445452 for (int i = 0 ; i < numBankSamples; i++)
446453 {
447454 PCMSample& sample = pcmSamples[i];
448455 SAMPLE_DATA& sampleDesc = sampleDescs[i];
449456
450- snprintf (tmpString, _MAX_PATH, " %s/%d.wav" , sbkFileName , i);
451-
452- FILE* wavfp = fopen (tmpString , " wb" );
457+ String fileName = String::fromPrintf ( " %s/%d.wav" , ( char *)directory , i);
458+
459+ FILE* wavfp = fopen (fileName , " wb" );
453460
454461 if (wavfp)
455462 {
@@ -476,26 +483,26 @@ void ExportSBK(FILE* sbkFp, const char* sbkFileName)
476483 fclose (wavfp);
477484 }
478485 else
479- MsgError (" Unable to create file %s\n " , tmpString );
486+ MsgError (" Unable to create file %s\n " , ( char *)fileName );
480487 }
481488}
482489
483- int DoConvertBLK (const char * sbkFileName )
490+ int DoConvertBLK (const char * blkFileName )
484491{
485- char tmpString[_MAX_PATH] ;
486- snprintf (tmpString, _MAX_PATH, " %s_dec " , sbkFileName );
492+ String blkName = String::fromCString (blkFileName) ;
493+ String directory = File::dirname (blkName) + " / " + File::basename (blkName, File::extension (blkName) );
487494
488- MsgWarning (" Loading '%s'...\n " , sbkFileName );
495+ MsgWarning (" Loading '%s'...\n " , blkFileName );
489496
490- FILE* blkFp = fopen (sbkFileName , " rb" );
497+ FILE* blkFp = fopen (blkFileName , " rb" );
491498
492499 if (!blkFp)
493500 {
494- MsgError (" No such file '%s'!" , sbkFileName );
501+ MsgError (" No such file '%s'!" , blkFileName );
495502 return -1 ;
496503 }
497504
498- mkdirRecursive (tmpString );
505+ Directory::create (directory );
499506
500507 // read count
501508 int numSoundBanks = 0 ;
@@ -514,7 +521,10 @@ int DoConvertBLK(const char* sbkFileName)
514521 for (int i = 0 ; i < numSoundBanks; i++)
515522 {
516523 fseek (blkFp, blockLimit[i], SEEK_SET);
517- ExportSBK (blkFp, varargs (" %s/Bank_%d" , tmpString, i));
524+
525+ String bankName = String::fromPrintf (" %s/Bank_%d" , (char *)directory, i);
526+
527+ ExportSBK (blkFp, bankName);
518528 }
519529
520530 fclose (blkFp);
@@ -545,14 +555,10 @@ int DoConvertSBK(const char* sbkFileName)
545555
546556int DoConvertXMAndSBK (const char * xmFilename)
547557{
548- char tmpString[_MAX_PATH];
549- char sbkFileName[_MAX_PATH];
550- strcpy (sbkFileName, xmFilename);
551-
552- char * extStr = strchr (sbkFileName, ' .' );
553- if (extStr)
554- strcpy (extStr, " .sbk" );
555-
558+ String xmName = String::fromCString (xmFilename);
559+ String directory = File::dirname (xmName);
560+ String sbkFileName = File::basename (xmName, File::extension (xmName)) + " .SBK" ;
561+
556562 FILE* psxXmFp = fopen (xmFilename, " rb" );
557563
558564 if (!psxXmFp)
@@ -565,11 +571,11 @@ int DoConvertXMAndSBK(const char* xmFilename)
565571
566572 if (!sbkFp)
567573 {
568- MsgError (" No such file '%s'!" , sbkFileName);
574+ MsgError (" No such file '%s'!" , ( char *) sbkFileName);
569575 return -1 ;
570576 }
571577
572- MsgWarning (" Loading '%s' & '%s'...\n " , xmFilename, sbkFileName);
578+ MsgWarning (" Loading '%s' & '%s'...\n " , xmFilename, ( char *) sbkFileName);
573579
574580 PCMSample pcmSamples[80 ];
575581 SAMPLE_DATA sampleDescs[80 ];
@@ -580,12 +586,11 @@ int DoConvertXMAndSBK(const char* xmFilename)
580586
581587 // restore XM and save to disk
582588 {
583- *extStr = 0 ;
589+ Msg ( " --- XM song '%s' --- \n " , ( char *)xmName) ;
584590
585- Msg (" --- XM song '%s' ---\n " , sbkFileName);
586- sprintf (tmpString, " %s_orig.xm" , sbkFileName);
591+ String origXMFileName = directory + " /" + File::basename (xmName, File::extension (xmName)) + " _orig." + File::extension (xmName);
587592
588- FILE* xmFp = fopen (tmpString , " wb" );
593+ FILE* xmFp = fopen (origXMFileName , " wb" );
589594
590595 if (xmFp)
591596 {
@@ -604,7 +609,7 @@ int DoConvertXMAndSBK(const char* xmFilename)
604609
605610 for (int j = 0 ; j < numBankSamples; j++)
606611 {
607- // printf("sample %d rate=%d loop=%d size=%d\n", j, sample .samplerate, sample.loop, sample.length);
612+ // printf("sample %d rate=%d loop=%d size=%d\n", j, pcmSamples[j] .samplerate, sample.loop, sample.length);
608613 addSize += pcmSamples[j].length * sizeof (short );
609614 }
610615
@@ -624,7 +629,7 @@ int DoConvertXMAndSBK(const char* xmFilename)
624629 free (xmData);
625630 }
626631 else
627- MsgError (" ERROR: can't open '%s' for write!" , tmpString );
632+ MsgError (" ERROR: can't open '%s' for write!" , ( char *)origXMFileName );
628633 }
629634
630635 // free samples
@@ -650,10 +655,14 @@ int DoExtractMusicFile(const char* fileName)
650655 return -1 ;
651656 }
652657
658+ String musicBinName = String::fromCString (fileName);
659+ String directory = File::dirname (musicBinName);
660+
661+
653662 MsgWarning (" Loading '%s'...\n " , fileName);
654663
655664 // char songPath[_MAX_PATH];
656- char tmpString[_MAX_PATH];
665+ // char tmpString[_MAX_PATH];
657666
658667 // max 80 samples per bank
659668 PCMSample pcmSamples[80 ];
@@ -689,9 +698,9 @@ int DoExtractMusicFile(const char* fileName)
689698 // restore XM and save to disk
690699 {
691700 Msg (" --- XM song %d ---\n " , i);
692- sprintf (tmpString, " % s_song%d.xm" , fileName , i);
701+ String xmFileName = String::fromPrintf ( " %s/% s_song%d.xm" , ( char *)directory, ( char *) File::basename (musicBinName, File::extension (musicBinName)) , i);
693702
694- FILE* xmFp = fopen (tmpString , " wb" );
703+ FILE* xmFp = fopen (xmFileName , " wb" );
695704
696705 if (xmFp)
697706 {
@@ -719,7 +728,7 @@ int DoExtractMusicFile(const char* fileName)
719728 fclose (xmFp);
720729 }
721730 else
722- MsgError (" ERROR: can't open '%s' for write!" , tmpString );
731+ MsgError (" ERROR: can't open '%s' for write!" , ( char *)xmFileName );
723732
724733 free (xmData);
725734 }
@@ -798,5 +807,8 @@ int main(int argc, char** argv)
798807 }
799808 }
800809
810+ if (argc > 1 )
811+ Msg (" All done\n " );
812+
801813 return 0 ;
802814}
0 commit comments