home *** CD-ROM | disk | FTP | other *** search
- /***
- *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 <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
-
- #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 */
-