/* LISTING 2    Sample Program using prompt()  */

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <dos.h>
#include <string.h>
#include "./keys.h"

/* Identify Field Indexes */
#define FNAME          0
#define LNAME          1
#define SEX            2
#define AGE            3

#define MOVE_CUR(row,col) printf("\x1B[%d;%df",row,col);

/* Prototypes */
extern int  prompt (char *, char, int, int, int, int, 
		    char *, int, int);

struct fields {
   short row;        /* Field Row            */
   short col;        /* Field Column         */
   short fyi_row;    /* FYI Row              */
   short fyi_col;    /* FYI Column           */
   short min_len;    /* Minimum Length       */
   short max_len;    /* Maximum Length       */
   char  match;      /* Match Character Code */
   char  fyi[81];    /* FYI Message          */
};

struct fields field[] = {
   { 10,37,15,35,0,30,'A',"ENTER IN YOUR FIRST NAME." },
   { 11,37,15,35,0,30,'A',"ENTER IN YOUR LAST NAME. " },
   { 12,37,15,35,0, 1,'X',"ENTER IN YOUR SEX. (M/F) " },
   { 13,37,15,35,0, 3,'#',"ENTER IN YOUR AGE.       " }
};

void main()
{
   char xbuf[81];   /* Buffer      */
   char fname[31];  /* First Name  */
   char lname[31];  /* Last  Name  */
   char sex;        /* Male/Female */
   int  c;
   int  age;       
   int  index;

   /* Initialize Variables And Draw Screen Titles */
   fname[0] = lname[0] = sex = '\0';
   MOVE_CUR(10,25);
   printf("FIRST NAME:");
   MOVE_CUR(11,25);
   printf("LAST  NAME:");
   MOVE_CUR(12,25);
   printf("SEX M/F ..:");
   MOVE_CUR(13,25);
   printf("AGE ......:");
   age = 0;
   index = FNAME;

   while (1) {
      switch (index) {
      case FNAME:
	   sprintf(xbuf,"%-s",fname);
	   c = prompt(xbuf, 
		      field[FNAME].match, 
		      field[FNAME].min_len,
		      field[FNAME].max_len,
		      field[FNAME].row,
		      field[FNAME].col,
		      field[FNAME].fyi,
		      field[FNAME].fyi_row,
		      field[FNAME].fyi_col);
	   switch (c) {
	   case C_UP     :
	   case UP_NO_CHG:
	   case C_END    :
		/* Go To Last Screen Field */
		index = AGE;
		break;

	   case C_ESC :
		/* Exit Program */
		exit(0);

	   case C_CR  :
	   case C_DOWN:
	   case C_TAB :
		strcpy(fname,xbuf);
	   case CR_NO_CHG:
	   case DN_NO_CHG:
	   case TB_NO_CHG:
		/* Go To Next Field */
		index = LNAME;
		break;
	   }
	   MOVE_CUR(10,37);
	   printf("%-30.30s",fname);
	   break;

      case LNAME:
	   sprintf(xbuf,"%-s",lname);
	   c = prompt(xbuf,
		      field[LNAME].match, 
		      field[LNAME].min_len,
		      field[LNAME].max_len,
		      field[LNAME].row,
		      field[LNAME].col,
		      field[LNAME].fyi,
		      field[LNAME].fyi_row,
		      field[LNAME].fyi_col);
	   switch (c) {
	   case C_END :
		/* Go To Last Screen Field */
		index = AGE;
		break;

	   case C_ESC :
		/* Exit Program */
		exit(0);

	   case C_UP     :
	   case UP_NO_CHG:
	   case C_HOME   :
		/* Go To Previous Field */
		index = FNAME;
		break;

	   case C_CR  :
	   case C_DOWN:
	   case C_TAB :
		strcpy(lname,xbuf);
	   case CR_NO_CHG:
	   case DN_NO_CHG:
	   case TB_NO_CHG:
		/* Go To Next Field */
		index = SEX;
		break;
	   }
	   MOVE_CUR(11,37);
	   printf("%-30.30s",lname);
	   break;

      case SEX:
	   sprintf(xbuf,"%c",sex);
	   c = prompt(xbuf,
		      field[SEX].match, 
		      field[SEX].min_len,
		      field[SEX].max_len,
		      field[SEX].row,
		      field[SEX].col,
		      field[SEX].fyi,
		      field[SEX].fyi_row,
		      field[SEX].fyi_col);
	   switch (c) {
	   case C_UP     :
	   case UP_NO_CHG:
		/* Go To Previous Field */
		index = LNAME;
		break;

	   case C_ESC :
		/* Exit Program */
		exit(0);

	   case C_HOME:
		/* Go To First Screen Field */
		index = FNAME;
		break;

	   case C_CR  :
	   case C_DOWN:
	   case C_TAB :
		sex = xbuf[0];
	   case C_END    :
	   case CR_NO_CHG:
	   case DN_NO_CHG:
	   case TB_NO_CHG:
		/* Go To Next Previous Field */
		index = AGE;
		break;
	   }
	   MOVE_CUR(12,37);
	   printf("%c",sex);
	   break;

      case AGE:
	   sprintf(xbuf,"%-d",age);
	   c = prompt(xbuf,
		      field[AGE].match, 
		      field[AGE].min_len,
		      field[AGE].max_len,
		      field[AGE].row,
		      field[AGE].col,
		      field[AGE].fyi,
		      field[AGE].fyi_row,
		      field[AGE].fyi_col);
	   switch (c) {
	   case C_UP     :
	   case UP_NO_CHG:
		/* Go To Previous Field */
		index = SEX;
		break;

	   case C_ESC :
		/* Exit Program */
		exit(0);

	   case C_HOME:
	   case C_CR  :
	   case C_DOWN:
	   case C_TAB :
		age = atoi(xbuf);
	   case CR_NO_CHG:
	   case DN_NO_CHG:
	   case TB_NO_CHG:
		/* Go To Next Screen Field */
		index = FNAME;
		break;
	   }
	   MOVE_CUR(13,37);
	   printf("%- 3d",age);
	   break;
      }
   }
}

