/*
*   Verb Functions for the TISAN Interpreter
*/

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <dos.h>
#include <math.h>

#include "MAIN.H"

#define Vrbstrnm 9

short PUTADV(char *);
void VERBINIT(void);
short  VERBCHK(char *);
short  VERB(short);
short  Cls(void);
short  Config(void);
short  Defaults(void);
short  Log(void);
void SETMODE(short,short);
extern void THERCMODE(void);

extern union REGS REGISTER;
extern short ERRTYPE;
extern char *KPNTR;
extern short MATCH;

extern double TRANGE[], YRANGE[], ZRANGE[];
extern double TMAJOR[], YMAJOR[], ZMAJOR[];
extern double PARMS[], POINT[];
extern short WINDOW[];
extern char INNAME[], INCLASS[], INPATH[];
extern char IN2NAME[], IN2CLASS[], IN2PATH[];
extern char OUTNAME[], OUTCLASS[], OUTPATH[];
extern char TFORMAT[], YFORMAT[], ZFORMAT[];
extern char PARITY[], DEVICE[];
extern char TLABEL[], YLABEL[], TITLE[], ZLABEL[];
extern double FACTOR;
extern short CODE, BAUD, STOPBITS, DATABITS, ECHO, ITYPE, ZMINOR;
extern short TMINOR, YMINOR, FRAME, BORDER, QUIET, LogFlag;
extern long COLOR;

extern char *MSP[];
extern struct DEVICES HARDWARE;

extern char TisanDrive[], TisanDir[];

char *VERBSTR[Vrbstrnm];

/*********************************************************************
*
* Initialize VERBS
*
*/
void VERBINIT()
   {
   VERBSTR[0]  = "EXIT";
   VERBSTR[1]  = "QUIT";
   VERBSTR[2]  = "CLS";
   VERBSTR[3]  = "CONFIG";
   VERBSTR[4]  = "DEFAULTS";
   VERBSTR[5]  = "END";
   VERBSTR[6]  = "ECHO";
   VERBSTR[7]  = "NOECHO";
   VERBSTR[8]  = "LOG";
   return;
   }

/*********************************************************************
* Verb Cls
*
* Clear Screen
*
*/
short Cls()
   {
   SETMODE(3,0);
   return(0);
   }

/*********************************************************************
* Verb LOG
*
* Toggle Output to LogFile
*
*/
short Log()
   {
   if (LogFlag)
      {
      printf("%sTASK Log is now OFF.\n",MSP[1]);
      LogFlag = 0;
      }
   else
      {
      LogFlag = 1;
      printf("%sTASK Log is now ON.\n",MSP[1]);
      }
   return(0);
   }

/*********************************************************************
*
* Set up Screen Configuration
*
*/
short Config()
   {
   char C1, C2;

   printf("%sText Screen Type:\n",MSP[1]);
   printf("%s1 ... IBM Monochrome or Epson\n",MSP[1]);
   printf("%s2 ... CGA (Compaq, IBM Color Graphics...)\n",MSP[1]);
   printf("%sSelect ->",MSP[1]);
   do  C1 = getch(); while ((C1 < '1') || (C1 > '2'));
   putchar(C1);
   printf("%s\n",MSP[2]);
   if (C1 == '1')
      {
      printf("%sGraphics Screen Type:\n",MSP[1]);
      printf("%s1 ... Hercules\n",MSP[1]);
      printf("%s2 ... CGA (IBM Color Graphics, Epson...)\n",MSP[1]);
      printf("%s3 ... None\n",MSP[1]);
      printf("%sSelect ->",MSP[1]);
      do  C2 = getch(); while ((C2 < '1') || (C2 > '3'));
      putchar(C2);
      printf("\n%s\n",MSP[1]);
      }

   switch (C1)
      {
      case '1':
         switch (C2)
            {
            case '1':
               HARDWARE.scrn = HERC_scrn;
               break;
            case '2':
               HARDWARE.scrn = DUAL_scrn;
               break;
            case '3':
               HARDWARE.scrn = MONO_scrn;
               break;
            }
         break;
      case '2':
         HARDWARE.scrn = CGA_scrn;
         break;
      }

   printf("%sPrinter Type:\n",MSP[1]);
   printf("%s1 ... IBM Graphics or Epson\n",MSP[1]);
   printf("%s2 ... HP Laser Jet, Jet+ or ThinkJet\n",MSP[1]);
   printf("%s3 ... Other\n",MSP[1]);
   printf("%sSelect ->",MSP[1]);
   do  C1 = getch(); while ((C1 < '1') || (C1 > '3'));
   putchar(C1);
 
   switch (C1)
      {
      case '1':
         HARDWARE.pntr = EPSN_pntr;
         break;
      case '2':
         HARDWARE.pntr = HPLJ_pntr;
         break;
      case '3':
         HARDWARE.pntr = NO_pntr;
         break;
      }
   printf("%s\n",MSP[2]);
   return(0);
   }

