// Basic sfArk decompressor for Mac // Copyright 2002 Andy Inman // Contact via: http://netgenius.co.uk or http://melodymachine.com // This file is part of sfArkLib. // // sfArkLib is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // sfArkLib is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with sfArkLib. If not, see . // based on SDL_Test // Reads an existing .sfArk file and writes an sf2 file using standard file i/o // Return 0 if successful, 1 if some error occurred. // Info and error messages are printed to stdout // Initial version, andyi, 14-Sep-2002 const char *ThisProg = "sfarkxtc"; const char *ThisVersion = "3.0-SNAPSHOT"; // Version of program // Standard includes... #include #include #include //#include #include // Application-supplied functions... void sfkl_msg(const char *MessageText, int Flags); // Message display function void sfkl_UpdateProgress(int ProgressPercent); // Progress indication bool sfkl_GetLicenseAgreement(const char *LicenseText); // Display/confirm license void sfkl_DisplayNotes(const char *NotesFileName, const char *OutFileName); // Display notes text file int ReportError(long error) { // Display an error message, return 0 if there was no error else 1 const char *msg; switch (error) { case SFARKLIB_SUCCESS: msg = "Successful"; break; case SFARKLIB_ERR_INIT: msg = "Failed initialisation"; break; case SFARKLIB_ERR_MALLOC: msg = "Memory allocation error"; break; case SFARKLIB_ERR_SIGNATURE: msg = "Signature not found (file is corrupt or is not a sfArk file)"; break; case SFARKLIB_ERR_HEADERCHECK: msg = "Header check fails (file is corrupt)"; break; case SFARKLIB_ERR_INCOMPATIBLE: msg = "File was created by incompatible sfArk version (not 2.x)"; break; case SFARKLIB_ERR_UNSUPPORTED: msg = "Unsupported feature was used"; break; case SFARKLIB_ERR_CORRUPT: msg = "Invalid compressed data (file is corrupt)"; break; case SFARKLIB_ERR_FILECHECK: msg = "Checksum failed (file is corrupt)"; break; case SFARKLIB_ERR_FILEIO: msg = "File i/o failed"; break; case SFARKLIB_ERR_OTHER: msg = "Other error"; break; default: msg = "Undefined error"; } printf("Result: %s errorcode %ld\n", msg, -error); if(error != SFARKLIB_SUCCESS) { printf("*** FAILED ***\n"); return 1; } else { return 0; } } // ============================ m a i n ============================================== int main(int argc, char** argv) { // Print welcome message... printf("========================================================================\n"); printf("%s %s ", ThisProg, ThisVersion); printf("(using sfArkLib version: %d)\n", sfkl_GetVersion()); printf("copyright (c) 1998-2002 melodymachine.com, distributed under the GNU GPL\n"); printf("========================================================================\n"); // Open input and output files... char *InFileName = argv[1]; char *OutFileName = argv[2]; // usage if (argc != 3) { printf("Specify input and output files on the command line, i.e:\n"); printf("%s \n", ThisProg); printf("Press ENTER."); //getc(stdin); return 1; } // Uncompress the file... printf("Uncompressing %s to %s...\n", InFileName, OutFileName); long StartTime = clock(); int err = sfkl_Decode(InFileName, OutFileName); //call decompression, report & return long TimeTaken = 1000 * (clock() - StartTime) / CLOCKS_PER_SEC; printf("cpu time taken %ld ms\n", TimeTaken); return ReportError(err); } // ============================================================================================ void sfkl_msg(const char *MessageText, int Flags) { if (Flags & SFARKLIB_MSG_PopUp) printf("*** "); printf("%s\n", MessageText); } // ============================================================================================ void sfkl_UpdateProgress(int ProgressPercent) { //char ProgressBar[101]; //int i; //for (i = 0; i < ProgressPercent; i++) // ProgressBar[i] = '*'; //for ( ; i < 100; i++) // ProgressBar[i] = '-'; //ProgressBar[100] = '\0'; //printf(ProgressBar); printf("\r"); //printf("*"); printf("Progress: %d%%", ProgressPercent); fflush(stdout); if (ProgressPercent == 100) printf("\n"); return; } // ========================================================================================== // Display/confirm license bool sfkl_GetLicenseAgreement(const char *LicenseText, const char *OutFileName) { char c; printf("%s\n\nDo you agree to the above terms? (Y/N) ", LicenseText); //c = getc(stdin); c = 'y'; while (c != 'y' && c != 'Y' && c != 'n' && c != 'N') { printf("\nPlease answer Y or N and press return: "); c = getc(stdin); } if (c == 'y' || c == 'Y') return true; else return false; } // ============================================================================================ void sfkl_DisplayNotes(const char *NotesFilePath, const char* OutFileName) // Display notes text file { printf("Notes text file extracted to: %s\n ", NotesFilePath); } // =====================================================================================