/* MRBackup user preferences processing. * Filename: UserPrefs.c * Date: 08/23/87 * * History: (most recent change first) * * 12/20/87 -MRR- Added PutUserPrefs to allow saving new preferences. * 11/23/87 -MRR- Version 2.0. * */ #include "MRBackup.h" char *fgets(); extern struct Gadget backPathGadget; extern struct Gadget xcldPathGadget; extern struct Gadget homePathGadget; extern struct Gadget listPathGadget; extern struct Menu Menu1; #define KEYMAX 20 /* max length of a keyword */ #define NKEYWORD 9 /* number of keywords supported */ #define PREFERENCES_FILE "S:MRBackup.init" #define KW_HOME 0 #define KW_BACKUP 1 #define KW_LIST 2 #define KW_EXCLUDE 3 #define KW_COMPRESSION 4 #define KW_LISTING 5 #define KW_SPEECH 6 #define KW_FORMAT 7 #define KW_BIGFILES 8 static char *keywords[NKEYWORD] = { "home", "backup", "list", "exclude", "compression", "listing", "speech", "format","bigfiles" }; /* Process the user preferences file. */ GetUserPrefs() { char c; USHORT i; char keyword[KEYMAX+1]; short keyindex; USHORT keyleng; FILE *prefs; char s[81]; char *s1, *s2, *s3; if (!(prefs = fopen(PREFERENCES_FILE,"r"))) { WriteConsole("I couldn't get your preferences.\n"); return; } while (fgets(s, 80, prefs)) { if (*s == '#') continue; WriteConsole(s); s1 = s; keyleng = 0; while ((c = *s1++) && isalpha(c)) { if (keyleng < KEYMAX) keyword[keyleng++] = tolower(c); else { badkey: WriteConsole("Keyword error in preferences file.\n"); err: goto done; } } keyword[keyleng] = '\0'; for (keyindex = -1, i = 0; i < NKEYWORD; ++i) { if (!strcmp(keyword, keywords[i])) { keyindex = i; /* found it */ break; } } if (keyindex < 0) goto badkey; while (c == ' ' || c == '\t') c = *s1++; if (c != '=') { badsyn: WriteConsole("Syntax error in preferences file.\n"); goto done; } /* Get the parameter field, minus any leading or trailing * blanks. */ while ((c = *s1) == ' ' || c == '\t') ++s1; /* skip leading blanks */ /* Delete trailing blanks. */ s2 = s3 = s1; while (c && c != '\n') { if (c != ' ' && c != '\t') s2 = s3; /* record non-blank end */ c = *s3++; } *s2 = '\0'; /* truncate the string here */ SetUserPref(keyindex, s1); } done: fclose(prefs); } /* Output a boolean preference setting. * Called with: * f: preferences file descriptor * value: boolean value */ PutBoolPref(f, value) FILE *f; unsigned value; { char *s; s = (value ? "YES" : "NO"); fputs(s, f); } /* Save the current program settings in the user preferences file. */ PutUserPrefs() { char backupName[81]; /* backup path name */ unsigned keyIndex; FILE *prefs; strcpy(backupName, PREFERENCES_FILE); strcat(backupName, ".bak"); if ( CopyFile(PREFERENCES_FILE, backupName) ) TypeAndSpeak( "I couldn't back up the current preferences but I'll go on.\n"); if (!(prefs = fopen(PREFERENCES_FILE, "w") ) ) { sprintf(conmsg, "I couldn't open the preferences file, %s, for output;\n error %d\n", PREFERENCES_FILE, errno); return; } for (keyIndex = 0; keyIndex < NKEYWORD; ++keyIndex) { fprintf(prefs,"%s = \t\t", keywords[keyIndex]); switch (keyIndex) { case KW_HOME: fputs(homePath,prefs); break; case KW_BACKUP: fputs(backPath,prefs); break; case KW_LIST: fputs(listPath,prefs); break; case KW_EXCLUDE: fputs(excludePath,prefs); break; case KW_COMPRESSION: PutBoolPref(prefs, doFormat); break; case KW_LISTING: PutBoolPref(prefs, doListing); break; case KW_SPEECH: PutBoolPref(prefs, doSpeech); break; case KW_FORMAT: PutBoolPref(prefs, doFormat); break; case KW_BIGFILES: PutBoolPref(prefs, doBigFiles); break; default: sprintf(conmsg, "Program error in PutUserPrefs for keyword \"%s\". Please report this.\n", keywords[keyIndex]); TypeAndSpeak(conmsg); } fputs("\n", prefs); } fclose(prefs); } /* Set/Clear checkmarks according to the item being set. * Called with: * thisItem: menu item number * value: character string containing some form of YES or NO */ BOOL SetMenuItem(itemNumber, value) USHORT itemNumber; char *value; { BOOL boolean; LONG menu; struct MenuItem *item; short i; /* Get pointers and menu numbers for the affected items. */ menu = SHIFTITEM((long) itemNumber) | SHIFTMENU((long) MENU_FLAGS); item = ItemAddress(&Menu1, menu); if (item == NULL) { WriteConsole("Null menu item in SetMenuItem - call Mark!!\n"); return false; } boolean = ( tolower(*value) == 'y' ); if (boolean) { /* true? */ item->Flags |= CHECKED; } else { /* false */ item->Flags &= ~CHECKED; } return boolean; } void SetStringGadget(gadget, value) struct Gadget *gadget; char *value; { UBYTE *gs; /* pointer to gadget string */ RemoveGadget(pathWindow, gadget); gs = (UBYTE *) GadgetString(gadget); strcpy(gs, value); ResetStringInfo(gadget->SpecialInfo); AddGadget(pathWindow, gadget, -1L); DoGadget(pathWindow, GADGETUP, gadget); /* simulate GADGETUP */ } /* Set one user preference item. * Called with: * kw: keyword index * parm: parameter string */ SetUserPref(kw, parm) USHORT kw; char *parm; { switch (kw) { case KW_HOME: SetStringGadget(&homePathGadget, parm); break; case KW_BACKUP: SetStringGadget(&backPathGadget, parm); break; case KW_LIST: SetStringGadget(&listPathGadget, parm); break; case KW_LISTING: doListing = SetMenuItem(ITEM_LIST, parm); break; case KW_EXCLUDE: SetStringGadget(&xcldPathGadget, parm); break; case KW_COMPRESSION: doCompress = SetMenuItem(ITEM_COMPRESS, parm); break; case KW_SPEECH: doSpeech = SetMenuItem(ITEM_SPEECH, parm); break; case KW_FORMAT: doFormat = SetMenuItem(ITEM_FORMAT, parm); break; case KW_BIGFILES: doBigFiles = SetMenuItem(ITEM_BIGFILES, parm); break; default: break; } }