/*** *init.c - disked keyword and parameter initialize/set/display * *Copyright (c) 1991-1995, Gregg Jennings. All wrongs reserved. * P O Box 200, Falmouth, MA 02541-0200 * *Purpose: * Configuration handling. * *Notice: * This progam may be freely used and distributed. Any distrubution * with modifications must retain the above copyright statement and * modifications noted. * No pulp-publication, in whole or in part, permitted without * permission (magazines or books). *******************************************************************************/ /* Versions: 1.1 04-Sep-1994 save/restore now has a structure 1.0 18-Apr-1994 Release Notes: Programming Notes: */ #include #include #include #include #include "disked.h" #include "init.h" #include "keys.h" #include "console.h" #include "diskio.h" #include "arrays.h" /* global data defined here */ enum ARG_TYPE { BOOL_ARG, NUM_ARG, TEXT_ARG }; KEYWORDS kw[] = { { ALTD, 1, "display", BOOL_ARG }, // 0 { ALTG, 0, "get", BOOL_ARG}, // 1 { ALTH, 1, "home", BOOL_ARG }, // 2 { ALTM, 1, "mask", BOOL_ARG }, // 3 { ALTV, 1, "verify", BOOL_ARG }, // 4 { ALTW, 0, "write", BOOL_ARG }, // 5 { ALTS, 1, "strip", BOOL_ARG }, // 6 { ALTC, 1, "convert", BOOL_ARG }, // 7 { ALTF, 0, "files", BOOL_ARG }, // 8 { 0, 0, "Debug", BOOL_ARG }, // 9 { ALTA, 0, "ascii", BOOL_ARG }, // 10 { ALTP, 1, "partial", BOOL_ARG }, // 11 { ALTL, 1, "logical", BOOL_ARG }, // 12 { ALTT, 0, "translate", BOOL_ARG }, // 13 { 0, 0, NULL, 0}, // 14 Note: THIS MUST BE NUL { ALTR,10, "radix", NUM_ARG }, // 15 { 0, 1, "signon", BOOL_ARG }, // 16 { ALTI, 2, "i/o", NUM_ARG }, // 17 { 0, 1, "viewer", BOOL_ARG }, // 18 { 0, 0, "filter", BOOL_ARG }, // 19 { 0, 0, NULL, 0} // }; /* internal data */ typedef struct { int argsize; void *value; } SAVE_STATE; static SAVE_STATE save_state[] = { { sizeof(int), &disk }, { sizeof(long), &log_sector}, { sizeof(tagged), &tagged}, { sizeof(char) * SEARCH, findstr}, { 0 } }; /* internal functions */ static int lookup(char *t, KEYWORDS *kw, int num); static int boolarg(char *); static int numarg(char *); #if 0 static int keyarg(char *arg,int key); static unsigned long longarg(char *arg); #endif static int (*setup_func[])(char *) = {boolarg,numarg}; /* Read DISKED.INI and set the world. 3.0 09-Apr-1994 completely re-written 2.1 02-Apr-1994 forgot the fclose() ver 2.0 removed "boot" and "video" 02-Dec-1993 ver 1.1 added "Expert" */ extern int initialize(char *filename) { int i; char string[100], *seps = " \t\n,:="; char *p,*arg; FILE *file; if (stricmp(filename,"none")==0 || filename[0]=='\0') return 0; if ((file = fopen(filename,"r"))==NULL) return -1; while (!feof(file)) { if (fgets(string,100,file) == NULL) break; if ((p = strtok(string,seps)) == NULL) continue; if (strchr(";/[",*p)) continue; if (strcmp("Expert",p) == 0) { write_to = Write = Files = Translate = 1; Display = Verify = Home = Strip = Signon = 0; continue; } if ((arg = strtok(NULL,seps)) != NULL) if ((i = lookup(p,kw,sizeof(kw)/sizeof(KEYWORDS))) != -1) kw[i].value = setup_func[kw[i].type](arg); } /* Now deal with all of the special cases and do range checking */ if (Write) { write_to = 1; Write = 0; /* and make user turn it on */ } if (Radix < 1 || Radix > 26) Radix = 10; if (Output < STDIO || Output > BIOS) Output = STDIO; fclose(file); return 1; } /* restore position, tagged sectors, find string */ extern int saveinit(char *filename) { SAVE_STATE *ss = save_state; FILE *file; if ((file = fopen(filename,"w")) == NULL) { perror(filename); return 0; } fprintf(file,"; DISKED.SAV %s %s\n",Version,__DATE__); for (; ss->value; ss++) fwrite(ss->value,ss->argsize,1,file); fclose(file); return 1; } extern int getinit(char *filename, int arg) { SAVE_STATE *ss = save_state; char string[100]; FILE *file; if ((file=fopen(filename,"r"))==NULL) { if (errno != ENOENT) perror(filename); return 0; } if (fgets(string,100,file) != NULL) { if (arg == INIT_RESTORE) { for (; ss->value; ss++) fread(ss->value,ss->argsize,1,file); } else if (arg == INIT_VIEW) { print("\n%s",string); fread(string,ss[0].argsize,1,file); /* disk */ print("\ndisk: %c:",*(int *)string + 'A'-1); fread(string,ss[1].argsize,1,file); /* sector */ print("\nsector: %ld",*(long *)string); fread(string,ss[2].argsize,1,file); /* tags */ print("\ntagged: "); plist((long *)string,sizeof(tagged)/sizeof(long),Radix); fread(string,ss[3].argsize,1,file); /* findstr */ print("\nfind: %s",string); output('\n'); } fclose(file); return 1; } fclose(file); return 0; } /* display keywords */ extern void dkey(KEYWORDS *kw) { KEYWORDS *tkw = kw; print("\nON: "); for (;kw->keyword;kw++) if (kw->value) print("%s ",kw->keyword); print("\nOFF: "); for (;tkw->keyword;tkw++) if (!tkw->value) print("%s ",tkw->keyword); } /* display keyword */ extern void psw(char c, KEYWORDS *kw) { for (; kw->keyword; kw++) { if (kw->keyword[0] == c) { print("%s%s ",kw->keyword,(kw->value) ? ":ON" : ":OFF"); break; } } } /* set keyword */ extern void ckey(char *s, KEYWORDS *kw) { do { for (; kw->keyword; kw++) { if (kw->keyword[0] == *s) { kw->value++; if (kw->value > 1) kw->value -= 2; break; } } } while (*++s); } extern int setkeyword(unsigned int c, KEYWORDS *kw) { char tmpstr[2]; tmpstr[0]='\0'; for (; kw->keyword; kw++) if (c == kw->key) { tmpstr[0] = kw->keyword[0]; break; } if (tmpstr[0] != '\0') { if (tmpstr[0] == 'w' && !write_to) ; else { tmpstr[1] = '\0'; ckey(tmpstr,kw); psw(tmpstr[0],kw); return 1; } } return 0; } static int lookup(char *t, KEYWORDS *kw, int num) { int i; for (i = 0; i < num; i++,kw++) if (kw->keyword && strcmp(t,kw->keyword) == 0) return i; return -1; } static int boolarg(char *arg) { return (arg && (stricmp("on",arg)==0 || stricmp("yes",arg)==0)); } static int numarg(char *arg) { int i=0; if (arg) sscanf(arg,"%d",&i); return(i); } #if 0 /* these are not used yet */ static unsigned long longarg(char *arg) { unsigned long l=0L; if (arg) sscanf(arg,"%lu",&l); return l; } /*** * assigns a key value: "^a" - "^z" returns to 01 - 1Ah * "" returns key * "off" returns -1 ****/ static int keyarg(char *arg,int key) { register int i; if (arg==NULL) i=key; else if (stricmp("off",arg)==0) i=-1; else if ((stricmp("^`",arg)+stricmp("^{",arg))==0) i=*(++arg)-'`'; else i=*arg; return(i); } #endif /* 0 */