/* MRBackup user preferences processing. * Filename: UserPrefs.c * Date: 08/23/87 */ #include "MRBackup.h" char *fgets(); extern struct Gadget backpathgad; extern struct Gadget excludepathgad; extern struct Gadget homepathgad; extern struct Gadget listpathgad; extern struct Requester *pathrequest; extern struct Window *pathwindow; #define KEYMAX 20 /* max length of a keyword */ #define NKEYWORD 7 /* 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 static char *keywords[NKEYWORD] = { "home", "backup", "list", "exclude", "compression", "listing", "speech" }; /* 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 = *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) == ' ') ++s1; /* skip leading blanks */ /* Delete trailing blanks. */ s2 = s3 = s1; while (c && c != '\n') { if (c != ' ') s2 = s3; /* record non-blank end of string */ c = *s3++; } *s2 = '\0'; /* truncate the string here */ SetUserPref(keyindex, s1); } done: fclose(prefs); } /* Save the current program settings in the user preferences file. */ PutUserPrefs() { WriteConsole("PutUserPrefs() is not implemented\n"); } /* Set/Clear checkmarks according to the item being set. This routine * is VERY application specific and assumes that the affected menu * items are * 1. grouped in pairs (on/off) * 2. adjacent (item, item+1) * 3. ordered in on, off order (Listing, No Listing) */ BOOL SetMenuItem(item, value) USHORT item; char *value; { BOOL boolean; LONG excludebits, excludemask; LONG menu1, menu2; struct MenuItem *item1, *item2; short i; /* Get pointers and menu numbers for the affected items. */ menu1 = SHIFTITEM((long) item) | SHIFTMENU((long) MENU_FLAGS); item1 = ItemAddress(&Titles[0], menu1); menu2 = SHIFTITEM((long) item + 1) | SHIFTMENU((long) MENU_FLAGS); item2 = ItemAddress(&Titles[0], menu2); if (item1 == NULL || item2 == NULL) { WriteConsole("Null menu item in SetMenuItem - call Mark!!\n"); return false; } boolean = ( tolower(*value) == 'y' ); if (boolean) { /* true? */ item1->Flags |= CHECKED; item2->Flags &= ~CHECKED; } else { /* false */ item1->Flags &= ~CHECKED; item2->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(&homepathgad, parm); break; case KW_BACKUP: SetStringGadget(&backpathgad, parm); break; case KW_LIST: SetStringGadget(&listpathgad, parm); break; case KW_LISTING: do_listing = SetMenuItem(ITEM_LIST, parm); break; case KW_EXCLUDE: SetStringGadget(&excludepathgad, parm); break; case KW_COMPRESSION: do_compress = SetMenuItem(ITEM_COMPRESS, parm); break; case KW_SPEECH: do_speech = SetMenuItem(ITEM_SPEECH, parm); break; default: break; } }