home *** CD-ROM | disk | FTP | other *** search
- /*--------------------------------------------------------------------------*/
- /* */
- /* XBBS SOURCE CODE copyright (c) 1990 by M. Kimes */
- /* All Rights Reserved */
- /* */
- /* For complete details of the licensing restrictions, please refer */
- /* to the License agreement, which is published in its entirety in */
- /* the in the file LICENSE.XBS. */
- /* */
- /* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */
- /* XBBS LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */
- /* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */
- /* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT M. KIMES */
- /* AT THE ADDRESS LISTED BELOW. IN NO EVENT SHOULD YOU PROCEED TO USE */
- /* THIS FILE WITHOUT HAVING ACCEPTED THE TERMS OF THE XBBS LICENSING */
- /* AGREEMENT, OR SUCH OTHER AGREEMENT AS YOU ARE ABLE TO REACH WITH */
- /* M. KIMES */
- /* */
- /* */
- /* You can contact M. Kimes at the following address: */
- /* */
- /* M. Kimes 1:380/16.0@FidoNet */
- /* 542 Merrick (318)222-3455 data */
- /* Shreveport, LA 71104 */
- /* */
- /* */
- /* Please feel free to contact me at any time to share your comments about */
- /* my software and/or licensing policies. */
- /* */
- /*--------------------------------------------------------------------------*/
-
- /* aentry.c */
-
- #include <stdio.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include <alloc.h>
- #include <mem.h>
- #include <string.h>
- #include <conio.h>
- #include "awindow.h"
- #include "xkeys.h"
-
- extern unsigned int baud;
-
- #define FIELDCHAR '_'
- int insert_mode=FALSE;
- extern int helpkey;
-
- #ifdef USEMOUSE
- extern int hcount,vcount,hysterisis;
- #endif
-
- /* Local prototypes */
- extern void pascal print_clock(void);
- void pascal addfield(WINDOW *wnd,FIELD *fld);
- void pascal data_value(WINDOW *wnd,FIELD *fld);
- void pascal insert_status(void);
- int pascal read_field(WINDOW *wnd,FIELD *fld);
- void pascal right_justify(char *s);
- void pascal right_justify_zero_fill(char *s);
- int pascal validate_date(char *s);
- int pascal endstroke(int c);
- int pascal spaces(char *c);
-
- /* Initialize a template */
- void pascal init_template (WINDOW *wnd) {
-
- FIELD *fld,*fl;
-
- fld=FHEAD;
- while (fld) {
- fl=fld->fnxt;
- ffree(fld);
- fld=fl;
- }
- FHEAD=NULL;
- }
-
- /* Establish a field in a template */
- FIELD * pascal establish_field (wnd,cl,rw,msk,bf,ty)
-
- WINDOW *wnd;
- int rw;
- int cl;
- char *msk;
- char *bf;
- int ty;
- {
-
- FIELD *fld;
-
- if ((fld=mmalloc(sizeof(FIELD)))==NULL) return NULL;
- fld->fmask=msk;
- fld->frow=rw;
- fld->fcol=cl;
- fld->fbuff=bf;
- fld->ftype=ty;
- fld->fprot=0;
- fld->fnxt=fld->fprv=NULL;
- fld->fvalid=NULL;
- fld->fhelp=NULL;
- fld->fhwin=NULL;
- fld->flx=fld->fly=0;
- addfield(wnd,fld);
- return fld;
- }
-
- /* Add a field to the end of the list */
- static void pascal addfield (WINDOW *wnd,FIELD *fld) {
-
- if (FTAIL) {
- fld->fprv=FTAIL;
- FTAIL->fnxt=fld;
- }
- FTAIL=fld;
- if(!FHEAD) FHEAD=fld;
- }
-
- /* Display a data field */
- static void pascal disp_field (WINDOW *wnd,char *bf,char *msk) {
-
- while (*msk) {
- wputcharaw (wnd,*msk !=FIELDCHAR ? *msk : *bf++);
- msk++;
- }
- }
-
- /* Display the data value in a field */
- static void pascal data_value (WINDOW *wnd,FIELD *fld) {
-
- wcursor(wnd,fld->fcol,fld->frow);
- disp_field(wnd,fld->fbuff,fld->fmask);
- }
-
- /* Display all the fields in a window */
- void pascal field_tally (WINDOW *wnd) {
-
- FIELD *fld;
-
- fld=FHEAD;
- while(fld != NULL) {
- data_value(wnd,fld);
- fld=fld->fnxt;
- }
- }
-
- /* Set a field's help window */
- void pascal field_window (FIELD *fld,char *hwin,int x,int y) {
-
- fld->fhwin=hwin;
- fld->flx=x;
- fld->fly=y;
- }
-
- /* Clear a template to all blanks */
- void pascal clear_template (WINDOW *wnd) {
-
- FIELD *fld;
- char *bf,*msk;
-
- fld=FHEAD;
- while (fld != NULL) {
- bf=fld->fbuff;
- msk=fld->fmask;
- while (*msk) {
- if(*msk==FIELDCHAR)
- *bf++=' ';
- msk++;
- }
- fld=fld->fnxt;
- }
- field_tally(wnd);
- }
-
- /* Prepare a template to end in blanks */
- void pascal prep_template (WINDOW *wnd) {
-
- FIELD *fld;
- char *bf,*msk;
-
- fld=FHEAD;
- while (fld != NULL) {
- bf=fld->fbuff;
- msk=fld->fmask;
- while((*bf!=0) && (*msk!=0)) {
- if (*msk!=FIELDCHAR) {
- msk++;
- continue;
- }
- if (*msk==0) {
- break;
- }
- bf++;
- msk++;
- }
- while (*msk) {
- if(*msk==FIELDCHAR) *bf++=' ';
- msk++;
- }
- *bf=0;
- fld=fld->fnxt;
- }
- field_tally(wnd);
- }
-
- /* Set insert/exchange cursor shape */
- static void pascal insert_status (void) {
- set_cursor_type(insert_mode ? 0x0106 : 0x0607);
- }
-
- /* Read a field from the keyboard */
- static int pascal read_field (WINDOW *wnd,FIELD *fld) {
-
- char *mask=fld->fmask,*buff=fld->fbuff;
- int done=FALSE,c,column;
- #ifdef USEMOUSE
- int temph,tempv;
- #endif
-
- #ifdef USEMOUSE
- temph=hcount;
- tempv=vcount;
- hcount=2*hysterisis;
- vcount=2*hysterisis;
- #endif
-
- column=fld->fcol;
- while(*mask!=FIELDCHAR) {
- column++;
- mask++;
- }
- while (TRUE) {
- wcursor(wnd,column,fld->frow);
- c=get_char();
- if(fld->ftype=='A' || fld->ftype=='O')
- c=toupper(c);
- clear_message();
- switch(c) {
- case 8:
- case BS:
- if(buff==fld->fbuff) {
- done=c==BS;
- break;
- }
- --buff;
- do {
- --mask;
- --column;
- } while (*mask !=FIELDCHAR);
- if (c==BS) break;
- case DEL:
- if(fld->ftype!='O') {
- movmem(buff+1,buff,strlen(buff));
- *(buff+strlen(buff))=' ';
- wcursor(wnd,column,fld->frow);
- disp_field(wnd,buff,mask);
- }
- break;
- case CTRL_Y:
- strset(buff,' ');
- disp_field(wnd,buff,mask);
- break;
- case CTRL_RIGHT:
- do {
- column++;
- mask++;
- if(*mask==FIELDCHAR)buff++;
- } while(*buff==' ' && *mask);
- if(*mask) {
- do {
- column++;
- mask++;
- if(*mask==FIELDCHAR)buff++;
- } while(*buff!=' ' && *mask);
- }
- break;
- case CTRL_LEFT:
- if(mask>fld->fmask) {
- do {
- --column;
- --mask;
- if(*mask==FIELDCHAR)--buff;
- } while(*buff==' ' && mask>fld->fmask);
- }
- if(mask>fld->fmask) {
- do {
- --column;
- --mask;
- if(*mask==FIELDCHAR)--buff;
- } while(*buff!=' ' && mask>fld->fmask);
- }
- break;
- case END:
- case CTRL_END:
- column=fld->fcol;
- mask=fld->fmask;
- buff=fld->fbuff;
- do {
- column++;
- mask++;
- if(*mask==FIELDCHAR)buff++;
- } while(*mask);
- while(*buff==' ' && mask>fld->fmask) {
- --column;
- --mask;
- if(*mask==FIELDCHAR)--buff;
- }
- if(*buff!=' ') buff++;
- break;
- case HOME:
- case CTRL_HOME:
- column=fld->fcol;
- mask=fld->fmask;
- buff=fld->fbuff;
- while(*mask!=FIELDCHAR) {
- column++;
- mask++;
- }
- break;
- case FWD:
- do {
- column++;
- mask++;
- } while(*mask && *mask!=FIELDCHAR);
- buff++;
- break;
- case INS:
- case ALT_I:
- insert_mode ^= TRUE;
- insert_status();
- break;
- case '.':
- if (fld->ftype=='C') {
- if (*mask++ && *buff==' ') {
- *buff++='0';
- if (*mask++ && *buff==' ') *buff++='0';
- }
- right_justify(fld->fbuff);
- wcursor(wnd,fld->fcol,fld->frow);
- disp_field(wnd,fld->fbuff,fld->fmask);
- column=fld->fcol+strlen(fld->fmask)-2;
- mask=fld->fmask+strlen(fld->fmask)-2;
- buff=fld->fbuff+strlen(fld->fbuff)-2;
- break;
- }
- default:
- if (endstroke(c)) {
- done=TRUE;
- break;
- }
- if (toupper(fld->ftype)!='A'&&toupper(fld->ftype)!='O'&&!isdigit(c)) {
- error_message("Numbers only");
- break;
- }
- if (toupper(fld->ftype)=='O'&& c!='X') c='-';
- if (insert_mode && fld->ftype!='O') {
- movmem(buff,buff+1,strlen(buff)-1);
- disp_field(wnd,buff,mask);
- wcursor(wnd,column,fld->frow);
- }
- *buff++=c;
- wputcharaw(wnd,c);
- do {
- column++;
- mask++;
- } while(*mask && *mask!=FIELDCHAR);
- if(!*mask) c=FWD;
- break;
- }
- if (!*mask) done=TRUE;
-
- if(done) {
- if(fld->ftype=='D' && (c!=ESC && c!=CTRL_K) && validate_date(fld->fbuff)!=OK) {
- #ifdef USEMOUSE
- hcount=temph;
- vcount=tempv;
- #endif
- return ERROR;
- }
- break;
- }
- }
- if((c!=CTRL_K && c!=ESC) && toupper(fld->ftype)!='A') {
- if(fld->ftype=='C') {
- if(*mask++ && *buff==' ') {
- *buff++='0';
- if(*mask++ && *buff==' ')
- *buff++='0';
- }
- }
- if (fld->ftype=='Z' || fld->ftype=='D') right_justify_zero_fill(fld->fbuff);
- else right_justify(fld->fbuff);
- wcursor(wnd,fld->fcol,fld->frow);
- disp_field(wnd,fld->fbuff,fld->fmask);
- }
- #ifdef USEMOUSE
- hcount=temph;
- vcount=tempv;
- #endif
- return c;
- }
-
- /* Test C for an ending keystroke */
- static int pascal endstroke (int c) {
-
- switch(c) {
- case 0:
- case '\r':
- case '\n':
- case '\t':
- case ESC:
- case CTRL_K:
- case PGUP:
- case PGDN:
- case UP:
- case DN:
- return TRUE;
- default:
- return FALSE;
- }
- }
-
- /* Right justify, space fill */
- static void pascal right_justify (char *s) {
-
- int len;
-
- len=strlen(s);
-
- /* while(*s==' ' || *s=='0' && len) {
- */
-
- while(*s==' '&& len) {
- len--;
- *s++=' ';
- }
-
- /*
- if(len)
- while(*(s+(len-1)) == ' ') {
- movmem(s,s+1,len-1);
- *s=' ';
- }
- */
-
- }
-
- /* Right justify,zero fill */
- static void pascal right_justify_zero_fill (char *s) {
-
- int len;
-
- if(spaces(s))
- return;
- len=strlen(s);
- while(*(s+len-1)==' ') {
- movmem(s,s+1,len-1);
- *s='0';
- }
- }
-
- /* Test for spaces */
- int pascal spaces (char *c) {
-
- while(*c==' ')
- c++;
- return !*c;
- }
-
- /* Validate a date */
- static int pascal validate_date (char *s) {
-
- static char days[]={31,28,31,30,31,30,31,31,30,31,30,31};
- char date[15];
- int mo;
-
- strcpy(date,s);
- if(spaces(date)) return OK;
- days[1] = (char)atoi(date+4%4) ? 28 : 29;
- *(date+4) = 0;
- mo=atoi(date+3);
- *(date+2) = 0;
- if(mo && mo<13 && atoi(date) && (char)atoi(date)<=days[mo-1]) return OK;
- error_message("Invalid date");
- return ERROR;
- }
-
- /* Process data entry for a screen template */
- int pascal data_entry (WINDOW *wnd) {
-
- FIELD *fld;
- int exitcode,isvalid,done=FALSE,oldhelpkey=helpkey;
-
- field_tally(wnd);
- fld=FHEAD;
- /* Collect data from keyboard into screen */
- while(fld!=NULL && done==FALSE) {
- /* set_help(fld->fhwin,fld->flx,fld->fly);
- helpkey=(fld->fhelp) ? 0 : oldhelpkey; */
- wcursor(wnd,fld->fcol,fld->frow);
- if(fld->fprot==FALSE) {
- reverse_video(wnd);
- data_value(wnd,fld);
- wcursor(wnd,fld->fcol,fld->frow);
- exitcode=read_field(wnd,fld);
- isvalid=((exitcode != ESC && exitcode!=CTRL_K) && fld->fvalid) ? (*(fld->fvalid))(fld->fbuff) : OK;
- }
- else {
- exitcode=FWD;
- isvalid=OK;
- }
- if(isvalid == OK) {
- normal_video(wnd);
- data_value(wnd,fld);
- switch(exitcode) { /* Passed edit */
- case F1: if (fld->fhelp) {
- (*(fld->fhelp))(fld->fbuff);
- data_value(wnd,fld);
- }
- break;
- case DN:
- case '\r':
- case 0:
- case FWD: fld=fld->fnxt;
- if(fld==NULL) {
- if (exitcode=='\r' || exitcode==0) {
- exitcode=F10;
- done=TRUE;
- }
- else fld=FHEAD;
- }
- break;
- case UP:
- case BS: fld=fld->fprv;
- if(fld==NULL)
- fld=FTAIL;
- break;
- default: done=endstroke(exitcode);
- break;
- }
- }
- }
- helpkey=oldhelpkey;
- return(exitcode);
- }
-
-
- /* Display a window prompt */
- void pascal wprompt (WINDOW *wnd,int x,int y,char *s) {
-
- wcursor(wnd,x,y);
- wprintfraw(wnd,s);
- }
-