Metropoli BBS
VIEWER: init.c MODE: TEXT (ASCII)
/***
*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 */
[ RETURN TO DIRECTORY ]