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;
      }
   }
}

/* End of File */