home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM Aktief 1995 #6 / CDA_6.iso / shell / utils / disked29.arj / SOURCE.ZIP / INIT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-06  |  7.9 KB  |  355 lines

  1. /***
  2. *init.c - disked keyword and parameter initialize/set/display
  3. *
  4. *Copyright (c) 1991-1995, Gregg Jennings.  All wrongs reserved.
  5. *   P O Box 200, Falmouth, MA 02541-0200
  6. *
  7. *Purpose:
  8. *   Configuration handling.
  9. *
  10. *Notice:
  11. *   This progam may be freely used and distributed.  Any distrubution
  12. *   with modifications must retain the above copyright statement and
  13. *   modifications noted.
  14. *   No pulp-publication, in whole or in part, permitted without
  15. *   permission (magazines or books).
  16. *******************************************************************************/
  17.  
  18. /*
  19.    Versions:
  20.  
  21.    1.1   04-Sep-1994    save/restore now has a structure
  22.    1.0   18-Apr-1994
  23.  
  24.    Release Notes:
  25.  
  26.    Programming Notes:
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <errno.h>
  33.  
  34. #include "disked.h"
  35. #include "init.h"
  36. #include "keys.h"
  37. #include "console.h"
  38. #include "diskio.h"
  39. #include "arrays.h"
  40.  
  41. /* global data defined here */
  42.  
  43. enum ARG_TYPE { BOOL_ARG, NUM_ARG, TEXT_ARG };
  44.  
  45. KEYWORDS kw[] = {
  46.    { ALTD, 1, "display", BOOL_ARG },         // 0
  47.    { ALTG, 0, "get", BOOL_ARG},              // 1
  48.    { ALTH, 1, "home", BOOL_ARG },            // 2
  49.    { ALTM, 1, "mask", BOOL_ARG },            // 3
  50.    { ALTV, 1, "verify", BOOL_ARG },          // 4
  51.    { ALTW, 0, "write", BOOL_ARG },           // 5
  52.    { ALTS, 1, "strip", BOOL_ARG },           // 6
  53.    { ALTC, 1, "convert", BOOL_ARG },         // 7
  54.    { ALTF, 0, "files", BOOL_ARG },           // 8
  55.    {    0, 0, "Debug", BOOL_ARG },           // 9
  56.    { ALTA, 0, "ascii", BOOL_ARG },           // 10
  57.    { ALTP, 1, "partial", BOOL_ARG },         // 11
  58.    { ALTL, 1, "logical", BOOL_ARG },         // 12
  59.    { ALTT, 0, "translate", BOOL_ARG },       // 13
  60.    {    0, 0, NULL, 0},                      // 14    Note: THIS MUST BE NUL
  61.    { ALTR,10, "radix", NUM_ARG },            // 15
  62.    {    0, 1, "signon", BOOL_ARG },          // 16
  63.    { ALTI, 2, "i/o", NUM_ARG },              // 17
  64.    {    0, 1, "viewer", BOOL_ARG },          // 18
  65.    {    0, 0, "filter", BOOL_ARG },          // 19
  66.    {    0, 0, NULL, 0}                       //
  67. };
  68.  
  69.  
  70. /* internal data */
  71.  
  72. typedef struct {
  73.    int argsize;
  74.    void *value;
  75. } SAVE_STATE;
  76.  
  77. static SAVE_STATE save_state[] = {
  78.    { sizeof(int), &disk },
  79.    { sizeof(long), &log_sector},
  80.    { sizeof(tagged), &tagged},
  81.    { sizeof(char) * SEARCH, findstr},
  82.    { 0 }
  83. };
  84.  
  85. /* internal functions */
  86.  
  87. static int lookup(char *t, KEYWORDS *kw, int num);
  88. static int boolarg(char *);
  89. static int numarg(char *);
  90. #if 0
  91. static int keyarg(char *arg,int key);
  92. static unsigned long longarg(char *arg);
  93. #endif
  94. static int (*setup_func[])(char *) = {boolarg,numarg};
  95.  
  96.  
  97. /*
  98.    Read DISKED.INI and set the world.
  99.  
  100.    3.0   09-Apr-1994    completely re-written
  101.    2.1   02-Apr-1994    forgot the fclose()
  102.    ver   2.0   removed "boot" and "video" 02-Dec-1993
  103.    ver   1.1   added "Expert"
  104. */
  105.  
  106. extern int initialize(char *filename)
  107. {
  108. int i;
  109. char string[100], *seps = " \t\n,:=";
  110. char *p,*arg;
  111. FILE *file;
  112.  
  113.    if (stricmp(filename,"none")==0 || filename[0]=='\0')
  114.       return 0;
  115.  
  116.    if ((file = fopen(filename,"r"))==NULL)
  117.       return -1;
  118.  
  119.    while (!feof(file))
  120.    {
  121.       if (fgets(string,100,file) == NULL)
  122.          break;
  123.  
  124.       if ((p = strtok(string,seps)) == NULL)
  125.          continue;
  126.  
  127.       if (strchr(";/[",*p))
  128.          continue;
  129.  
  130.       if (strcmp("Expert",p) == 0)
  131.       {
  132.          write_to = Write = Files = Translate = 1;
  133.          Display = Verify = Home = Strip = Signon = 0;
  134.          continue;
  135.       }
  136.       if ((arg = strtok(NULL,seps)) != NULL)
  137.          if ((i = lookup(p,kw,sizeof(kw)/sizeof(KEYWORDS))) != -1)
  138.             kw[i].value = setup_func[kw[i].type](arg);
  139.    }
  140.  
  141.    /* Now deal with all of the special cases and do range checking */
  142.  
  143.    if (Write)
  144.    {
  145.       write_to = 1;
  146.       Write = 0;        /* and make user turn it on */
  147.    }
  148.  
  149.    if (Radix < 1 || Radix > 26)
  150.       Radix = 10;
  151.  
  152.    if (Output < STDIO || Output > BIOS)
  153.       Output = STDIO;
  154.  
  155.    fclose(file);
  156.    return 1;
  157. }
  158.  
  159. /* restore position, tagged sectors, find string */
  160.  
  161. extern int saveinit(char *filename)
  162. {
  163. SAVE_STATE *ss = save_state;
  164. FILE *file;
  165.  
  166.    if ((file = fopen(filename,"w")) == NULL)
  167.    {
  168.       perror(filename);
  169.       return 0;
  170.    }
  171.    fprintf(file,"; DISKED.SAV %s %s\n",Version,__DATE__);
  172.    for (; ss->value; ss++)
  173.       fwrite(ss->value,ss->argsize,1,file);
  174.    fclose(file);
  175.    return 1;
  176. }
  177.  
  178. extern int getinit(char *filename, int arg)
  179. {
  180. SAVE_STATE *ss = save_state;
  181. char string[100];
  182. FILE *file;
  183.  
  184.    if ((file=fopen(filename,"r"))==NULL)
  185.    {
  186.       if (errno != ENOENT)
  187.          perror(filename);
  188.       return 0;
  189.    }
  190.  
  191.    if (fgets(string,100,file) != NULL)
  192.    {
  193.       if (arg == INIT_RESTORE)
  194.       {
  195.          for (; ss->value; ss++)
  196.             fread(ss->value,ss->argsize,1,file);
  197.       }
  198.       else if (arg == INIT_VIEW)
  199.       {
  200.          print("\n%s",string);
  201.          fread(string,ss[0].argsize,1,file);             /* disk */
  202.          print("\ndisk: %c:",*(int *)string + 'A'-1);
  203.          fread(string,ss[1].argsize,1,file);             /* sector */
  204.          print("\nsector: %ld",*(long *)string);
  205.          fread(string,ss[2].argsize,1,file);             /* tags */
  206.          print("\ntagged: ");
  207.          plist((long *)string,sizeof(tagged)/sizeof(long),Radix);
  208.          fread(string,ss[3].argsize,1,file);             /* findstr */
  209.          print("\nfind: %s",string);
  210.          output('\n');
  211.       }
  212.       fclose(file);
  213.       return 1;
  214.    }
  215.    fclose(file);
  216.    return 0;
  217. }
  218.  
  219. /* display keywords */
  220.  
  221. extern void dkey(KEYWORDS *kw)
  222. {
  223. KEYWORDS *tkw = kw;
  224.  
  225.    print("\nON:  ");
  226.  
  227.    for (;kw->keyword;kw++)
  228.       if (kw->value)
  229.          print("%s ",kw->keyword);
  230.  
  231.    print("\nOFF: ");
  232.  
  233.    for (;tkw->keyword;tkw++)
  234.       if (!tkw->value)
  235.          print("%s ",tkw->keyword);
  236. }
  237.  
  238. /* display keyword */
  239.  
  240. extern void psw(char c, KEYWORDS *kw)
  241. {
  242.    for (; kw->keyword; kw++)
  243.    {
  244.       if (kw->keyword[0] == c)
  245.       {
  246.         print("%s%s ",kw->keyword,(kw->value) ? ":ON" : ":OFF");
  247.         break;
  248.       }
  249.    }
  250. }
  251.  
  252. /* set keyword */
  253.  
  254. extern void ckey(char *s, KEYWORDS *kw)
  255. {
  256.    do
  257.    {
  258.       for (; kw->keyword; kw++)
  259.       {
  260.           if (kw->keyword[0] == *s)
  261.           {
  262.              kw->value++;
  263.              if (kw->value > 1)
  264.                 kw->value -= 2;
  265.              break;
  266.          }
  267.       }
  268.    } while (*++s);
  269. }
  270.  
  271. extern int setkeyword(unsigned int c, KEYWORDS *kw)
  272. {
  273. char tmpstr[2];
  274.  
  275.    tmpstr[0]='\0';
  276.  
  277.    for (; kw->keyword; kw++)
  278.       if (c == kw->key)
  279.       {
  280.          tmpstr[0] = kw->keyword[0];
  281.          break;
  282.       }
  283.    if (tmpstr[0] != '\0')
  284.    {
  285.       if (tmpstr[0] == 'w' && !write_to)
  286.          ;
  287.       else
  288.       {
  289.          tmpstr[1] = '\0';
  290.          ckey(tmpstr,kw);
  291.          psw(tmpstr[0],kw);
  292.          return 1;
  293.       }
  294.    }
  295.    return 0;
  296. }
  297.  
  298. static int lookup(char *t, KEYWORDS *kw, int num)
  299. {
  300. int i;
  301.  
  302.    for (i = 0; i < num; i++,kw++)
  303.       if (kw->keyword && strcmp(t,kw->keyword) == 0)
  304.          return i;
  305.    return -1;
  306. }
  307.  
  308. static int boolarg(char *arg)
  309. {
  310.    return (arg && (stricmp("on",arg)==0 || stricmp("yes",arg)==0));
  311. }
  312.  
  313. static int numarg(char *arg)
  314. {
  315. int i=0;
  316.  
  317.    if (arg)
  318.       sscanf(arg,"%d",&i);
  319.    return(i);
  320. }
  321.  
  322. #if 0    /* these are not used yet */
  323.  
  324. static unsigned long longarg(char *arg)
  325. {
  326. unsigned long l=0L;
  327.  
  328.    if (arg)
  329.       sscanf(arg,"%lu",&l);
  330.    return l;
  331. }
  332.  
  333. /***
  334. *  assigns a key value: "^a" - "^z"  returns to 01 - 1Ah
  335. *                       ""           returns key
  336. *                       "off"        returns -1
  337. ****/
  338.  
  339. static int keyarg(char *arg,int key)
  340. {
  341. register int i;
  342.  
  343.    if (arg==NULL)
  344.       i=key;
  345.    else if (stricmp("off",arg)==0)
  346.       i=-1;
  347.    else if ((stricmp("^`",arg)+stricmp("^{",arg))==0)
  348.       i=*(++arg)-'`';
  349.    else
  350.       i=*arg;
  351.    return(i);
  352. }
  353.  
  354. #endif   /* 0 */
  355.