/* PowerComPress v0.9 Copyright (C) 2005 Jonas Gehring PowerComPress 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 2 of the License, or (at your option) any later version. PowerComPress 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 PowerComPress; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // C Source File // Created 18.09.2005; 22:09:51 #include #include #include #include "advdialogs.h" #include "pcpress.h" #define GetDataType _rom_call(short,(CESI),435) #define SmapTypeStrings _rom_call(const char*,(short),436) // Tests if a folder already exists (returns TRUE if everything is OK) BOOL TestFolder(const char *varname) { short pos = 0; char tmpname[18], msg[40]; SYM_ENTRY *SymPtr = SymFindFirst(NULL, 0); if ((pos = strcspn(varname, append)) == strlen(varname)) return TRUE; memset(tmpname, 0, sizeof(tmpname)); // A folder name with more than 8 chars isn't possible if (pos > 8) return FALSE; strncpy(tmpname, varname, pos); // Try to find folder while (SymPtr) { // If the folder already exists if (!strncmp(SymPtr->name, tmpname, strlen(tmpname)+1)) return TRUE; SymPtr = SymFindNext(); } // Initialize dialog AdvDlgInit(120, 30, "PowerComPress", B_ESC, B_OK, TRUE, save_int_1); // Add dialog elements sprintf(msg, "Create folder %s%c ?", tmpname, append[0]); AdvDlgAdd(AD_TEXT, msg, NULL, 0, 0, 0, TXT_STANDARD); // Execute Dialog if (!AdvDlgDo()) { return FALSE; } // Create new folder if (FolderAdd(SYMSTR(tmpname)) == H_NULL) { return FALSE; } return TRUE; } // Returns the type of a variable as a string (in buffer) void VarTypeToStr(SYM_ENTRY *var, char *buffer) { short i; char *tag; tag = HToESI(var->handle); if (GetDataType(tag) != SDT_OTH) { sprintf(buffer, "%c", 46); strcat(buffer, SmapTypeStrings(GetDataType(HToESI(var->handle)))); } else { tag -= 5; sprintf(buffer, "%c", 46); // 3 letters? if (!isalpha(tag[0])) tag++; strcat(buffer, tag); } // Convert string to lowercase for (i = 0; i < 5; i++) { buffer[i] = tolower(buffer[i]); } } // Determines the size of a variable size_t GetVarSize(SYM_ENTRY *var) { return /*(size_t)*/((MULTI_EXPR*)HeapDeref(var->handle))->Size; } // Deletes a variable BOOL DeleteVar(const char *varname) { SYM_ENTRY *symptr; if ((symptr = DerefSym(SymFind(SYMSTR(varname)))) == NULL) return FALSE; if (symptr->flags.bits.archived) { // Initialize dialog AdvDlgInit(100, 58, "PowerComPress - Warning", B_NO, B_YES, TRUE, save_int_1); // Add dialog elements AdvDlgAdd(AD_TEXT, "Warning!", NULL, 0, 0, 0, TXT_STANDARD); AdvDlgAdd(AD_TEXT, varname, NULL, 0, 0, 0, TXT_STANDARD); AdvDlgAdd(AD_TEXT, "is archived.", NULL, 0, 0, 0, TXT_STANDARD); AdvDlgAdd(AD_TEXT, "Proceed?", NULL, 0, 0, 0, TXT_STANDARD); if (!AdvDlgDo()) return FALSE; if (!EM_moveSymFromExtMem(SYMSTR(varname), HS_NULL)) return FALSE; } return SymDel(SYMSTR(varname)); } // Deletes a folder BOOL DeleteFolder(const char *foldername) { SYM_ENTRY *symptr = SymFindFirst(SYMSTR(foldername), FO_SINGLE_FOLDER);; char varname[18]; // Delete all files while (symptr) { if (strncmp(symptr->name, "pcpress", 7) && strncmp(symptr->name, "pcpdata", 7) && strncmp(symptr->name, "pcpcfg", 7) && !symptr->flags.bits.twin && !symptr->flags.bits.local && !symptr->flags.bits.hidden) { sprintf(varname, "%s%c%s", foldername, append[0], symptr->name); if (!DeleteVar(varname)) { return FALSE; } } symptr = SymFindNext(); } // Delete the folder if (strncmp(foldername, "main", 4)) { return FolderDel(SYMSTR(foldername)); } return TRUE; } // Archive or unarchive a variable void ArchiveVar(const char *varname) { SYM_ENTRY *symptr; if ((symptr = DerefSym(SymFind(SYMSTR(varname)))) == NULL) return; symptr->flags.bits.locked = FALSE; if (symptr->flags.bits.archived) EM_moveSymFromExtMem(SYMSTR(varname), HS_NULL); else EM_moveSymToExtMem(SYMSTR(varname), HS_NULL); } // Load config-file BOOL LoadOptions(void) { FILE *file = NULL; // Open file for reading in binary mode if ((file = fopen("pcpcfg", "rb")) != NULL) { // Read data from file into th variable mode if (fread(&options, 1, sizeof(OPTIONS), file) != sizeof(OPTIONS)) { return FALSE; } // Close the file fclose(file); return TRUE; } return FALSE; } // Save config-file BOOL SaveOptions(void) { FILE *file = NULL; // Open file for writing if ((file = fopen("pcpcfg", "wb")) != NULL) { // Write data to the file if (fwrite(&options, 1, sizeof(OPTIONS), file) != sizeof(OPTIONS)) { return FALSE; } // Add the file ID tag fputc(0, file); fputs("cfg", file); fputc(0, file); fputc(OTH_TAG, file); // Close the file fclose(file); } return TRUE; }