Category : Files from Magazines
Archive   : CUJ9304.ZIP
Filename : 1104051A

 
Output of file : 1104051A contained in archive : CUJ9304.ZIP
/* LISTING 3 Prompt Function */

#include
#include
#include
#include
#include
#include "./keys.h"

#ifndef YES
#define YES 1
#endif

#ifndef NO
#define NO 0
#endif

#define M_INSERT 1
#define M_TYPEOVER 2

#define MOVE_CUR(row,col) printf("\x1B[%d;%df",row,col);
#define NORMAL "\x1B[0m" /* ANSI Normal Video */
#define REVERSE "\x1B[7m" /* ANSI Reverse Video */

/* Prototypes */
extern int match (int, char);
extern void change_cur (int, int);
extern void main (void);

int key;

int prompt( data, match_ch, min_len, max_len, row, col,
message, fyi_row, fyi_col)

char data []; /* Return Message */
char match_ch; /* Code For Which Characters
Are Allowed */
int min_len; /* Min Length Allowed */
int max_len; /* Max Length Allowed */
int row; /* Window Row */
int col; /* Window Column */
char *message; /* Prompt Message */
int fyi_row; /* FYI Window Row */
int fyi_col; /* FYI Window Column */
{
char buf [80];
int terminate; /* Key That Caused Termination */
int index,i; /* General Index Variables */
int mode; /* Mode: INSERT or TYPEOVER */
int changed; /* Changed Flag: 1=YES, 0=NO */
int edit; /* Edit Flag: 1=YES, 0=NO */
int frst_key; /* First Key Flag: 1=YES, 0=NO */
char more; /* YES/NO Flag . . .
Used To Terminate Input */

/* Initializations */
edit = NO;
frst_key = NO;
changed = NO;

mode = M_TYPEOVER;
change_cur(0, 13); /* Set Cursor To Block Mode */

/* Display The FYI Message At The FYI Row, Colunn */
if (strlen(message)) {
MOVE_CUR (fyi_row, fyi_col);
printf(message);
}

printf(REVERSE); /* Change To Reverse Video */

strcpy(buf, data); /* Make A Copy Of The Default
Return Value */

for (index = strlen(buf); index < max_len; ++index) {
buf [index] = ' '; /* Fill Remainder Of Default
Value With Blanks */
}
buf [index] = '\0';

/* Display Default Value For Field */
MOVE_CUR (row, col);
printf(buf);

/* Position Cursor At Beginning Of Field */
MOVE_CUR (row, col);

/* Get Input From User */
for (index = 0,more = YES; more; ) {
key = getch();
if (key == 0)
key = getch()+256;

switch(key) {
case C_F1 : /* F1 Key */
case C_F2 : /* F2 Key */
case C_F3 : /* F3 Key */
case C_F4 : /* F4 Key */
case C_F5 : /* F4 Key */
case C_F6 : /* F6 Key */
case C_F7 : /* F7 Key */
case C_F8 : /* F8 Key */
case C_F9 : /* F9 Key */
case C_F10 : /* F0 Key */
case C_F11 : /* F11 Key */
case C_F12 : /* F12 Key */
case C_ESC : /* ESCAPE Key */
frst_key = NO;
terminate = key;
buf[index] = '\0';
more = NO;
break;

case C_INS : /* INSERT Key */
frst_key = NO;
if (mode == M_INSERT) {
/* Set The Mode To TYPEOVER and
Change Cursor To Block Mode */
mode = M_TYPEOVER;
change_cur(0, 13);
}
else {
/* Set The Mode To INSERT And
Change Cursor To Underline */
mode = M_INSERT;
change_cur(12, 13);
}
putchar(buf[index]);
MOVE_CUR(row, (col + index));
break;

case C_BACK : /* BACKSPACE Key */
case C_DEL : /* DELETE Key */
frst_key = NO;
changed = YES;
if (index >= max_len)
index = max_len - 1;
for (i = index; i < max_len; i++) {
if (buf[i+1] == '\0')
buf[i] = ' ';
else
buf[i] = buf[i+1];
}

/* Redisplay The Field */
MOVE_CUR(row, col);
printf(buf);

/* Reposition The Cursor. */
MOVE_CUR(row, (col + index));
putchar(buf[index]);
MOVE_CUR(row, (col + index));

if (key == C_DEL)
break;

case C_LEFT : /* LEFT ARROW */
frst_key = NO;
if (index <= 0)
break;
if (index >= max_len)
index = max_len -1;
index--;
MOVE_CUR(row, (col + index));
break;

case C_RIGHT: /* RIGHT ARROW */
frst_key = NO;
edit = YES;
if (index >= (max_len - 1))
break;
index++;
MOVE_CUR(row, (col + index));
break;

case C_HOME : /* HOME KEY */
case C_END : /* END KEY */
frst_key = NO;
if (edit == YES) {
if (key == C_END)
index = end_of_fld(buf,(strlen(buf)));
else
index = 0;
MOVE_CUR(row, (col + index));
break;
}

case C_DOWN : /* DOWN ARROW */
case C_UP : /* UP ARROW */
case C_PGDN : /* PAGE DOWN */
case C_PGUP : /* PAGE UP */
case C_CR : /* CARRIAGE RETURN */
case C_TAB : /* TAB Key */

frst_key = NO;

/* Reset Mode and Edit Flag */
edit = NO;
mode = M_INSERT;

if (strlen(data) >= (unsigned)min_len &&
index == 0 && changed == NO) {
/* If The User Has Not Changed The Value Of
The Data Field, Return The Appropriate
NO CHANGE Key For The terminating Key
That Was Pressed. */

if (key == C_CR) {
/* Return No Change For Carriage Return */
terminate = CR_NO_CHG;
}
if (key == C_UP) {
/* Return No Change For Up Arrow */
terminate = UP_NO_CHG;
}
if (key == C_DOWN) {
/* Return No Change For Down Arrow */
terminate = DN_NO_CHG;
}
if (key == C_TAB) {
/* Return No Change For Tab Key */
terminate = TB_NO_CHG;
}
if (key != C_CR &&
key != C_UP &&
key != C_DOWN &&
key != C_TAB)
terminate = key;

strcpy(buf, data);

more = NO;
break;
}

/* If Minimum Length Requirement Has been Met,
Quit */
if (index >= min_len) {
terminate = key;
more = NO;
break;
}

/* Else Ignore */
break;

default :
if (index == max_len)
/* At End Of Data Field - Do Nothing */
break;

/* We Have Dealt With All Of The Keys That We
Needed Above, So Now We Will Filter Out All
Keys And Characters Above 122 (z) Here. */

if (key > 'z') /* Ignore Key */
break;

if (match(index, match_ch) == YES) {
/* Only Accept The User Entered Character
If It Successfully Passed The match
function. */
edit = YES;
changed = YES;

if (frst_key == YES) {
/* If This Is The First Valid Key That
The User Has Entered, Then Wipe Out
The Field. */
for (i = 0; i < max_len; i++)
buf[i] = ' ';
frst_key = NO;
}

if (mode == M_INSERT) {
/* Insert The User Entered Character
Into The Field */
for (i = (max_len - 1); i > index; i--)
buf[i] = buf[i-1];
}

/* Overwrite The Buffer With The User Entered
Character */
buf[index] = (char)key;

/* Redisplay The Field */
MOVE_CUR(row, col);
printf(buf);

/* Reposition The Cursor. */
index++;
if (index >= max_len)
index --;
MOVE_CUR(row, (col + index));
putchar(buf[index]);
MOVE_CUR(row, (col + index));
}
break;
}
}
/* Redraw The Field In The Window's Normal
Color Attribute */
printf(NORMAL);
MOVE_CUR (row, col);
printf(buf);

strcpy(data, buf);
data[(end_of_fld(data,(strlen(data))) + 1)] = '\0';

/* Change Cursor Back To Underline */
change_cur(12, 13);
return (terminate);
}

