Category : Files from Magazines
Archive   : DDJSRC.ZIP
Filename : ENTRY.C

 
Output of file : ENTRY.C contained in archive : DDJSRC.ZIP
/* --------- entry.c ---------- */

#include
#include
#include
#include
#include
#include
#include "window.h"
#include "entry.h"

#define FIELDCHAR '_'
int inserting = INSERTING; /* insert mode, TRUE/FALSE */

extern struct wn wkw;

/* -------- local prototypes -------- */
static void addfield(FIELD *);
static void disp_field(FIELD *, char *, char *);
static int read_field(int);
static void data_value(FIELD *);
static int endstroke(int);
static void home_cursor(void);
static int backspace(void);
static void end_cursor(void);
static void forward(void);
static int fore_word(void);
static int back_word(void);
static void delete_char(void);
static void delete_word(void);

static FIELD *fhead;
static FIELD *ftail;
FIELD *fld;

/* -------- display a data field ------ */
static void disp_field(FIELD *fldv, char *bf, char *msk)
{
char cl[80], *cp = cl;

while (*msk) {
*cp++ = (*msk != FIELDCHAR ? *msk : *bf++);
msk++;
}
*cp = '\0';
writeline(fldv->fx + fldv->fcol - 1,
fldv->frow, cl);
}

/* ------- display the data value in a field ------ */
static void data_value(FIELD *fldv)
{
gotoxy(fldv->fcol, fldv->frow);
fldv->fx = 1;
disp_field(fldv, fldv->fbuff, fldv->fmask);
}

/* ------ display all the fields in a window ------- */
void field_tally()
{
FIELD *fldt;

fldt = fhead;
while (fldt != ftail) {
data_value(fldt);
fldt++;
}
}

/* ------- clear a template to all blanks ------ */
void clear_template()
{
FIELD *fldc;
char *bf, *msk;

fldc = fhead;
while (fldc != ftail) {
bf = fldc->fbuff;
msk = fldc->fmask;
while (*msk) {
if (*msk == FIELDCHAR)
*bf++ = ' ';
msk++;
}
fldc++;
}
*bf = '\0';
field_tally();
}

char *mask, *buff;

/* ------- read a field from the keyboard ------------- */
static int read_field(c)
{
int done = FALSE, first = TRUE;

home_cursor();
while (TRUE) {
gotoxy(fld->fx+fld->fcol-1, fld->frow);
if (!c || !first)
c = getkey();
first = FALSE;
switch (c) {
case CTRL_D:
delete_word();
break;
case CTRL_FWD:
done = !fore_word();
break;
case CTRL_BS:
done = !back_word();
break;
case HOME:
fld->fx = 1;
home_cursor();
break;
case END:
end_cursor();
break;
case FWD:
forward();
break;
case BS:
backspace();
break;
case '\b':
if (!backspace())
break;
gotoxy(fld->fx+fld->fcol-1, fld->frow);
case DEL:
delete_char();
disp_field(fld, buff, mask);
break;
case INS:
inserting ^= TRUE;
insert_line();
break;
default:
if (endstroke(c)) {
done = TRUE;
break;
}
if (inserting) {
memmove(buff+1, buff, strlen(buff)-1);
disp_field(fld, buff, mask);
gotoxy(fld->fcol+fld->fx-1, fld->frow);
}
*buff = (char) c;
putch(c);
forward();
if (!*mask)
c = FWD;
break;
}
if (done || !*mask)
break;
}
wkw.wx = fld->fx+1;
return c;
}

/* -------- home the cursor in the field -------- */
static void home_cursor()
{
buff = fld->fbuff+fld->fx-1;
mask = fld->fmask+fld->fx-1;
while (*mask != FIELDCHAR) {
fld->fx++;
mask++;
}
}

/* ------- move the cursor to the end of the field ------ */
static void end_cursor()
{
fld->fx += strlen(mask)-1;
buff += strlen(buff)-1;
mask += strlen(mask)-1;
while (*buff == ' ')
if (!backspace())
break;
forward();
}

/* ------ move the cursor forward one character -------- */
static void forward()
{
do {
fld->fx++;
mask++;
} while (*mask && *mask != FIELDCHAR);
buff++;
}

/* ------- move back one character ------------ */
static int backspace()
{
if (buff != fld->fbuff) {
--buff;
do {
--mask;
--(fld->fx);
} while (*mask != FIELDCHAR);
return TRUE;
}
return FALSE;
}

/* ------- move forward one word ------- */
static int fore_word()
{
int ct = 2, test = *buff == ' ';

while (ct--) {
while ((*buff == ' ') == test && *mask)
forward();
if (!*mask)
return FALSE;
if (test)
break;
test = !test;
}
return TRUE;
}

/* ------- move backward one word ------- */
static int back_word()
{
int test;

if (buff == fld->fbuff)
return FALSE;
if (*(buff-1) == ' ')
backspace();
test = *buff == ' ';
while ((*buff == ' ') == test && buff != fld->fbuff)
backspace();
if (test)
while (*buff != ' ' && buff != fld->fbuff)
backspace();
if (*buff == ' ')
forward();
return TRUE;
}

/* --------- delete a character ----------- */
static void delete_char()
{
memmove(buff, buff+1, strlen(buff));
*(buff+strlen(buff)) = ' ';
}

/* ----------- delete a word ---------- */
static void delete_word()
{
int test = *buff == ' ';
int ln = strlen(buff);

while ((*buff == ' ') == test && ln--)
delete_char();
if (!test)
delete_char();
disp_field(fld, buff, mask);
}

/* ---------- test c for an ending keystroke ----------- */
static int endstroke(int c)
{
switch (c) {
case '\r':
case '\n':
case '\t':
case ESC:
case F1:
case F2:
case F3:
case F4:
case F5:
case F6:
case F7:
case F8:
case F9:
case F10:
case PGUP:
case PGDN:
case HOME:
case END:
case CTRL_FWD:
case CTRL_BS:
case CTRL_HOME:
case CTRL_END:
case UP:
case DN:
return TRUE;
default:
return FALSE;
}
}

/* ----- Process data entry for a screen template. ---- */
int data_entry(FIELD *fldin, int init, int firstfld)
{
int exitcode = 0, done = FALSE;

insert_line();
fhead = ftail = fld = fldin;
while (ftail->frow)
ftail++;
while (firstfld-- && fld != ftail)
fld++;
--fld;
if (init)
clear_template();
field_tally();
/* ---- collect data from keyboard into screen ---- */
while (done == FALSE) {
gotoxy(fld->fcol, fld->frow);
textcolor(FIELDFG);
textbackground(FIELDBG);
data_value(fld);
gotoxy(fld->fcol, fld->frow);
fld->fx = 1;
exitcode = read_field(0);
textcolor(ENTRYFG);
textbackground(ENTRYBG);
data_value(fld);
switch (exitcode) {
case DN:
case '\r':
case '\t':
case CTRL_FWD:
case FWD: done = (ftail == fhead+1);
fld++;
if (fld == ftail)
fld = fhead;
break;
case CTRL_BS:
case UP: if (fld == fhead)
fld = ftail;
--fld;
break;
case CTRL_HOME:
fld = fhead;
break;
case CTRL_END:
fld = ftail-1;
break;
default: done = endstroke(exitcode);
break;
}
}
fld = NULL;
return (exitcode);
}

/* ---------- set insert/exchange cursor shape ----------- */
void insert_line()
{
set_cursor_type(inserting ? 0x0106 : 0x0607);
}


  3 Responses to “Category : Files from Magazines
Archive   : DDJSRC.ZIP
Filename : ENTRY.C

  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/