#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define TRUE -1
#define FALSE 0
#define BOOL int

char INNAME[_MAX_FNAME], INCLASS[_MAX_EXT], INPATH[_MAX_DIR+_MAX_DRIVE-1];
char IN2NAME[_MAX_FNAME], IN2CLASS[_MAX_EXT], IN2PATH[_MAX_DIR+_MAX_DRIVE-1];
char IN3NAME[_MAX_FNAME], IN3CLASS[_MAX_EXT], IN3PATH[_MAX_DIR+_MAX_DRIVE-1];
char OUTNAME[_MAX_FNAME], OUTCLASS[_MAX_EXT], OUTPATH[_MAX_DIR+_MAX_DRIVE-1];
char TFORMAT[24], YFORMAT[24];
char PARITY[6], DEVICE[5], TASKNAME[9];
char TLABEL[133], YLABEL[133], TITLE[133];
double TRANGE[2], YRANGE[2];
double TMAJOR[2], YMAJOR[2];
double PARMS[10], POINT[2];
int    WINDOW[4];
double FACTOR, ZFACTOR[2];
int CODE, BAUD, STOPBITS, DATABITS;
int TMINOR, YMINOR, FRAME, BORDER, QUIET;
long COLOR;

double LogFlag;
int EndFlag;
BOOL InterruptFlag=0;

/******************************************
** Arrays for the Full Path for the TISAN
** Program on startup so wew know where to
** find the INPUTS and RUN files.
*/
char TisanDrive[_MAX_DRIVE] = "C:";
char TisanDir[_MAX_DIR] = "\\C\\CLI\\SUPPORT\\";

/*
** Global arrays used for temperory storage
*/
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
char path[_MAX_PATH];

/*
** Character strings used throughout the program
*/
char *NullString = "";
char *Space = " ";
char *CrLf = "\n";

void Encode(cFormatPntr,...)
char *cFormatPntr;
   {
   va_list arg_ptr;

   va_start(arg_ptr,cFormatPntr);

   printf("TISAN   : ");
   vprintf(cFormatPntr,arg_ptr);

   va_end(arg_ptr);
   return;
   }


/*********************************************************************
*
* Get a Message From the File TISAN.IDX and Print it 
* from cloumn 44 to 80 by however-many lines
*
*/
short DisplayText(IndexTableStream)
FILE *IndexTableStream;
   {
   long PL;
   short I;
   short P;
   char C;

   if (!IndexTableStream)
      {
      printf("\nTISAN   : ");
      return(0);
      }

   I=0;
   while (I<36)
      {
      C = fgetc(IndexTableStream);
      if (!C || (C == '\n')) break;
      printf("%c",C);
      ++I;
      } /* End While */
   if (I < 36) printf(CrLf);
   return(C);
   }

/*********************************************************************
*
* Write a string to columns 22 to 41 and the message line after it
*
*/
short WriteString(StringPointer,IndexTableStream)
char *StringPointer;
FILE *IndexTableStream;
  {
  short M,N,I;
  BOOL PassFlag=FALSE;
  char C=1;

  do {
     if (!PassFlag)
        {
        N = printf("%.19s",StringPointer);
        PassFlag = TRUE;
        M = N + 1;
        }
     else
        {
        M = N = printf("%.20s",StringPointer);
        }

     if (M < 20)
        {
        ++M;
        PassFlag = -1;
        printf("'");
        }

     for (I=M;I<21;++I) printf(Space);
     if (C)
        C = (char)DisplayText(IndexTableStream);
     else
	DisplayText(NULL);
     if ((M == 20) && (PassFlag > 0))
        {
        StringPointer += N;
        printf("%13s",Space);
        }
     }
  while ((M == 20) && (PassFlag > 0));
  if (C) printf("%34s",Space);
  return(C);
  }