static int match(index,match_ch)
int index;
char match_ch;
{
int matches = YES;

switch (match_ch) {
case '$' : /* 0-9 or ,$. */
if (!isdigit(key) && !strchr(".,$",key))
matches = NO;
break;

case '#' : /* 0 - 9 */
if (!isdigit(key))
matches = NO;
break;

case 'A' : /* A - Z */
if (!isalpha(key) && !strchr(" ",key))
matches = NO;
break;

case 'D' : /* Date: 0-9 or - or / or .*/
if (!isdigit(key) && !strchr(".-*/",key))
matches = NO;
break;

case 'l' : /* a-z, A-Z, 0-9, or ;:.,/?*-$#()'! or
leading space */
if (!isalnum(key) &&
!strchr(" !@#$%^&*()-_=+[{]}';:.,/?",key))
matches = NO;
break;

case 'Q' : /* YyNn as Reply To Yes/No Question */
if (!strchr("YyNn",key))
matches = NO;
key = toupper(key);
break;

case 'S' : /* 0-9 or + or - */
if (!isdigit(key) && !strchr("+-",key))
matches = NO;
break;

case 'T' : /* Time: 0-9 or . or : */
if (!isdigit(key) && !strchr(".:",key))
matches = NO;
break;

case 'X' : /* MmFf As Reply To Male/Female */
if (!strchr("MmFf",key))
matches = NO;
key = toupper(key);
break;

default :
matches = NO;
break;
}
return (matches);
}

/* This Function Will Return A 0 Based Index Of The
First Non-Blank Character At The End Of A String. */
int end_of_fld(string, length)
char *string;
int length;
{
int i;

for (i = length - 1; i >= 0; i--) {
if (string[i] != ' ' && string[i] != '\0')
return(i);
}
return(0);
}

/* This Function Will Change The Appearance Of The
Cursor To A Block Or An Underscore */
void change_cur(start, end)
int start;
int end;
{
union REGS r;

r.h.ah = 1;
r.h.ch = start;
r.h.cl = end;
int86(0x10, &r, &r);
}



  3 Responses to “Category : Files from Magazines
Archive   : CUJ9304.ZIP
Filename : 1104051A

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/