/*********************************************************************
*
* Verb DEFAULTS Set default values
*
*/
short Defaults()
   {
   short I;

   for (I=0;I<2;++I)
      {
      TRANGE[I]=0.;
      YRANGE[I]=0.;
      ZRANGE[I]=0.;
      TMAJOR[I]=-1;
      YMAJOR[I]=-1;
      ZMAJOR[I]=-1;
      POINT[I]=0;
      }
   for (I=0;I<4;++I) WINDOW[I]=0;
   for (I=0;I<10;++I) PARMS[I]=0;
   memset(INNAME,0,9);
   memset(INCLASS,0,4);
   memset(INPATH,0,64);
   memset(IN2NAME,0,9);
   memset(IN2CLASS,0,4);
   memset(IN2PATH,0,64);
   memset(OUTNAME,0,9);
   memset(OUTCLASS,0,4);
   memset(OUTPATH,0,64);
   memset(TFORMAT,0,24);
   memset(YFORMAT,0,24);
   memset(ZFORMAT,0,24);
   memset(PARITY,0,6);
   memset(DEVICE,0,5);
   memset(TLABEL,0,133);
   memset(YLABEL,0,133);
   memset(ZLABEL,0,133);
   memset(TITLE,0,133);
   FACTOR = 0;
   CODE = 0;
   ITYPE = 0;
   BAUD = 0;
   STOPBITS = 0;
   DATABITS = 0;
   TMINOR = 3;
   YMINOR = 3;
   ZMINOR = 3;
   FRAME = 0;
   BORDER = 1;
   COLOR = 0L;
   QUIET = 0;
   return(0);
   }

/*********************************************************************
*
* Search for a VERB return 0 if no match
*
*/
short VERBCHK(PNTR)
char *PNTR;
   {
   unsigned short I, LEN;
   short VRB=0;

   if ((LEN = strlen(strupr(PNTR))) == 0) return(0);

   if (MATCH < 0)
      {
      for (I=0;I<Vrbstrnm;++I)
         {
         if (!strncmp(VERBSTR[I],PNTR,LEN))
            printf("%sCould be %-.8s\n",MSP[1],VERBSTR[I]);
         }
      return(0);
      }

   for (I=0;I<Vrbstrnm;++I)
      {
      if (!strncmp(VERBSTR[I],PNTR,LEN))
         {
         VRB = I+1;
         ++MATCH;
         if (LEN == strlen(VERBSTR[I])) /* Exact Match */
            {
            MATCH = 1;
            break;
            }
         }
      }

   return(VRB);
   }

/*********************************************************************
*
* Process a VERB
*
*/
short VERB(N)
short N;
   {
   char path[_MAX_PATH];
   switch (N)
      {
      case 1: /* EXIT */
        _makepath(path,TisanDrive,TisanDir,"TISAN",".EXE");
        if (access(path,0))
            printf("Place TISAN Disk #1 in Drive and Press a Key");
         while (access(path,0)) getch();
         printf("\n");
         PUTADV(MSP[0]);
      case 2: /* QUIT */
         exit(0);
         break;
      case 3: /* Cls */
         Cls();
         break;
      case 4: /* Config */
         Config();
         break;
      case 5: /* Defaults */
         Defaults();
         break;
      case 6: /* END */
         return(-1);
         break;
      case 7: /* ECHO */
         ECHO = 1;
         break;
      case 8: /* NOECHO */
         ECHO = 0;
         break;
      case 9: /* LOG */
         Log();
         break;
      }
   return(0);
   }