home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include <stdio.h>
- #include <conio.h>
- #include <dos.h>
- #include <mem.h>
- #include <bios.h>
- #include <string.h>
- #include <math.h>
- #include <ctype.h>
- #include <alloc.h>
-
- #include "#defines.C"
-
- #ifdef MOUSE
- #include "ScrMouse.c"
- #endif
-
- typedef union
- {
- int ch;
- struct{
- unsigned char lsb;
- unsigned char msb;
- } byte;
- }keyindef;
- static keyindef shiftstat = 0;
-
- typedef union
- {
- struct s1
- {
- char filler;
- char s_name [128] [17];
- unsigned char s_number [128];
- int s_recordnumber [128];
- int s_fieldsrecno [128];
- int s_rangerecno [128];
- unsigned char s_first [128];
- unsigned char s_count [128];
- unsigned char s_compiledind [128];
- int s_rangerecnext;
- int s_rangelinenext;
- int s_sfiled;
- }A;
- struct s2
- {
- char filler;
- char s_video [3840];
- char s_workarray [80] [2];
- }B;
- struct s3
- {
- char filler;
- unsigned char s_fieldname [128] [17];
- unsigned char s_row [128];
- unsigned char s_col [128];
- unsigned char s_len [128];
- unsigned char s_type [128];
- unsigned char s_prev [128];
- unsigned char s_next [128];
- unsigned char s_datalen [128];
- unsigned char s_normalbg [128];
- unsigned char s_normalfg [128];
- unsigned char s_promptbg [128];
- unsigned char s_promptfg [128];
- unsigned char s_displaybg [128];
- unsigned char s_displayfg [128];
- unsigned int s_rangenextrec [128];
- unsigned char s_rangenextline [128];
- }C;
- struct s4
- {
- char filler;
- char s_rangelist [51] [79];
- int s_rangerec [51];
- unsigned char s_rangeline [51];
- }D;
- }s_rec_def;
-
- struct {
- char s_name [17];
- unsigned char s_number;
- int s_recordnumber;
- int s_fieldsrecno;
- int s_rangerecno;
- unsigned char s_first;
- unsigned char s_count;
- unsigned char s_compiledind;
- }s_curr;
-
- static FILE *s_file, *s_work;
- struct date S_Date;
- extern s_rec_def *s_indx, *s_record, *s_field;
- static int S_FieldPtr [128];
- static char *S_BuffPtr [128];
- static char *S_WorkArea;
- static unsigned char S_ClearLine;
- extern int long S_CursorOld;
- extern enum S_Cursors
- {S_OFF,S_BOLD,S_NORMAL,S_INVERSEBOLD,S_INVERSENORMAL,S_GETCURSOR};
- extern enum S_Cursors S_Cursor;
- extern void far *S_VideoMem;
- extern unsigned char
- S_FileOpen,
- S_Sound,
- S_HelpSound,
- S_ErrorSound,
- S_UserSound,
- S_ShowStatus,
- S_ChangeScreen,
- S_QuickHelp,
- S_Force_EditMask,
- S_AutoHelp,
- S_AutoValidate,
- S_EnterAsTab,
- S_FastVideo,
- S_DelayScreen,
- S_Delayed,
- S_Fkey,
- S_F1,
- S_F2,
- S_F3,
- S_F4,
- S_F5,
- S_F6,
- S_F7,
- S_F8,
- S_F9,
- S_F10,
- S_F11,
- S_F12,
- S_Enter,
- S_BkSp,
- S_Home,
- S_Up,
- S_PgUp,
- S_Left,
- S_Right,
- S_End,
- S_Down,
- S_PgDn,
- S_Ins,
- S_Del,
- S_Tab,
- S_Shift,
- S_LeftShift,
- S_RightShift,
- S_InsertMode,
- S_InsertKey,
- S_DeleteKey,
- S_BackSpace,
- S_LeftArrow,
- S_RightArrow,
- S_ScrollLock,
- S_Caps,
- S_NumLock,
- S_Alt,
- S_Ctrl,
- S_Esc,
- S_HelpBg,
- S_HelpFg,
- S_ErrorBg,
- S_ErrorFg,
- S_UserBg,
- S_UserFg,
- S_StBg,
- S_StFg,
- S_StLabelBg,
- S_StLabelFg,
- S_StLabelColor,
- S_StColor,
- S_Ch,
- S_FirstTime,
- S_Sound_Hold,
- S_Mono,
- S_UpCase,
- S_Validate_Finished,
- S_ScreenValid,
- S_Wait,
- S_PosLastChar,
- S_NextLine,
- S_Reverse,
- S_Skip,
- S_Matched,
- S_Min_Max_Loaded,
- S_EndofLine,
- S_InsideIf,
- S_Bw,
- S_DupFields,
- S_SetDupeFields,
- S_EntryType,
- S_DispType,
- S_DupType,
- S_FType,
- S_CurStr [81],
- S_EditStrHold[81],
- S_CompMin [81],
- S_CompMax [81],
- S_CompField [81],
- S_OpCode [81],
- S_OpCode1 [81],
- S_WorkStr [81],
- S_Msg [81],
- S_EditStr [81],
- S_Blanks [81],
- S_NewStr [81],
- S_Padding [81],
- S_WorkAttrib [81],
- S_NormAttrib [81],
- S_InitialValue[81],
- S_UserMsg [81],
- S_ErrorMsg [81],
- S_EditMask [81],
- S_EditMaskTypes[7],
- S_AutoHelpMsg [81],
- S_StLine [41],
- S_StAttrib [41],
- S_Ins_Str [2];
-
- extern int
- S_FirstField,
- S_Point,
- S_Freq,
- S_Dur,
- S_ErrorFreq,
- S_ErrorDur,
- S_HelpFreq,
- S_HelpDur,
- S_UserFreq,
- S_UserDur,
- S_VRec,
- S_RecNo,
- S_ValidateLine,
- S_ValidateField,
- S_Str_Pos,
- S_Attrib,
- S_MessBg,
- S_MessFg,
- S_Num,
- S_F_Key,
- S_Direction,
- S_Decimal,
- S_PrevField,
- S_FieldNum,
- S_Sub,
- S_CurrLine,
- S_NextRec;
-
- extern double
- S_Round [8],
- S_Numeric,
- S_CompMin_Numeric,
- S_CompMax_Numeric;
-
-
-
-
- int s_pos(char *string1,char *string2)
- {
- unsigned long X,Y,Z;
- char s1 [80];
- char s2 [80];
- strcpy(s1,string1);
- strcpy(s2,string2);
- X = (unsigned long) strstr(s1,s2);
- Y = (unsigned long) &s1;
- Z = X - Y;
- if (X==0) return -1;
- else return Z;
- }
-
-
-
-
- void s_delete(char *string1, int startpos,int count)
- {
- unsigned long x,y,z;
- char s1 [80];
- strcpy(s1,string1);
- if (startpos < strlen(s1))
- {
- z = startpos + count;
- if (z > strlen(s1)) count = strlen(s1)-startpos;
- string1[startpos]=0;
- strcat(string1,(char*)&s1[startpos + count]);
- }
- }
-
-
-
-
- void s_insert(char *string1,char *string2,int insertpoint,int maxlength)
- {
- unsigned long X,Y,Z;
- char s1 [160], s2 [80], s3 [80];
-
- if ((insertpoint > -1) && (insertpoint <= strlen(string1)))
- {
- strcpy(s3,(char *)&string1[insertpoint]);
- string1[insertpoint]=0;
- strcpy(s1,string1);
- strcpy(s2,string2);
- strcat(s1,s2);
- strcat(s1,s3);
- s1[maxlength]=0;
- strcpy(string1,s1);
- }
- }
-
-
-
-
- void s_copy(char *string1, char *string2,int startpos, int count)
- {
- unsigned long X,Y,Z;
- char s1 [160], s2 [80], s3 [80];
- if (startpos < strlen(string1))
- {
- strcpy(s1,string1);
- s1[startpos + count] = 0;
- strcpy(string2,(char *)&s1[startpos]);
- }
- }
-
-
-
-
- int s_strlen(char *target_string)
- {
- int x,y,z;
-
- x=strlen(target_string);
- while ((target_string[x-1]<33)&&(x>=0)) x--;
- if (x>-1) x++;
- return x;
- }
-
-
-
-
- int S_PutScrMem(row,col,len,source)
- char *source;
- int row,col,len;
- {
- int b_row,b_col;
-
- if (len>160)
- {
- b_row=len/160;
- b_col=len - (b_row*160);
- b_row += (row - 1);
- if (b_col==0) b_col = 80;
- }
- else
- {
- b_row = row;
- b_col = col + (len/2);
- }
- return puttext(col,row,b_col,b_row,source);
- }
-
-
-
-
-
- int S_GetScrMem(row,col,len,destination)
- char *destination;
- int row,col,len;
- {
- int b_row, b_col;
-
- if (len>160)
- {
- b_row=len/160;
- b_col=len - (b_row*160);
- b_row += (row - 1);
- if (b_col==0) b_col = 80;
- }
- else
- {
- b_row = row;
- b_col = col + (len/2);
- }
- return gettext(col,row,b_col,b_row,destination);
- }
-
-
-
-
-
- void S_ResetKeyFlags ()
- {
- S_F1=0;
- S_F2=0;
- S_F3=0;
- S_F4=0;
- S_F5=0;
- S_F6=0;
- S_F7=0;
- S_F8=0;
- S_F9=0;
- S_F10=0;
- S_F11=0;
- S_F12=0;
- S_Home=0;
- S_End=0;
- S_PgUp=0;
- S_PgDn=0;
- S_Left=0;
- S_Right=0;
- S_Up=0;
- S_Down=0;
- S_Del=0;
- S_Tab=0;
- S_BkSp=0;
- S_Esc=0;
- S_Ctrl=0;
- S_Enter=0;
- S_Fkey=0;
- S_Alt=0;
- S_Shift=0;
- S_Ins=0;
- S_NumLock=0;
- S_InsertKey=0;
- S_DeleteKey=0;
- S_BackSpace=0;
- S_LeftArrow=0;
- S_RightArrow=0;
- }
-
-
-
-
- unsigned char S_SetColor(unsigned char Bg, unsigned char Fg)
- {
- unsigned char color;
- color = (Fg>15)? ((Bg-16)*16)+Fg+127:(Bg*16)+Fg;
- return color;
- }
-
-
-
-
- void S_GetFieldType(unsigned char FType)
- {
- S_DupType = 0;
- S_EntryType = 0;
- S_DispType = 0;
-
- if ((FType >=0)&&(FType<=9))
- {
- S_FType = FType;
- S_EntryType = 1;
- }
- if ((FType >=10)&&(FType<=19))
- {
- S_FType = FType % 10;
- S_DupType = 1;
- }
- if ((FType >=90)&&(FType<=99))
- {
- S_FType = FType % 90;
- S_DispType = 1;
- }
- if ((FType >=100)&&(FType<=109))
- {
- S_FType = FType % 100;
- S_DispType = 1;
- S_DupType = 1;
- }
- }
-
-
-
-
-
- void S_SetCursor(S)
- char S;
- {
- union REGS in,out;
-
- in.h.ah = 1;
- in.h.bh = 0;
-
- if (S==0) in.x.cx = 4096;
- if ((S==1)||(S==3)) in.x.cx = 15;
- if ((S==2)||(S==4)) in.x.cx = S_CursorOld;
- if (S==5) in.h.ah = 3;
-
- int86(0x10,&in,&out);
-
- if (S==5) S_CursorOld = out.x.cx;
- }
-
-
-
- void S_Init()
- {
- struct text_info r;
- int loop1;
-
- S_VideoMem = (char far *)MK_FP (
- (
- ((biosequip()&0x0030)!=0x0030) ? 0xB800:0xB000),0x0000
- );
- S_FastVideo = 0;
-
- S_CursorOld = 1543;
-
- if (S_FirstTime)
- {
- #if defined (__MEDIUM__)
- s_indx = (s_rec_def *) malloc (sizeof(*s_indx));
- s_record = (s_rec_def *) malloc (sizeof(*s_record));
- s_field = (s_rec_def *) malloc (sizeof(*s_field));
- #else
- s_indx = (s_rec_def *) farmalloc (sizeof(*s_indx));
- s_record = (s_rec_def *) farmalloc (sizeof(*s_record));
- s_field = (s_rec_def *) farmalloc (sizeof(*s_field));
- #endif
- S_SetCursor (S_GETCURSOR);
- S_FirstTime = 0;
- #ifdef MOUSE
- S_InitMouse();
- #endif
- }
-
- S_SetCursor(S_OFF);
- S_VRec=0;
- S_StBg=0;
- S_StFg=2;
- S_StLabelBg=7;
- S_StLabelFg=0;
- S_MessBg=4;
- S_MessFg=15;
- S_Msg[0]=0;
- S_ErrorBg=4;
- S_ErrorFg=15;
- S_UserBg=0;
- S_UserFg=14;
- S_HelpBg=7;
- S_HelpFg=0;
- S_EditMask[0]=0;
- S_AutoHelpMsg [0]=0;
- S_Force_EditMask=0;
- S_QuickHelp=0;
- S_AutoHelp=0;
- S_AutoValidate=0;
- S_Sound=1;
- S_Freq=300;
- S_Dur=100;
- S_HelpSound=1;
- S_HelpFreq=300;
- S_HelpDur=100;
- S_UserSound=1;
- S_UserFreq=300;
- S_UserDur=100;
- S_ErrorSound=1;
- S_ErrorFreq=300;
- S_ErrorDur=100;
- S_PosLastChar=0;
- S_ChangeScreen=1;
- S_Ch=0;
- S_Point=-1;
- S_Direction=1;
- S_F_Key=0;
- S_RecNo=0;
- S_ValidateLine=0;
- S_ValidateField=-1;
- S_InsertKey=0;
- S_DeleteKey=0;
- S_BackSpace=0;
- S_LeftArrow=0;
- S_RightArrow=0;
- S_EnterAsTab=0;
- S_DelayScreen=0;
- S_Delayed=0;
- S_FileOpen=0;
- S_ClearLine=0;
- S_Cursor=S_NORMAL;
- memset(S_Msg,0,81);
- memset(S_Blanks,32,80);
- S_WorkArea = NULL;
- for (loop1=0;loop1<128;loop1++) S_BuffPtr[loop1]=NULL;
- S_Blanks[80]=0;
-
- strcpy(S_StLine,"[Insert] [Caps] [Num Lock] [Scroll Lock]");
- strcpy(S_EditMaskTypes,"@2#3$4");
- strcpy(S_NormAttrib,S_Msg);
- strcpy(S_NewStr,S_Msg);
- strcpy(S_Padding,S_Msg);
-
- gettextinfo(&r);
- textmode(r.currmode);
- if ((!s_indx)||(!s_record)||(!s_field))
- {
- cprintf("Unable to allocate far memory..\r\n");
- exit (1);
- }
- S_ResetKeyFlags();
- }
-
-
-
-
- void S_CloseScreenFile()
- {
- if (S_FirstTime) S_Init();
- if (S_FileOpen)
- {
- fclose(s_file);
- /*
- #if defined (__MEDIUM__)
- free(s_indx);
- free(s_record);
- free(s_field);
- #else
- farfree(s_indx);
- farfree(s_record);
- farfree(s_field);
- #endif
- */
- S_SetCursor(S_NORMAL);
- /*
- S_FirstTime = 1;
- S_FileOpen = 0;
- */
- }
- }
-
-
-
- void S_LoadScreenIndex()
- {
- int loop1,loop2,loop3;
-
- if (fseek(s_file,0L,0) != 0)
- {
- puts("seek failed ");
- exit (1);
- }
-
- if (fread(s_indx,sizeof(*s_indx),1,s_file) < 1)
- {
- puts("reload index failed ");
- exit (1);
- }
-
- for (loop1=0;loop1 < s_indx->A.s_sfiled;loop1++)
- {
- loop2 = s_indx->A.s_name[loop1][0];
- for (loop3=1;loop3 < (loop2+2);loop3++)
- s_indx->A.s_name[loop1][loop3-1]=s_indx->A.s_name[loop1][loop3];
- s_indx->A.s_name[loop1][loop2]=0;
- }
- S_VRec = -999;
- }
-
-
-
- void S_OpenScreenFile (char *scrfilename)
- {
- int loop1,loop2,loop3;
-
- if (S_FirstTime) S_Init();
- if (S_FileOpen) S_CloseScreenFile();
-
- loop2 = 0;
- loop1 = 0;
- while (scrfilename[loop1] != 0)
- {
- if (scrfilename[loop1++] == '.') loop2 = 1;
- }
- if (!loop2) strcat(scrfilename,".Scr");
-
- S_FileOpen = 1;
-
- if ((s_file = fopen(scrfilename,"r+b")) == NULL)
- {
- cprintf("open up of %s failed\r\n",scrfilename);
- exit (1);
- }
- S_LoadScreenIndex();
- }
-
-
-
-
- void S_Beep(int t,int l)
- {
- if (S_Sound > 0)
- {
- sound(t);
- delay(l);
- nosound();
- }
- }
-
-
-
-
-
- void S_Write (int Row, int Col, int Len,char *Source, char *Attribs)
- {
- int X,Y,Ptr,Ch;
- for (Ptr=0;Ptr<=Len;Ptr++)
- {
- s_record->B.s_workarray[Ptr][0]=Source[Ptr];
- s_record->B.s_workarray[Ptr][1]=Attribs[Ptr];
- }
- S_PutScrMem(Row,Col,(Len*2),&s_record->B.s_workarray);
- for (Ptr=1;Ptr<81;Ptr++) S_NormAttrib[Ptr]=0;
- }
-
-
-
-
- void S_DisplayMessage(Bg,Fg,Msg)
- int Bg,Fg;
- char Msg [81];
- {
- int Msg_Len,W,X,Y;
- if (S_FirstTime) S_Init();
- strcpy(S_Padding,S_Blanks);
- strcpy(S_WorkAttrib,S_Blanks);
- Msg_Len = strlen(Msg);
- Y = (80 - Msg_Len)/2;
- W = 0;
- for (X=0;X<80;X++)
- {
- if (X<Y) S_WorkAttrib[X] = 2;
- else
- if (X>((Y+Msg_Len)-1)) S_WorkAttrib[X] = 2;
- else
- {
- S_WorkAttrib[X]=(Bg*16)+Fg;
- S_Padding [X]=Msg[W];
- W++;
- }
- }
- if (strlen(Msg)>0) S_Beep(S_Freq,S_Dur);
- S_Write(25,1,80,S_Padding,S_WorkAttrib);
- S_Msg[0]=0;
- }
-
-
-
-
-
- void S_Store_Buf_Loc(char *ScrName, char *ScrBuff)
- {
- int X,Y,Z;
- if (S_FirstTime) S_Init();
- S_LoadScreenIndex();
- for (X=0;X<s_indx->A.s_sfiled;X++)
- {
- if (strcmp(strupr(ScrName),strupr(s_indx->A.s_name[X]))==0)
- {
- S_BuffPtr [X] = ScrBuff;
- break;
- }
- }
- }
-
-
-
-
-
- void S_LoadScreen(char *ScrName)
- {
- int A,B,X,Y,Z;
- int RR;
- long rec;
- if (S_FirstTime) S_Init();
- if (S_FileOpen)
- {
- S_LoadScreenIndex();
- S_Num = -1;
- for (X=0;X<s_indx->A.s_sfiled;X++)
- {
- if (strcmp(strupr(ScrName),strupr(s_indx->A.s_name[X]))==0)
- {
- S_Num = X;
- break;
- }
- }
-
- S_Msg[0]=0;
-
- if (S_BuffPtr[S_Num]==NULL)
- strcpy(S_Msg,"< > Buffer has not been initialized");
-
- if (S_Num==-1)
- strcpy(S_Msg,"< > has not been found");
-
- if (s_indx->A.s_compiledind[S_Num]==0)
- strcpy(S_Msg,"< > has not been compiled");
-
- }
- else
- strcpy(S_Msg,"< > has not been opened.");
-
- if (S_Msg[0]>0)
- {
- Y=1;
- for (X=0;ScrName[X]!=NULL;X++) S_Msg[Y++]=ScrName[X];
- S_DisplayMessage(S_MessBg,S_MessFg,S_Msg);
- S_CloseScreenFile();
- exit(1);
- }
-
- S_WorkArea = S_BuffPtr[S_Num];
-
- rec = (s_indx->A.s_recordnumber[S_Num])*sizeof(*s_record);
-
- fseek(s_file,rec,0);
- fread(s_record,sizeof(*s_record),1,s_file);
-
- S_FirstField = 0;
- if (s_indx->A.s_fieldsrecno[S_Num])
- {
- if (S_ChangeScreen)
- {
- rec = (s_indx->A.s_fieldsrecno[S_Num])*sizeof(*s_record);
- fseek(s_file,rec,0);
- fread(s_field,sizeof(*s_field),1,s_file);
- }
- S_FirstField = (s_indx->A.s_first[S_Num])-1;
- S_Point = 0;
- for (X=0;X<s_indx->A.s_count[S_Num];X++)
- {
- Y = s_field->C.s_fieldname[X][0];
- S_GetFieldType(s_field->C.s_type[X]);
- movmem(&s_field->C.s_fieldname[X][1],&s_field->C.s_fieldname[X][0],16);
- s_field->C.s_fieldname[X][Y]=0;
- S_FieldPtr[X] = S_Point;
-
- if (S_FType > 7)
- S_Point = S_Point + s_field->C.s_len[X]+1;
- else
- S_Point = S_Point + sizeof((double)0);
-
- A = (s_field->C.s_col[X]+s_field->C.s_len[X])*2;
- B = (s_field->C.s_row[X]-1)*160;
-
- for (Z=((s_field->C.s_col[X]-1)*2);Z<=A;Z+=2) s_record->B.s_video[B+Z]=32;
- }
- }
- if (S_ChangeScreen)
- {
- if (S_DelayScreen)
- {
- S_Delayed = 1;
- S_DelayScreen = 0;
- }
- else
- if (S_FastVideo)
- movmem((void *)&s_record->B.s_video[0],(void *)S_VideoMem,4000);
- else
- puttext(1,1,80,24,&s_record->B.s_video[0]);
- S_Point = S_FirstField;
- }
- else
- S_ChangeScreen = 1;
-
- strcpy(s_curr.s_name,s_indx->A.s_name[S_Num]);
- s_curr.s_number = s_indx->A.s_number [S_Num];
- s_curr.s_recordnumber = s_indx->A.s_recordnumber[S_Num];
- s_curr.s_fieldsrecno = s_indx->A.s_fieldsrecno [S_Num];
- s_curr.s_rangerecno = s_indx->A.s_rangerecno [S_Num];
- s_curr.s_first = s_indx->A.s_first [S_Num];
- s_curr.s_count = s_indx->A.s_count [S_Num];
- s_curr.s_compiledind = s_indx->A.s_compiledind [S_Num];
- }
-
-
-
-
- void S_DisplayScreenField(int R,int C,int T,int L,int DL,
- int DF,int DB,int NF,int NB,char *S)
- {
- int Attr,x,y,z,l;
- char Wk[80];
- double *Dbl;
- unsigned char BackColor, ForColor;
-
- if (S_FirstTime) S_Init();
- strcpy(S_EditStr,S);
- DL = strlen(S_EditStr);
-
- if (DL>0)
- Attr = (DB * 16) + DF;
- else
- Attr = (NB * 16) + NF;
-
- setmem(S_NormAttrib,80,Attr);
-
- l = (L - strlen(S_EditStr))+1;
-
- if (l > 0)
- {
- movmem(&S_Blanks,&S_Padding,80);
- S_Padding[l]=0;
- }
- else
- {
- S_Padding[0]=32;
- S_Padding[1]=0;
- }
-
- if ((T > 89)&&(T<98)) T-=89;
-
- if (T<8)
- {
- strcpy(Wk,S_Padding);
- strcat(Wk,S_EditStr);
- strcat(Wk," ");
- }
- else
- {
- strcpy(Wk," ");
- strcat(Wk,S_EditStr);
- strcat(Wk,S_Padding);
- }
- S_Write(R,C,L+1,Wk,S_NormAttrib);
- }
-
-
-
-
-
- void S_FillScreen()
- {
- int Sign,DecPos,S_PrevField,Screen_Point,p,x,y,z,C;
- unsigned char WorkAttrib;
- double dbl_work, rounding, *Dbl;
-
- S_PrevField = S_Point;
- S_Point = 0;
-
- while (S_Point < s_curr.s_count)
- {
- S_GetFieldType(s_field->C.s_type[S_Point]);
- S_Decimal = S_FType;
-
- if (S_Decimal > 7)
- {
- strcpy(S_EditStr,(char*)&S_WorkArea[(int)S_FieldPtr[S_Point]]);
- s_field->C.s_datalen[S_Point] = strlen(S_EditStr);
- }
- else
- {
- dbl_work = *((double *)(S_WorkArea+S_FieldPtr[S_Point]));
- if (dbl_work!=0.0)
- {
- rounding = (dbl_work<0)?(0-S_Round[S_Decimal]):S_Round[S_Decimal];
- strcpy(S_EditStr,ecvt((dbl_work+rounding),20,&DecPos,&Sign));
- while (DecPos<1)
- {
- s_insert(S_EditStr,"0",0,20);
- DecPos++;
- }
- s_insert(S_EditStr,".",DecPos,80);
- while (S_EditStr[0]=='0') s_delete(S_EditStr,0,1);
- if (Sign) s_insert(S_EditStr,"-",0,80);
- }
- else
- strcpy(S_EditStr,".000000");
- S_EditStr[(s_pos(S_EditStr,".")+S_Decimal)]=0;
- if (S_EditStr[0]==0)
- {
- S_EditStr[0]='0';
- S_EditStr[1]=0;
- }
- x = strlen(S_EditStr);
- y = x - s_field->C.s_len[S_Point];
-
- if (y>0)
- while (y--)
- {
- s_delete(S_EditStr,0,1);
- x--;
- }
- s_field->C.s_datalen[S_Point] = x;
- }
-
- Screen_Point = ((s_field->C.s_row[S_Point]-1)*160)
- + ((s_field->C.s_col[S_Point]-1)*2);
-
- if (s_field->C.s_datalen[S_Point]>0)
- WorkAttrib = (s_field->C.s_displaybg[S_Point] * 16)
- + s_field->C.s_displayfg[S_Point];
- else
- WorkAttrib = (s_field->C.s_normalbg[S_Point] * 16)
- + s_field->C.s_normalfg[S_Point];
-
- p=0;
- x=((s_field->C.s_len[S_Point])+2)*2;
- y=(s_field->C.s_datalen[S_Point])*2;
- if (S_Decimal > 7)
- {
- C=0;
- while (C<x)
- {
- if (C>0) s_record->B.s_video[Screen_Point+C]=(C<=y)? S_EditStr[p++]:32;
- else s_record->B.s_video[Screen_Point+C]=32;
- C++;
- s_record->B.s_video[Screen_Point+C]= WorkAttrib;
- C++;
- }
- }
- else
- {
- z=(x-y)-4;
- C=0;
- while (C<x)
- {
- if (C>0) s_record->B.s_video[Screen_Point+C]= (C>z)?S_EditStr[p++]:32;
- else s_record->B.s_video[Screen_Point+C]=32;
- C++;
- s_record->B.s_video[Screen_Point+C]= WorkAttrib;
- C++;
- }
- }
- S_Point++;
- }
- if (S_FastVideo)
- movmem((void *)&s_record->B.s_video[0],(void *)S_VideoMem,4000);
- else
- puttext(1,1,80,24,&s_record->B.s_video[0]);
- S_Point = S_PrevField;
- }
-
-
-
-
-
- void S_GetKey()
- {
- static int C_nt;
- static unsigned char Two_Keys, Toggle,KeyDetected;
- char ch;
- typedef union
- {
- int ch;
- struct{
- unsigned char lsb;
- unsigned char msb;
- } byte;
- }keyindef;
-
- static keyindef keyin;
- keyindef shiftstat;
-
- S_ResetKeyFlags();
-
- if (S_ErrorMsg[0]!=0)
- {
- S_Freq = S_ErrorFreq;
- S_Dur = S_ErrorDur;
- S_Sound = S_ErrorSound;
- S_MessBg = S_ErrorBg;
- S_MessFg = S_ErrorFg;
- movmem(S_ErrorMsg,S_Msg,81);
- S_ErrorMsg[0]=0;
- }
- else
- if (S_UserMsg[0]!=0)
- {
- S_Freq = S_UserFreq;
- S_Dur = S_UserDur;
- S_Sound = S_UserSound;
- S_MessBg = S_UserBg;
- S_MessFg = S_UserFg;
- movmem(S_UserMsg,S_Msg,81);
- S_UserMsg[0]=0;
- }
- else
- if (S_AutoHelpMsg[0]!=0)
- {
- S_Freq = S_HelpFreq;
- S_Dur = S_HelpDur;
- S_Sound = S_HelpSound;
- S_MessBg = S_HelpBg;
- S_MessFg = S_HelpFg;
- movmem(S_AutoHelpMsg,S_Msg,81);
- S_AutoHelpMsg[0]=0;
- };
-
-
-
- if (S_Msg[0]!=0)
- {
- S_Wait = 1;
- S_DisplayMessage(S_MessBg,S_MessFg,S_Msg);
- S_ClearLine = 1;
- }
-
- #ifdef MOUSE
- if ((S_Ms->MouseActive)&&(S_MouseVisable)) S_RestoreMouse();
- #endif
-
- do
- {
- KeyDetected = 0;
- keyin.ch = 0;
- #ifdef MOUSE
- while ((!KeyDetected)&&(!S_Ms->MouseEvent))
- #else
- while (!KeyDetected)
- #endif
- {
- Toggle = 0;
- Two_Keys = 0;
- #ifdef MOUSE
- while ((!S_Ms->MouseEvent)&&(!KeyDetected)&&(!Two_Keys)&&(!Toggle))
- #else
- while ((!KeyDetected)&&(!Two_Keys)&&(!Toggle))
- #endif
- {
- shiftstat.ch = bioskey(2);
- C_nt = 0;
- if (shiftstat.byte.lsb & 1) C_nt++;
- if (shiftstat.byte.lsb & 2) C_nt++;
- if (shiftstat.byte.lsb & 4) C_nt++;
- if (shiftstat.byte.lsb & 8) C_nt++;
- if (C_nt > 1) Two_Keys = 1;
-
- if (shiftstat.byte.lsb & 16)
- {
- if (!S_ScrollLock) Toggle = 1;
- }
- else
- if (S_ScrollLock) Toggle = 1;
-
- if (shiftstat.byte.lsb & 33)
- {
- if (!S_NumLock) Toggle = 1;
- }
- else
- if (S_NumLock) Toggle = 1;
-
- if (shiftstat.byte.lsb & 64)
- {
- if (!S_Caps) Toggle = 1;
- }
- else
- if (S_Caps) Toggle = 1;
-
- if (shiftstat.byte.lsb & 128)
- {
- if (!S_InsertMode) Toggle = 1;
- }
- else
- if (S_InsertMode) Toggle = 1;
- if (bioskey(1)!=0) KeyDetected = 1;
-
- if (KeyDetected) keyin.ch = bioskey(0);
-
- S_RightShift = 0;
- S_LeftShift = 0;
- S_Shift = 0;
- S_ScrollLock = 0;
- S_Caps = 0;
- S_InsertMode = 0;
- S_NumLock = 0;
- S_Ctrl = 0;
- S_Alt = 0;
- C_nt = 0;
-
- if (shiftstat.byte.lsb & 1){S_RightShift = 1; C_nt++; S_Shift = 1;}
- if (shiftstat.byte.lsb & 2){S_LeftShift = 1; C_nt++; S_Shift = 1;}
- if (shiftstat.byte.lsb & 4){S_Ctrl = 1; C_nt++;}
- if (shiftstat.byte.lsb & 8){S_Alt = 1; C_nt++;}
- if (shiftstat.byte.lsb & 16) S_ScrollLock = 1;
- if (shiftstat.byte.lsb & 32) S_NumLock = 1;
- if (shiftstat.byte.lsb & 64) S_Caps = 1;
- if (shiftstat.byte.lsb & 128) S_InsertMode = 1;
- if (Two_Keys)
- {
- keyin.ch= 0;
- S_Ch = 0;
- S_Fkey = 1;
- goto Exit;
- }
- if ((S_ShowStatus)&&(!S_Wait))
- {
- memset(S_StAttrib,S_StColor,40);
- if (S_InsertMode) memset(S_StAttrib,S_StLabelColor,8);
- if (S_Caps) memset(&S_StAttrib[9],S_StLabelColor,6);
- if (S_NumLock) memset(&S_StAttrib[16],S_StLabelColor,10);
- if (S_ScrollLock) memset(&S_StAttrib[27],S_StLabelColor,13);
- setmem(S_Padding,80,32);
- setmem(S_WorkAttrib,80,0);
- memmove((char *)&S_Padding[21],S_StLine,40);
- memmove((char *)&S_WorkAttrib[21],S_StAttrib,40);
- S_Write(25,1,80,S_Padding,S_WorkAttrib);
- Toggle = 0;
- }
- }
- }
- }
-
- #ifdef MOUSE
- while ((keyin.ch == 0)&&(!S_Ms->MouseEvent));
- if ((S_Ms->MouseActive)&&(S_MouseVisable)) S_RemoveMouse();
- #else
- while (keyin.ch == 0);
- #endif
-
- if (S_ClearLine)
- {
- S_Wait = 0;
- S_Msg[0]=0;
- S_ClearLine = 0;
- S_DisplayMessage(S_MessBg,S_MessFg,S_Msg);
- }
-
- #ifdef MOUSE
- if (S_Ms->MouseEvent) {keyin.ch=0;goto Exit;}
- #endif
- if ((S_Ctrl) && (keyin.byte.lsb > 0) && (keyin.byte.lsb < 29))
- {
- S_Fkey = 1;
- ch = keyin.byte.lsb + 64;
- goto Exit;
- }
-
- ch = 0;
-
- if (S_Shift)
- {
- S_Fkey = 1;
- switch (keyin.byte.msb)
- {
- case 71 : S_Home = 1; break;
- case 79 : S_End = 1; break;
- case 73 : S_PgUp = 1; break;
- case 81 : S_PgDn = 1; break;
- case 75 : S_Left = 1; break;
- case 77 : S_Right= 1; break;
- case 72 : S_Up = 1; break;
- case 80 : S_Down = 1; break;
- case 82 : S_Ins = 1; break;
- case 83 : S_Del = 1; break;
- case 15 : S_Tab = 1; break;
- default :
- S_Fkey = 0;
- }
- }
-
- if ((keyin.byte.lsb == 0)&&(keyin.byte.msb>0))
- {
- S_Fkey = 1;
- switch (keyin.byte.msb)
- {
- case 59 : S_F1 = 1; break;
- case 60 : S_F2 = 1; break;
- case 61 : S_F3 = 1; break;
- case 62 : S_F4 = 1; break;
- case 63 : S_F5 = 1; break;
- case 64 : S_F6 = 1; break;
- case 65 : S_F7 = 1; break;
- case 66 : S_F8 = 1; break;
- case 67 : S_F9 = 1; break;
- case 68 : S_F10 = 1; break;
- case 133: S_F11 = 1; break;
- case 134: S_F12 = 1; break;
- case 84 : S_F1 = 1; break;
- case 85 : S_F2 = 1; break;
- case 86 : S_F3 = 1; break;
- case 87 : S_F4 = 1; break;
- case 88 : S_F5 = 1; break;
- case 89 : S_F6 = 1; break;
- case 90 : S_F7 = 1; break;
- case 91 : S_F8 = 1; break;
- case 92 : S_F9 = 1; break;
- case 93 : S_F10 = 1; break;
- case 135: S_F11 = 1; break;
- case 136: S_F12 = 1; break;
- case 94 : S_F1 = 1; break;
- case 95 : S_F2 = 1; break;
- case 96 : S_F3 = 1; break;
- case 97 : S_F4 = 1; break;
- case 98 : S_F5 = 1; break;
- case 99 : S_F6 = 1; break;
- case 100: S_F7 = 1; break;
- case 101: S_F8 = 1; break;
- case 102: S_F9 = 1; break;
- case 103: S_F10 = 1; break;
- case 137: S_F11 = 1; break;
- case 138: S_F12 = 1; break;
- case 104: S_F1 = 1; break;
- case 105: S_F2 = 1; break;
- case 106: S_F3 = 1; break;
- case 107: S_F4 = 1; break;
- case 108: S_F5 = 1; break;
- case 109: S_F6 = 1; break;
- case 110: S_F7 = 1; break;
- case 111: S_F8 = 1; break;
- case 112: S_F9 = 1; break;
- case 113: S_F10 = 1; break;
- case 139: S_F11 = 1; break;
- case 140: S_F12 = 1; break;
- case 71 : S_Home = 1; break;
- case 79 : S_End = 1; break;
- case 73 : S_PgUp = 1; break;
- case 81 : S_PgDn = 1; break;
- case 75 : S_Left = 1; break;
- case 77 : S_Right= 1; break;
- case 72 : S_Up = 1; break;
- case 80 : S_Down = 1; break;
- case 82 : S_Ins = 1; break;
- case 83 : S_Del = 1; break;
- case 15 : S_Tab = 1; break;
- case 119: S_Home = 1; break;
- case 117: S_End = 1; break;
- case 132: S_PgUp = 1; break;
- case 118: S_PgDn = 1; break;
- case 115: S_Left = 1; break;
- case 116: S_Right= 1; break;
- case 16 : ch = 'Q'; break;
- case 17 : ch = 'W'; break;
- case 18 : ch = 'E'; break;
- case 19 : ch = 'R'; break;
- case 20 : ch = 'T'; break;
- case 21 : ch = 'Y'; break;
- case 22 : ch = 'U'; break;
- case 23 : ch = 'I'; break;
- case 24 : ch = 'O'; break;
- case 25 : ch = 'P'; break;
- case 30 : ch = 'A'; break;
- case 31 : ch = 'S'; break;
- case 32 : ch = 'D'; break;
- case 33 : ch = 'F'; break;
- case 34 : ch = 'G'; break;
- case 35 : ch = 'H'; break;
- case 36 : ch = 'J'; break;
- case 37 : ch = 'K'; break;
- case 38 : ch = 'L'; break;
- case 44 : ch = 'Z'; break;
- case 45 : ch = 'X'; break;
- case 46 : ch = 'C'; break;
- case 47 : ch = 'V'; break;
- case 48 : ch = 'B'; break;
- case 49 : ch = 'N'; break;
- case 50 : ch = 'M'; break;
- case 129: ch = '0'; break;
- case 120: ch = '1'; break;
- case 121: ch = '2'; break;
- case 122: ch = '3'; break;
- case 123: ch = '4'; break;
- case 124: ch = '5'; break;
- case 125: ch = '6'; break;
- case 126: ch = '7'; break;
- case 127: ch = '8'; break;
- case 128: ch = '9'; break;
- case 130: ch = '-'; break;
- case 131: ch = '='; break;
- case 114: ch = '*'; break;
- }
- }
- if ((keyin.byte.msb != 0) && (!S_Alt))
- {
- switch (keyin.byte.lsb)
- {
- case 9 : {S_Tab = 1;break;}
- case 8 : {S_BkSp = 1;break;}
- case 127 : {S_BkSp = 1;break;}
- case 27 : {S_Esc = 1;break;}
- case 13 : {S_Enter = 1;break;}
- default : ch = keyin.byte.lsb;
- }
- if ((S_Tab)||(S_BkSp)||(S_Esc)||(S_Enter)) S_Fkey = 1;
- }
- Exit:
- S_Ch = ch;
- if ((S_Enter)&&(S_EnterAsTab)) {S_Tab=1;S_Enter=0;}
- if (S_Left) S_LeftArrow = 1;
- if (S_Right) S_RightArrow = 1;
- if (S_BkSp) S_BackSpace = 1;
- if (S_Ins) S_InsertKey = 1;
- if (S_Del) S_DeleteKey = 1;
- }
-
-
-
-
-
-
- void S_Get_Field_Value(int S_Point)
- {
- int DecPos,Sign,x,y,z;
- double dbl_work,rounding;
-
- S_GetFieldType(s_field->C.s_type[S_Point]);
- S_Decimal = S_FType;
-
- if (S_Decimal > 7)
- strcpy(S_EditStr,(char*)&S_WorkArea[(int)S_FieldPtr[S_Point]]);
- else
- {
- dbl_work = *((double *)(S_WorkArea+S_FieldPtr[S_Point]));
-
- if (dbl_work!=0)
- {
- rounding = (dbl_work<0)?(0-S_Round[S_Decimal]):S_Round[S_Decimal];
- strcpy(S_EditStr,(char *)ecvt((dbl_work+rounding),20,&DecPos,&Sign));
- while (DecPos<0)
- {
- s_insert(S_EditStr,"0",0,20);
- DecPos++;
- }
- s_insert(S_EditStr,".",DecPos,80);
- while (S_EditStr[0]=='0') s_delete(S_EditStr,0,1);
- if (Sign) s_insert(S_EditStr,"-",0,80);
- }
- else
- strcpy(S_EditStr,".000000");
-
- S_EditStr[(s_pos(S_EditStr,".")+S_Decimal)]=0;
-
- if (S_EditStr[0]==0)
- {
- S_EditStr[0]='0';
- S_EditStr[1]=0;
- }
- x = strlen(S_EditStr);
- y = x - s_field->C.s_len[S_Point];
-
- if (y>0)
- while (y--)
- {
- s_delete(S_EditStr,0,1);
- x--;
- }
- s_field->C.s_datalen[S_Point] = x;
- }
- }
-
-
-
-
-
- void S_PreEdit(int HR,int HL)
- {
- char workstr[80];
- int X;
- long rec;
- setmem(S_InitialValue,80,0);
- S_AutoHelpMsg[0]=0;
- S_EditMask[0]=0;
- S_Force_EditMask=0;
- X=0;
- while ((HR>0) && (X<3))
- {
- if (S_VRec!=HR)
- {
- rec = HR * sizeof(*s_record);
- S_VRec = HR;
- fseek(s_file,rec,0);
- fread(s_indx,sizeof(*s_indx),1,s_file);
- }
- X++;
-
- if (((S_AutoHelp)||(S_QuickHelp))&&(s_indx->D.s_rangelist[HL-1][1]=='H'))
- {
- s_indx->D.s_rangelist[HL-1][s_indx->D.s_rangelist[HL-1][0]+1]=0;
- strcpy(S_AutoHelpMsg,&s_indx->D.s_rangelist[HL-1][6]);
- }
-
- if ((s_indx->D.s_rangelist[HL-1][1]=='E')&&
- (s_indx->D.s_rangelist[HL-1][2]=='D'))
- if (s_indx->D.s_rangelist[HL-1][6]=='F')
- {
- S_Force_EditMask = 1;
- s_indx->D.s_rangelist[HL-1][s_indx->D.s_rangelist[HL-1][0]+1]=0;
- strcpy(S_EditMask,&s_indx->D.s_rangelist[HL-1][9]);
- }
- else
- {
- s_indx->D.s_rangelist[HL-1][s_indx->D.s_rangelist[HL-1][0]+1]=0;
- strcpy(S_EditMask,&s_indx->D.s_rangelist[HL-1][7]);
- }
-
- if ((s_indx->D.s_rangelist[HL-1][1]=='S')&&
- (s_indx->D.s_rangelist[HL-1][2]=='E'))
- {
- s_indx->D.s_rangelist[HL-1][s_indx->D.s_rangelist[HL-1][0]]=0;
- strcpy(S_InitialValue,&s_indx->D.s_rangelist[HL-1][6]);
- strcpy(workstr,S_InitialValue);
- if (strcmp(strupr(workstr),"SYSDATE")==0)
- {
- getdate(&S_Date);
- X=(int)S_Date.da_mon;
- itoa(X,&S_InitialValue[0],10);
- if (S_InitialValue[1]==0)
- {
- S_InitialValue[1]=S_InitialValue[0];
- S_InitialValue[0]='0';
- }
- S_InitialValue[2]='/';
- X=(int)S_Date.da_day;
- itoa(X,&S_InitialValue[3],10);
- if (S_InitialValue[4]==0)
- {
- S_InitialValue[4]=S_InitialValue[3];
- S_InitialValue[3]='0';
- }
- S_InitialValue[5]='/';
- X=(int)S_Date.da_year;
- itoa(X,&S_InitialValue[6],10);
- }
- }
- HR = s_indx->D.s_rangerec [HL-1];
- HL = s_indx->D.s_rangeline[HL-1];
- }
- }
-
-
- void S_EditString (int R, int C, int T, int L, int B,
- int F, int DB, int DF, int NB, int NF,
- int HR, int HL, char *S)
- {
- int x,y,z;
- static char S_CurString[160];
- double DoubleWork;
- long rec;
-
- if (S_FirstTime) S_Init();
- S_SetCursor(S_Cursor);
-
- if ((s_pos("0.000000",S)==0)||(s_pos(".000000",S)==0)) S[0]=0;
-
- S_Str_Pos = 1;
-
- strcpy(S_Ins_Str," ");
-
- S_Attrib = (B*16)+F;
-
- if ((S_Cursor==S_OFF)||(S_Cursor==S_INVERSEBOLD)||(S_Cursor==S_INVERSENORMAL))
- {
- if (S_Attrib > 16)
- S_Reverse = (F>0)? 15:F;
- else
- S_Reverse = (F==7)? 127:112+F;
- }
- else
- S_Reverse = S_Attrib;
-
- S_StLabelColor = S_SetColor(S_StLabelBg,S_StLabelFg);
- S_StColor = S_SetColor(S_StBg,S_StFg);
-
- strcpy(S_WorkStr,S_Blanks);
-
- x = 0;
-
- while (S[x]!=0) S_WorkStr[x]=S[x++];
- S_WorkStr[L]=0;
- S_Str_Pos = 1;
-
- if (S_PosLastChar)
- {
- S_Str_Pos = s_strlen(S)-1;
- if (S_Str_Pos < 0)
- S_Str_Pos = 1;
- else
- if (S_Str_Pos < L) S_Str_Pos++;
- }
-
- S_PosLastChar = 0;
-
- S_ResetKeyFlags();
-
- if (S_EditMask[0]!=0)
- {
- while (memchr(S_EditMaskTypes,S_EditMask[S_Str_Pos-1],6)==NULL)
- {
- S_WorkStr[S_Str_Pos-1] = S_EditMask[S_Str_Pos-1];
- if (S_LeftArrow) S_Str_Pos--; else S_Str_Pos++;
- }
- for (x=0;x<L;x++)
- if (memchr(S_EditMaskTypes,S_EditMask[x],6)==NULL)
- S_WorkStr[x] = S_EditMask[x];
- }
-
- while ((!S_Enter)&&(!S_Tab)&&(!S_Esc)&&(!S_Fkey))
- {
- setmem(S_CurString,160,0);
- S_CurString[0]=32;
- S_CurString[1]=S_Attrib;
- x = 0;
- y = 0;
- while (x<L)
- {
- y = (x*2)+2;
- S_CurString[y] =S_WorkStr[x];
- S_CurString[y+1] =S_Attrib;
- x++;
- }
- y = (x*2)+2;
- S_CurString[y] =32;
- S_CurString[y+1]=S_Attrib;
-
- if (S_EditMask[0]>0)
- {
- while (memchr(S_EditMaskTypes,S_EditMask[S_Str_Pos-1],6)==NULL)
- {
- S_WorkStr[S_Str_Pos-1] = S_EditMask[S_Str_Pos-1];
- if (S_LeftArrow) S_Str_Pos--; else S_Str_Pos++;
- }
- }
-
- S_CurString[(S_Str_Pos*2)+1]=S_Reverse;
- puttext(C,R,C+(L+1),R,(char *)&S_CurString);
- gotoxy((C+S_Str_Pos),R);
-
- S_GetKey();
-
- S_CurString[(S_Str_Pos*2)+1]=S_Attrib;
-
- puttext(C,R,C+(L+1),R,(char *)&S_CurString);
-
- if (S_Ins)
- {
- S_Ins = 0;
- S_Fkey = 0;
- continue;
- }
-
- if ((!S_Ctrl)&&(!S_Alt))
- {
- if ((S_Left)||(S_BkSp))
- {
- if (S_Str_Pos > 1)
- {
- S_Str_Pos--;
- if (S_BkSp) S_Del = 1;
- }
- else
- {
- if (S_Left)
- {
- S_Shift = 1;
- S_Tab = 1;
- S_PosLastChar = 1;
- }
- }
- S_Left = 0;
- S_BkSp = 0;
- S_Fkey = 0;
- if (!S_Del) continue;
- }
-
- if (S_Right)
- {
- if (S_Str_Pos < L)
- {
- if (T>7) S_Str_Pos++;
- else
- {
- if (S_Str_Pos==(s_strlen(S_WorkStr)+1)) S_Tab = 1;
- else S_Str_Pos++;
- }
- }
- else
- S_Tab = 1;
- S_Shift = 0;
- S_Right = 0;
- S_Fkey = 0;
- continue;
- }
-
- if (S_Del)
- {
- if (s_strlen(S_WorkStr)>-1)
- {
- if (S_Shift)
- {
- setmem(&S_WorkStr[S_Str_Pos-1],(L-S_Str_Pos)+1,32);
- if (S_EditMask[0]>0)
- {
- for (x=S_Str_Pos-1;x<L;x++)
- {
- if (memchr(S_EditMaskTypes,S_EditMask[x],6)==NULL)
- S_WorkStr[x] = S_EditMask[x];
- }
- }
- }
- else
- {
- if ((S_Str_Pos<L)&&(S_EditMask[0]))
- {
- x = S_Str_Pos;
- z = x-1;
- while (x < L)
- {
- if (memchr(S_EditMaskTypes,S_EditMask[x],6)!=NULL)
- {
- if (S_EditMask[x] != S_EditMask[z])
- {
- S_WorkStr[z] = 32;
- x = L;
- }
- else
- {
- S_WorkStr[z] = S_WorkStr[x];
- z++;
- while (memchr(S_EditMaskTypes,S_EditMask[z],6)==NULL) z++;
- }
- }
- x++;
- if (x >= L) S_WorkStr[z] = 32;
- }
- }
- else
- {
- s_delete(S_WorkStr,(S_Str_Pos-1),1);
- strcat(S_WorkStr," ");
- }
- }
- }
- S_Fkey = 0;
- continue;
- }
-
- if ((S_Str_Pos==1)&&(S_Ch=='?'))
- {
- S_QuickHelp = 1;
- S_PreEdit(HR,HL);
- S_QuickHelp = 0;
- if (S_AutoHelpMsg[0]==0)
- strcpy(S_AutoHelpMsg," No HELP available for this field. ");
- S_Ch = 0;
- }
-
-
- if ((S_Ch > 31)&&(S_Ch < 128))
- {
- if (T<8)
- {
- if (((S_Ch=='-')&&(S_Str_Pos>1))||
- ((S_Ch=='.')&&(T==0))||
- ((S_Ch!='.')&&(S_Ch!='-')&&((S_Ch<'0')||(S_Ch>'9'))))
- S_Ch = 0;
- }
-
- if (T==8)
- {
- if (((S_Ch<'A')||(S_Ch>'Z'))&&((S_Ch<'a')||(S_Ch>'z')))
- {
- if (S_EditMask[0]>0)
- {
- if ((S_EditMask[S_Str_Pos-1]=='@')||
- (S_EditMask[S_Str_Pos-1]=='2'))
- {
- S_Ch = 0;
- strcpy(S_ErrorMsg," Only a value of 'A' thru 'z' or 'A' thru 'Z' is acceptable here.");
- }
- }
- else
- if (S_Ch!=32) S_Ch = 0;
- }
- }
-
- if ((T==9)&&(S_EditMask[0]>0))
- {
- if ((S_EditMask[S_Str_Pos-1]=='@')||(S_EditMask[S_Str_Pos-1]=='2'))
- {
- if (((S_Ch<'A')||(S_Ch>'Z'))&&((S_Ch<'a')||(S_Ch>'z')))
- {
- strcpy(S_ErrorMsg," Only a value of 'a' thru 'z' or 'A' thur 'Z' is acceptable here. ");
- S_Ch =0;
- }
- }
- if ((S_EditMask[S_Str_Pos-1]=='#')||(S_EditMask[S_Str_Pos-1]=='3'))
- {
- if (!isdigit(S_Ch))
- {
- strcpy(S_ErrorMsg," Only a value of '0' thru '9' is acceptable here. ");
- S_Ch=0;
- }
- }
- }
-
- if (S_Ch>0)
- {
- if (S_InsertMode)
- {
- if (S_Str_Pos <= L)
- {
- if ((S_Str_Pos <= L)&&(S_EditMask[0]>0))
- {
- y = 0;
- x = S_Str_Pos-1;
- z = x;
- while (((memchr(S_EditMaskTypes,S_EditMask[x],6)==NULL)||
- (S_EditMask[x]==S_EditMask[z]))&&(x < L)) x++;
- y = x-1;
- while (!(y<S_Str_Pos-1))
- {
- if (memchr(S_EditMaskTypes,S_EditMask[y],6)==NULL) y--;
- else
- if ((S_EditMask[z]!=S_EditMask[x])||
- (memchr(S_EditMaskTypes,S_EditMask[x],6)==NULL))
- {x--;y=x-1;}
- else
- {
- S_WorkStr[x]=S_WorkStr[y];
- x--;
- y--;
- }
- }
- S_WorkStr[S_Str_Pos-1] = S_Ch;
- }
- else
- {
- S_Ins_Str[0]=S_Ch;
- S_Ins_Str[1]=0;
- s_insert(S_WorkStr,S_Ins_Str,(S_Str_Pos-1),L);
- S_WorkStr[L]=0;
- }
- if (S_Str_Pos < L) S_Str_Pos++;
- else
- {
- S_Tab =1;
- S_Shift=0;
- }
- }
- }
- else
- {
- S_WorkStr[S_Str_Pos-1]=S_Ch;
- if (S_Str_Pos < L) S_Str_Pos++;
- else
- {
- S_Tab =1;
- S_Shift=0;
- }
- }
- }
- }
-
- if ((!S_Enter)&&(S_Tab))
- {
- if ((S_Shift)&&(S_Str_Pos>1))
- {
- x=S_Str_Pos-2;
- S_Str_Pos=1;
- if ((x>0)&&(S_EditMask[0]>0))
- {
- if (memchr(S_EditMaskTypes,S_EditMask[x],6)!=NULL)
- while ((x>0)&&(memchr(S_EditMaskTypes,S_EditMask[x],6)!=NULL))x--;
- while (memchr(S_EditMaskTypes,S_EditMask[x],6)==NULL) x--;
- while ((x>0)&&(memchr(S_EditMaskTypes,S_EditMask[x],6)!=NULL))x--;
- S_Str_Pos = x+1;
- }
- S_Tab=0;
- S_Fkey=0;
- }
- if ((!S_Shift)&&(S_Str_Pos<L))
- {
- if (S_EditMask[0]>0)
- {
- x = S_Str_Pos;
- while ((x<L)&&(memchr(S_EditMaskTypes,S_EditMask[x],6)!=NULL))x++;
- while ((x<L)&&(memchr(S_EditMaskTypes,S_EditMask[x],6)==NULL))x++;
- if (x<L) {S_Str_Pos = x+1;S_Tab=0;S_Fkey=0;}
- }
- }
- }
-
- if (S_Force_EditMask)
- {
- if ((S_Enter)||(S_Tab))
- {
- x = -1;
- while (x < L)
- {
- x++;
- if ((!(memchr(S_EditMaskTypes,S_EditMask[x],4)==NULL))&&
- (S_WorkStr[x]==32))
- {
- S_Str_Pos = x;
- strcpy(S_ErrorMsg,"'");
- S_ErrorMsg[0]=39;
- S_ErrorMsg[1]=S_Ch;
- S_ErrorMsg[2]=0;
- strcat(S_ErrorMsg,"' does not fit edit mask ");
- strcat(S_ErrorMsg,S_EditMask);
- S_Enter= 0;
- S_Tab = 0;
- S_Fkey = 0;
- x = L;
- }
- }
- }
- }
- }
- }
-
- S_SetCursor(S_OFF);
- strcpy(S_EditStr,S_WorkStr);
- if (s_strlen(S_WorkStr)>-1) S_EditStr[s_strlen(S_WorkStr)-1]=0;
- if (T<8)
- {
- y=strlen(S_EditStr);
- while ((y>0)&&(S_EditStr[y-1]<33))
- {
- S_EditStr[y-1]=0;
- y--;
- }
-
- if (strchr(S_EditStr,'.')==NULL) strcat(S_EditStr,".000000");
- else strcat(S_EditStr,"000000");
-
- S_EditStr[s_pos(S_EditStr,".")+T]=0;
- S_Str_Pos = (S_EditStr[0]=='-')?1:0;
- while ((S_EditStr[0]==32)||(strlen(S_EditStr)>L))
- s_delete(S_EditStr,S_Str_Pos,1);
- if (strcmp("-",S_EditStr)==0) S_EditStr[0]=0;
- if (S_EditStr[0]==0)
- {
- S_EditStr[0]='0';
- S_EditStr[1]=0;
- }
- }
- if (S_EditMask[0]>0)
- {
- y=0;
- for (x=0;((x<L)&&(y==0));x++)
- {
- if ((S_EditStr[x]>32)&&(memchr(S_EditMaskTypes,S_EditMask[x],6)!=NULL))
- y++;
- }
- if (y==0) setmem(S_EditStr,L,0);
- }
- else
- {
- x = L-1;
- while ((x>-1)&&(S_EditStr[x]<33)) S_EditStr[x--]=0;
- }
- setmem(S_AutoHelpMsg,81,0);
- setmem(S_EditMask,81,0);
- movmem(S_EditStr,S_NewStr,L+1);
- movmem(S_EditStr,S,L+1);
- S_DisplayScreenField(R,C,T,L,strlen(S_NewStr),DF,DB,NF,NB,S_NewStr);
- movmem(S_NewStr,S_EditStr,L+1);
- }
-
-
- unsigned char S_SetDisplayOn(int X)
- {
- int Y,Z;
- if (X < 0) return 4;
- else
- {
- Y=0;
- for (Z=0;Z<s_curr.s_count;Z++)
- if ((s_field->C.s_type[Z] >= 0)&&(s_field->C.s_type[Z] <= 9)) Y++;
- if (Y==0) return 1;
- else
- if (X>s_curr.s_count) return 2;
- else
- if (s_field->C.s_type[X] > 19) return 3;
- else
- if (s_field->C.s_type[X] < 20)
- {
- s_field->C.s_type[X] += 90;
- return 0;
- }
- }
- }
-
-
-
-
- unsigned char S_SetDisplayOff(int X)
- {
- if (X < 0) return 4;
- else
- if (X>s_curr.s_count) return 1;
- else
- if (s_field->C.s_type[X] < 20) return 3;
- else
- if (s_field->C.s_type[X] > 19)
- {
- s_field->C.s_type[X] -= 90;
- return 0;
- }
- }
-
-
-
-
- unsigned char S_IsDupe(int S_Index)
- {
- if (((S_Index > -1)&&(S_Index < s_curr.s_count))&&
- (((s_field->C.s_type[S_Index]>=10) &&(s_field->C.s_type[S_Index]<=19))||
- ((s_field->C.s_type[S_Index]>=100)&&(s_field->C.s_type[S_Index]<=109))))
- return 1;
- else
- return 0;
- }
-
-
-
-
- unsigned char S_SetDupe(int S_Index)
- {
- int X,Y;
- Y = 0;
- S_SetDupeFields = 0;
- for (X=0;X<s_curr.s_count;X++)
- if ((s_field->C.s_type[X] >= 0)&&(s_field->C.s_type[X] <= 9)) Y++;
-
- if ((!((S_Index > -1)&&(S_Index < s_curr.s_count)))||
- (((s_field->C.s_type[S_Index]>=10) &&(s_field->C.s_type[S_Index]<=19))||
- ((s_field->C.s_type[S_Index]>=100)&&(s_field->C.s_type[S_Index]<=109))))
- return 0;
- else
- {
- if ((Y > 1)||(s_field->C.s_type[S_Index]>9))
- {
- s_field->C.s_type[S_Index] +=10;
- if (s_field->C.s_type[S_Index] < 20) S_SetDupeFields = 1;
- return 1;
- }
- else
- {
- strcpy(S_ErrorMsg,"At least one field must remain a data entry field.");
- return 0;
- }
- }
- }
-
-
-
-
- void S_ReSetDupe(int S_Index)
- {
- if (((S_Index > -1)&&(S_Index <s_curr.s_count))||
- (((s_field->C.s_type[S_Index]>=10) &&(s_field->C.s_type[S_Index]<=19))||
- ((s_field->C.s_type[S_Index]>=100)&&(s_field->C.s_type[S_Index]<=109))))
- s_field->C.s_type[S_Index]-=10;
- }
-
-
-
-
- void S_ClearDupes()
- {
- int S_Index;
- S_Index = 0;
- while (S_Index < s_curr.s_count)
- {
- if (((s_field->C.s_type[S_Index]>=10) &&(s_field->C.s_type[S_Index]<=19))||
- ((s_field->C.s_type[S_Index]>=100)&&(s_field->C.s_type[S_Index]<=109)))
- S_SetDupe(S_Index);
- S_Index++;
- }
- }
-
-
-
-
- void S_ClearScreen(int Initialize)
- {
- int X;
- double *RealWork, WorkVal;
- setmem(S_WorkStr,81,0);
- S_InitialValue[0]=0;
- for (X=0;X<s_curr.s_count;X++)
- {
- S_GetFieldType(s_field->C.s_type[X]);
- if (Initialize)
- S_PreEdit(
- s_field->C.s_rangenextrec[X],
- s_field->C.s_rangenextline[X]);
- if (!S_DupType)
- {
- if (S_FType < 8)
- {
- WorkVal = atof(S_InitialValue);
- RealWork = (double *)(S_WorkArea+S_FieldPtr[X]);
- *RealWork= WorkVal;
- }
- else
- {
- setmem(S_WorkArea+S_FieldPtr[X],s_field->C.s_len[X]+1,0);
- strcpy((char *)S_WorkArea+S_FieldPtr[X],S_InitialValue);
- }
- }
- }
- }
-
-
-
-
-
-
- void S_RefreshScreen()
- {
- if (S_Delayed) S_Delayed = 0;
- if (S_FastVideo)
- movmem((void *)&s_record->B.s_video[0],(void *)S_VideoMem,4000);
- else
- puttext(1,1,80,24,&s_record->B.s_video[0]);
- S_FillScreen();
- }
-
-
-
-
- #ifdef COLORCHANGE
- unsigned char S_ChangeScreenColor(
- int Control,
- int Bg,
- int Fg,
- int StartRow,
- int EndRow,
- int StartCol,
- int EndCol)
- {
- unsigned char Row, Col, Ch, Color;
- int F,P;
-
- if (Control > 4) return 1;
- else
- if (Bg>7) return 2;
- else
- if (Fg>30) return 3;
- else
- if ((StartRow < 1)||(StartRow>24)) return 4;
- else
- if ((EndRow<StartRow)||(EndRow>24)) return 5;
- else
- if ((StartCol < 1)||(StartCol>80)) return 6;
- else
- if ((EndCol<StartCol)||(EndCol>80)) return 7;
- else
- {
- F=0;
- Row=StartRow;
- Col=StartCol;
- Color = S_SetColor(Bg,Fg);
-
- while ((F<s_curr.s_count)&&(s_field->C.s_row[F] < Row)) F++;
-
- while ((F<s_curr.s_count)&&
- ((s_field->C.s_col[F])+(s_field->C.s_len[F]+1))<Col) F++;
-
- if (!(F<s_curr.s_count)) F=-1;
-
- do
- {
- if (F>-1)
- {
- while(
- (F>-1)&&
- (Row==s_field->C.s_row[F])&&
- (Col>((s_field->C.s_col[F])+(s_field->C.s_len[F]+1))))
- {
- F =(F<s_curr.s_count) ? F+1:-1;
- }
- while(
- (F>-1)&&
- (Row>=s_field->C.s_row[F])&&
- (Col>=s_field->C.s_col[F])&&
- (Col<=((s_field->C.s_col[F])+(s_field->C.s_len[F]+1))))
- {
-
- Col = ((s_field->C.s_col[F])+(s_field->C.s_len[F]+2));
- F++;
-
- if (Col>EndCol) {Row++; Col=StartCol;}
-
- if (Row>s_field->C.s_row[F])
- while ((F<s_curr.s_count)&&(Row>s_field->C.s_row[F])) F++;
-
- while((Row==s_field->C.s_row[F])&&
- (StartCol>((s_field->C.s_col[F])+(s_field->C.s_len[F]+1)))) F++;
- if (!(F<s_curr.s_count)) F=-1;
- }
- }
- if ((Row <= EndRow)&&(Col <=EndCol))
- {
- P=((Row-1)*160)+((Col-1)*2)+1;
- Ch= s_record->B.s_video[P-1];
- switch (Control)
- {
- case 0 :/* Text */
- {s_record->B.s_video[P]=Color;break;}
- case 1 :/* Single Line */
- {
- switch (Ch)
- {
- case 179:
- case 180:
- case 191:
- case 192:
- case 193:
- case 194:
- case 195:
- case 196:
- case 197:
- case 217:
- case 218:{s_record->B.s_video[P]=Color;break;}
- }
- break;
- }
- case 2 :/* Double Lines */
- {
- switch (Ch)
- {
- case 181:
- case 182:
- case 183:
- case 184:
- case 185:
- case 186:
- case 187:
- case 188:
- case 189:
- case 190:
- case 198:
- case 199:
- case 200:
- case 201:
- case 202:
- case 203:
- case 204:
- case 205:
- case 206:
- case 207:
- case 208:
- case 209:
- case 210:
- case 211:
- case 212:
- case 213:
- case 214:
- case 215:
- case 216:{s_record->B.s_video[P]=Color;break;}
- }
- break;
- }
- case 3 :/* Bold Chars */
- {
- switch (Ch)
- {
- case 219:
- case 220:
- case 221:
- case 222:
- case 223:{s_record->B.s_video[P]=Color;break;}
- }
- break;
- }
- }
- }
- Col++;
- if (Col>EndCol) {Row++;Col=StartCol;}
- }
- while (Row<=EndRow);
- }
- }
-
-
-
-
-
- unsigned char S_ChangeFieldColor(
- int Field,
- int set,
- int Bg,
- int Fg)
- {
- if (Field>s_curr.s_count) return 1;
- else
- if (set>2) return 2;
- else
- if (Bg>7) return 3;
- else
- if (Fg>30) return 4;
- else
- {
- switch (set)
- {
- case 0 :
- {s_field->C.s_normalbg[Field]=Bg;
- s_field->C.s_normalfg[Field]=Fg;
- break;}
- case 1 :
- {s_field->C.s_promptbg[Field]=Bg;
- s_field->C.s_promptfg[Field]=Fg;
- break;}
- case 2 :
- {s_field->C.s_displaybg[Field]=Bg;
- s_field->C.s_displayfg[Field]=Fg;
- break;}
- }
- }
- }
-
-
-
-
- void S_StoreColorChanges()
- {
- char hold[16];
- int A,B,C,X,Y,Z;
- int RR;
- long rec;
-
- if (s_curr.s_fieldsrecno)
- {
- S_FirstField = (s_curr.s_first)-1;
- S_Point = 0;
- for (X=0;X<s_curr.s_count;X++)
- {
- Z = ((s_field->C.s_col[X])-1)*2;
- A = (s_field->C.s_col[X]+s_field->C.s_len[X])*2;
- B = (s_field->C.s_row[X]-1)*160;
- s_record->B.s_video[B+Z]='[';
- s_record->B.s_video[B+A]=']';
- C = 0;
- Z = s_field->C.s_col[X]*2;
- while (C<15)
- {
- if (s_field->C.s_fieldname[X][C] > 32)
- {
- s_record->B.s_video[B+Z] = s_field->C.s_fieldname[X][C];
- }
- else
- C=99;
- Z+=2;
- C++;
- }
- movmem(&s_field->C.s_fieldname[X][0],hold,16);
- movmem(hold,&s_field->C.s_fieldname[X][1],16);
- s_field->C.s_fieldname[X][0]=0;
- Z = 1;
- while (Z<17)
- {
- if (s_field->C.s_fieldname[X][Z]>32)
- {
- s_field->C.s_fieldname[X][0]++;
- Z++;
- }
- else
- Z=99;
- }
- }
- rec = (s_curr.s_fieldsrecno)*sizeof(*s_record);
- C=fseek(s_file,rec,0);
- C=fwrite((void *)s_field,sizeof(*s_field),1,s_file);
- }
- rec = (s_curr.s_recordnumber)*sizeof(*s_record);
- C=fseek(s_file,rec,0);
- C=fwrite((void *)s_record,sizeof(*s_record),1,s_file);
- S_LoadScreen(s_curr.s_name);
- }
- #endif
-
-
-
- #ifdef VALIDATE
- #include "Validate.C"
- #endif
-
-
-
-
- void S_NextKey()
- {
- if (S_FirstTime) S_Init();
- S_ErrorMsg[0]=0;
- S_UserMsg[0]=0;
- S_AutoHelpMsg[0]=0;
- S_Wait=1;
- S_GetKey();
- }
-
-
-
-
- void S_ReadKey()
- {
- if (S_FirstTime) S_Init();
- if (S_Delayed) S_RefreshScreen();
- if (s_curr.s_count > 0) S_FillScreen();
- S_StLabelColor = S_SetColor(S_StLabelBg,S_StLabelFg);
- S_StColor = S_SetColor(S_StBg,S_StFg);
- S_GetKey();
- }
-
-
-
-
- void S_ReadField()
- {
- double *Dbl;
- int x,y;
- if (S_FirstTime) S_Init();
- if (S_Delayed) S_RefreshScreen();
- if (s_curr.s_count > 0) S_FillScreen();
- if ((S_Point < 0)||(S_Point > s_curr.s_count))
- {
- strcpy(S_ErrorMsg," Field number in S_Point is out of range ");
- S_ReadKey();
- goto Exit_Proc;
- }
-
- if ((s_field->C.s_type[S_Point]>89)&&(s_field->C.s_type[S_Point]<110))
- {
- strcpy(S_ErrorMsg," Cannot read a DISPLAY only field - Any key to continue ");
- S_ReadKey();
- goto Exit_Proc;
- }
-
- if ((s_field->C.s_type[S_Point]>9)&&(s_field->C.s_type[S_Point]<20))
- {
- if (!S_SetDupeFields)
- {
- strcpy(S_ErrorMsg," Invalid access of dupe (repeating) field - Any key to Continue");
- S_ReadKey();
- goto Exit_Proc;
- }
- };
- if (S_SetDupeFields) S_SetDupeFields = 0;
-
- S_PrevField = S_Point;
- S_ScreenValid = 0;
- S_ResetKeyFlags();
-
-
- #ifdef MOUSE
- while ((!S_Ms->MouseEvent)&&(!S_ScreenValid)&&(!S_Fkey))
- #else
- while ((!S_ScreenValid)&&(!S_Fkey))
- #endif
- {
- S_Get_Field_Value(S_Point);
- S_GetFieldType(s_field->C.s_type[S_Point]);
-
- #ifdef MOUSE
- while ((!S_Ms->MouseEvent)&&(!S_Enter)&&(S_PrevField == S_Point)&&(!S_Fkey))
- #else
- while ((!S_Enter)&&(S_PrevField == S_Point)&&(!S_Fkey))
- #endif
- {
- S_PreEdit(
- s_field->C.s_rangenextrec[S_Point],
- s_field->C.s_rangenextline[S_Point]);
- S_EditString(
- s_field->C.s_row[S_Point],
- s_field->C.s_col[S_Point],
- S_FType,
- s_field->C.s_len[S_Point],
- s_field->C.s_promptbg[S_Point],
- s_field->C.s_promptfg[S_Point],
- s_field->C.s_displaybg[S_Point],
- s_field->C.s_displayfg[S_Point],
- s_field->C.s_normalbg[S_Point],
- s_field->C.s_normalfg[S_Point],
- s_field->C.s_rangenextrec[S_Point],
- s_field->C.s_rangenextline[S_Point],
- S_EditStr);
-
- s_field->C.s_datalen[S_Point] = strlen(S_EditStr);
-
- if (S_FType<8)
- {
- x=0;
- y=0;
- while (S_EditStr[x]!=0) if (S_EditStr[x++]=='.') {y=1;break;};
- if (y==0)
- strcat(S_EditStr,".0 ");
- else
- strcat(S_EditStr,"0 ");
- Dbl = (double *)(S_WorkArea+S_FieldPtr[S_Point]);
- *Dbl=atof(S_EditStr);
- }
- else
- {
- y=strlen(S_EditStr);
- while ((y>0)&&(S_EditStr[y-1]<33))
- {
- S_EditStr[y-1]=0;
- y--;
- }
- strcpy((char *)S_WorkArea+S_FieldPtr[S_Point],S_EditStr);
- }
- if (S_Tab) S_Fkey = 1;
- }
-
- S_Point = S_PrevField;
-
- if ((S_Tab)||(S_Enter)||(S_LeftArrow)||(S_RightArrow))
- {
- #ifdef VALIDATE
- if (s_field->C.s_rangenextrec[S_Point]>0)
- {
- S_ValidateField = S_Point;
- S_ValidateScreen();
- S_ValidateField = 0;
- S_PrevField = S_Point;
- if (!S_ScreenValid) S_ResetKeyFlags();
- }
- else
- #endif
- if ((strlen(S_EditStr) > s_field->C.s_len[S_Point])||(S_Enter))
- S_ScreenValid = 1;
- }
- }
- Exit_Proc:
- delay(0);
- }
-
-
-
-
- void S_ReadScreen()
- {
- int x,y;
- double *Dbl;
- if (S_FirstTime) S_Init();
- if (S_Delayed) S_RefreshScreen();
- switch (s_curr.s_compiledind)
- {
- case 1 :
- {S_ReadKey();break;}
- case 2 :
- {S_ReadKey();break;}
- case 3 :
- {
- S_ScreenValid = 0;
- S_ValidateField = -1;
- do
- {
- S_FillScreen();
-
- if (S_Point < 0) S_PrevField = 9999;
- S_Direction = 1;
-
- if ((S_Point > s_curr.s_count)||(S_Point < 0))
- S_Point = s_curr.s_count-1;
- else
- S_PrevField = S_Point;
-
- do
- {
- if ((s_field->C.s_type[S_Point]>19)||
- ((!S_SetDupeFields)&&(s_field->C.s_type[S_Point] > 9)))
- {
- S_PrevField = -1;
- do
- {
- S_Point = (S_Direction > 0) ?
- s_field->C.s_next[S_Point]-1 : s_field->C.s_prev[S_Point]-1;
- S_GetFieldType(s_field->C.s_type[S_Point]);
- if ((S_EntryType)||
- ((!S_DispType)&&((S_DupType)&&(S_Direction== -1))))
- S_PrevField = S_Point;
- }
- while (S_PrevField == -1);
- }
- else
- S_SetDupeFields = 0;
-
- S_PrevField = S_Point;
- S_Get_Field_Value(S_Point);
-
- S_Direction = 1;
- S_PreEdit(
- s_field->C.s_rangenextrec[S_Point],
- s_field->C.s_rangenextline[S_Point]);
- S_EditString(
- s_field->C.s_row[S_Point],
- s_field->C.s_col[S_Point],
- S_FType,
- s_field->C.s_len[S_Point],
- s_field->C.s_promptbg[S_Point],
- s_field->C.s_promptfg[S_Point],
- s_field->C.s_displaybg[S_Point],
- s_field->C.s_displayfg[S_Point],
- s_field->C.s_normalbg[S_Point],
- s_field->C.s_normalfg[S_Point],
- s_field->C.s_rangenextrec[S_Point],
- s_field->C.s_rangenextline[S_Point],
- S_EditStr);
-
- s_field->C.s_datalen[S_Point] = strlen(S_EditStr);
-
- if (S_FType < 8)
- {
- x=0;
- y=0;
- while (S_EditStr[x]!=0) if (S_EditStr[x++]=='.') {y=1;break;};
- if (y==0)
- strcat(S_EditStr,".0 ");
- else
- strcat(S_EditStr,"0 ");
- Dbl = (double *)(S_WorkArea+S_FieldPtr[S_Point]);
- *Dbl=atof(S_EditStr);
- }
- else
- {
- y=strlen(S_EditStr);
- while ((y>0)&&(S_EditStr[y-1]<33))
- {
- S_EditStr[y-1]=0;
- y--;
- }
- strcpy((char *)S_WorkArea+S_FieldPtr[S_Point],S_EditStr);
- }
-
- if ((S_AutoValidate)&&(!S_Enter))
- {
- if (s_field->C.s_rangenextrec[S_Point] > 0)
- {
- S_ValidateField = S_Point;
- S_ValidateScreen();
- S_ValidateField = 0;
- if (!S_ScreenValid)
- {
- S_Tab = 0;
- S_Enter = 0;
- }
- }
- }
-
- if (S_Tab)
- {
- S_Direction = (S_Shift) ? -1:1;
- S_Point = (S_Direction > 0)
- ? (s_field->C.s_next[S_Point]-1): (s_field->C.s_prev[S_Point]-1);
- if ((S_Shift)&&
- (s_field->C.s_type[S_Point]>9)&&
- (s_field->C.s_type[S_Point]<20)) S_SetDupeFields = 1;
- S_Fkey = 0;
- S_Shift = 0;
- }
- }
- #ifdef MOUSE
- while ((!S_Ms->MouseEvent) && (!S_Enter) && (!S_Fkey));
- #else
- while ((!S_Enter) && (!S_Fkey));
- #endif
-
- #ifdef VALIDATE
- if (S_Enter)
- {
- S_ValidateScreen();
- if (!S_ScreenValid) S_Fkey = 0;
- }
- else
- #endif
- S_ScreenValid = 1;
- }
- #ifdef MOUSE
- while ((!S_Ms->MouseEvent) && (!S_ScreenValid) && (!S_Fkey));
- #else
- while ((!S_ScreenValid) && (!S_Fkey));
- #endif
- }
- }
- }