/*********************************************************************
*
* Print an adverb and its value
*/
void DisplayInputs(InputsAdverbToken,IndexTableStream)
unsigned char InputsAdverbToken;
FILE *IndexTableStream;
  {
  short I;
  char C=1, BUFFER[44];

  switch (InputsAdverbToken)
     {
     case 1:
        sprintf(BUFFER,"INNAME   ... '%s'",INNAME);
	Encode("%-34s",BUFFER);
        break;
     case 2:
        sprintf(BUFFER,"INCLASS  ... '%s'",INCLASS);
	Encode("%-34s",BUFFER);
        break;
     case 3:
	Encode("INPATH   ... '");
        C = WriteString(INPATH,IndexTableStream);
        break;
     case 4:
        sprintf(BUFFER,"IN2NAME  ... '%s'",IN2NAME);
	Encode("%-34s",BUFFER);
        break;
     case 5:
        sprintf(BUFFER,"IN2CLASS ... '%s'",IN2CLASS);
	Encode("%-34s",BUFFER);
        break;
     case 6:
	Encode("IN2PATH  ... '");
        C = WriteString(IN2PATH,IndexTableStream);
        break;
     case 7:
        sprintf(BUFFER,"IN3NAME  ... '%s'",IN3NAME);
	Encode("%-34s",BUFFER);
        break;
     case 8:
        sprintf(BUFFER,"IN3CLASS ... '%s'",IN3CLASS);
	Encode("%-34s",BUFFER);
        break;
     case 9:
	Encode("IN3PATH  ... '");
        C = WriteString(IN3PATH,IndexTableStream);
        break;
     case 10:
        sprintf(BUFFER,"OUTNAME  ... '%s'",OUTNAME);
	Encode("%-34s",BUFFER);
        break;
     case 11:
        sprintf(BUFFER,"OUTCLASS ... '%s'",OUTCLASS);
	Encode("%-34s",BUFFER);
        break;
     case 12:
	Encode("OUTPATH  ... '");
        C = WriteString(OUTPATH,IndexTableStream);
        break;
     case 13:
        sprintf(BUFFER,"CODE     ... %d",CODE);
	Encode("%-34s",BUFFER);
        break;
     case 14:
        sprintf(BUFFER,"FACTOR   ... %G",FACTOR);
	Encode("%-34s",BUFFER);
        break;
     case 15:
        sprintf(BUFFER,"ZFACTOR  ... %G, %G",ZFACTOR[0],POINT[1]);
	Encode("%-34s",BUFFER);
        break;
     case 16:
        sprintf(BUFFER,"TRANGE   ... %G, %G",TRANGE[0],TRANGE[1]);
	Encode("%-34s",BUFFER);
        break;
     case 17:
        sprintf(BUFFER,"YRANGE   ... %G, %G",YRANGE[0],YRANGE[1]);
	Encode("%-34s",BUFFER);
        break;
     case 18:
        sprintf(BUFFER,"WINDOW   ... %d, %d,",WINDOW[0],WINDOW[1]);
	Encode("%-34s",BUFFER);
        C = DisplayText(IndexTableStream);
	sprintf(BUFFER,"             %d, %d",WINDOW[2],WINDOW[3]);
	Encode("%-34s",BUFFER);
	if (C) C = DisplayText(IndexTableStream); else printf(CrLf);
        break;
     case 19:
        sprintf(BUFFER,"TFORMAT  ... '%s'",TFORMAT);
	Encode("%-34s",BUFFER);
        break;
     case 20:
        sprintf(BUFFER,"YFORMAT  ... '%s'",YFORMAT);
	Encode("%-34s",BUFFER);
        break;
     case 21:
        sprintf(BUFFER,"DEVICE   ... '%s'",DEVICE);
	Encode("%-34s",BUFFER);
        break;
     case 22:
        sprintf(BUFFER,"BAUD     ... %d",BAUD);
	Encode("%-34s",BUFFER);
        break;
     case 23:
        sprintf(BUFFER,"STOPBITS ... %d",STOPBITS);
	Encode("%-34s",BUFFER);
        break;
     case 24:
        sprintf(BUFFER,"DATABITS ... %d",DATABITS);
	Encode("%-34s",BUFFER);
        break;
     case 25:
        sprintf(BUFFER,"PARITY   ... '%s'",PARITY);
	Encode("%-34s",BUFFER);
        break;
     case 26:
        sprintf(BUFFER,"FRAME    ... %d",FRAME);
	Encode("%-34s",BUFFER);
        break;
     case 27:
        sprintf(BUFFER,"BORDER   ... %d",BORDER);
	Encode("%-34s",BUFFER);
        break;
     case 28:
        sprintf(BUFFER,"COLOR    ... %d",COLOR);
	Encode("%-34s",BUFFER);
        break;
     case 29:
        sprintf(BUFFER,"TMINOR   ... %d",TMINOR);
	Encode("%-34s",BUFFER);
        break;
     case 30:
        sprintf(BUFFER,"YMINOR   ... %d",YMINOR);
	Encode("%-34s",BUFFER);
        break;
     case 31:
        sprintf(BUFFER,"TMAJOR   ... %G, %G",TMAJOR[0],TMAJOR[1]);
	Encode("%-34s",BUFFER);
        break;
     case 32:
        sprintf(BUFFER,"YMAJOR   ... %G, %G",YMAJOR[0],YMAJOR[1]);
	Encode("%-34s",BUFFER);
        break;
     case 33:
	Encode("TLABEL   ... '");
        C = WriteString(TLABEL,IndexTableStream);
        break;
     case 34:
	Encode("YLABEL   ... '");
        C = WriteString(YLABEL,IndexTableStream);
        break;
     case 35:
	Encode("TITLE    ... '");
        C = WriteString(TITLE,IndexTableStream);
        break;
     case 36:
        sprintf(BUFFER,"PARMS    ... %G, %G,",PARMS[0],PARMS[1]);
	Encode("%-34s",BUFFER);
        C = DisplayText(IndexTableStream);
        sprintf(BUFFER,"             %G, %G,",PARMS[2],PARMS[3]);
	Encode("%-34s",BUFFER);
	if (C) C = DisplayText(IndexTableStream); else printf(CrLf);
        sprintf(BUFFER,"             %G, %G,",PARMS[4],PARMS[5]);
	Encode("%-34s",BUFFER);
	if (C) C = DisplayText(IndexTableStream); else printf(CrLf);
        sprintf(BUFFER,"             %G, %G,",PARMS[6],PARMS[7]);
	Encode("%-34s",BUFFER);
	if (C) C = DisplayText(IndexTableStream); else printf(CrLf);
        sprintf(BUFFER,"             %G, %G",PARMS[8],PARMS[9]);
	Encode("%-34s",BUFFER);
	if (C) C = DisplayText(IndexTableStream); else printf(CrLf);
        break;
     case 37:
        sprintf(BUFFER,"QUIET    ... %d",QUIET);
	Encode("%-34s",BUFFER);
        break;
     case 38:
        sprintf(BUFFER,"POINT    ... %G, %G",POINT[0],POINT[1]);
	Encode("%-34s",BUFFER);
        break;
     }

  while (C)
     {
     if (C = DisplayText(IndexTableStream)) Encode("%34s",Space);
     }

  return;
  }

