/* numget.c -- (part of efr) Copyright © 1989 by William F. Hammond */ /* -- get user's number from custom window, providing on */ /* the spot rejection of invalid input */ #ifndef TDM_H #include "tdm.h" #endif /*********************************************************************/ LONG numget(gstr) UBYTE *gstr; { struct IntuiMessage *msg; LONG lskip; /* that which is returned */ UBYTE signflag, zeroflag; UBYTE chx, holdskip[HSL + 1]; ULONG flags; LONG firstx, lastx; int gsl; SHORT jdir, kdir; zeroflag = NULB; gsl = strlen(gstr); savestyle = SetSoftStyle(rp, (ULONG)FS_NORMAL, enable); SetDrMd(rp,(LONG)(JAM2)); Move(rp, 0L, (LONG)maxrowpix); ClearScreen(rp); Text(rp, gstr, (LONG)gsl); jdir = 0; firstx = (LONG)rp->cp_x; lastx = (LONG)rp->cp_x; flags = VANILLAKEY; holdskip[0] = '1'; /* 1 is the default return */ signflag = NULB; while(1) { Wait(1L << mw->UserPort->mp_SigBit); while(msg = (struct IntuiMessage *)GetMsg(mw->UserPort)) { if(msg->Class == VANILLAKEY) chx = (UBYTE)msg->Code; ReplyMsg(msg); } if ( (chx == 0x0a) || (chx == 0x0d) )break; else if (jdir >= HSL) { zeroflag = ONEB; break; } else if (chx == 0x08) { Move(rp, firstx, (LONG)maxrowpix); ClearScreen(rp); if (jdir > 0) jdir --; for (kdir = 0; kdir < jdir; kdir ++) { Text(rp, &holdskip[kdir], 1L); } lastx = (LONG)rp->cp_x; } else if( (chx == '-') && (jdir == 0) ) { signflag = ONEB; Text(rp, &chx, 1L); lastx = (LONG)rp->cp_x; } else if( (chx < '0') || (chx > '9') ) { DisplayBeep(mw->WScreen); Move(rp, lastx, (LONG)maxrowpix); ClearScreen(rp); } else { holdskip[jdir] = chx; jdir ++; Text(rp, &chx, 1L); lastx = (LONG)rp->cp_x; } } lskip = 0L; kdir = 0; if(zeroflag) jdir = 0; while(kdir < jdir) { lskip = 10L * lskip + (LONG)(holdskip[kdir] - '0'); kdir ++; } if(signflag) lskip = -lskip; /*if(lskip == 0L) lskip = numget(gstr);*/ Move(rp, 0L, (LONG)maxrowpix); ClearScreen(rp); return lskip; }