/*********************************************************************
* Pseudo Verb Inputs
*
* Display Adverbs on Screen for a Given TASKNAME
*
* Format for TISAN.IDX is
* TASKNAME1234TASKNAME1234....NULL0000TextTtextTtextTtext<NULL>
*
*/
BOOL Inputs(cPointer)
char *cPointer;
   {
   short I;
   short J;
   char C;
   FILE *IndexTableStream;
   BOOL NoMatch;
   long longP;
   unsigned char InputsAdverbToken;

   if (!*strupr(cPointer)) cPointer = TASKNAME;
   if (!*cPointer)
      {
      Encode("TASKNAME is Currently Undefined.\n");
      return(FALSE);
      }

   _makepath(path,TisanDrive,TisanDir,"TISAN",".IDX");
   IndexTableStream = fopen(path,"rb");
   if (!IndexTableStream)
      {
      Encode("Error Opening Index File for Read.\n");
      return(FALSE);
      }
/*
** Locate the Current Task in the index file
**
*/
   do {
      fread(fname,1,8,IndexTableStream);
      fread(&longP,sizeof(long),1,IndexTableStream);
      if (ferror(IndexTableStream))
         {
         Encode("Error Reading TISAN.IDX\n");
         fcloseall();
         return(FALSE);
         }
      if (!longP)
         {
         Encode("Task %s Not Found in TISAN.IDX\n",cPointer);
         fcloseall();
         return(FALSE);
         }
      NoMatch = strcmp(fname,cPointer);  /* No match ?*/
      }
   while (NoMatch);

   fseek(IndexTableStream,longP,SEEK_SET);
     
   Encode(CrLf);
   Encode("%s - ",cPointer);
   do {
      if (C = fgetc(IndexTableStream))
         printf("%c",C);
      else
         printf(CrLf);
      }
   while (C);

   Encode("---------------------------------------\
------------------------------\n");
   do {
      if (!(InputsAdverbToken = fgetc(IndexTableStream))) break;
      DisplayInputs(InputsAdverbToken,IndexTableStream);
      }
   while (!InterruptFlag);
   Encode(CrLf);
   fclose(IndexTableStream);
   return(TRUE);
   }

main(argc,argv)
short argc;
char *argv[];
{
Inputs(argv[1]);
}