/* ** The Window BOSS's Data Clerk ** Copyright (c) 1988 - Philip A. Mongelluzzo ** All rights reserved. ** ** wn_gfloat - get float from window with validation ** ** Copyright (c) 1988 - Philip A. Mongelluzzo ** All rights reserved. ** */ #include "windows.h" /* standard stuff */ /* ************* * wn_gfloat * ************* */ /* ** wn_gfloat(fun,frm,fld,wn,row,col,prmpt,atrib,fill,v,fwidth,ndec,low,high,ubuff,hlpmsg,errmsg) ** ** int fun - fucntion code (SET || XEQ) ** (WIFORM) frm - form pointer (actual || NFRM) ** int fld - field # in form (actual || NFLD) ** (WINDOWPTR) wn - window pointer ** int row - row in window where data input begins ** int col - col in window where data input begins ** (char *) prmpt - field promt (call with NSTR for none) ** unsigned atrib - field (not prompt) atributes ** char fill - field fill character ** (float *) v - pointer to float for return value (low-high) ** int fwidth - width of mask (maximum # of digits is 20 with sign) ** int ndec - # of decimal places ** float low - minimum value (lower limit of value) ** float high - maximum value (upper limit of value) ** (char *) ubuff - pointer to char array of fwidth+2 bytes for editing ** (char *)hlpmsg - pointer to help message (call with NSTR for none) ** (char *)errmsg - pointer to err message (call with NSTR) for none) ** ** RETURNS: ** ** V via pointer. ** ** NULL if error, else the non zero value returned from wn_input. ** ** NOTES: ** ** FUN - fun can only be SET for form setup, or XEQ for immediate ** execution. When called with SET, valid arguements for both ** "frm" and "fld" must be specfied. frm is the field pointer ** returned from frmopn(), and fld is the field sequence number ** in the form for this field. When called with XEQ frm must ** be NFRM and fld must NFLD. ** ** UBUFF - Editing buffer. Must be of sufficent size to hold the ** data as it is entered. Typical value is the length ** of the mask + 2 bytes (strlen(mask)+2). ** ** On entry, the first byte of ubuff should be ** a null, otherwise wn_input assumes there is valid ** data there and will enter edit mode. This can be ** handy if there is a need for prefilled but editable ** fields. In actual pratice, wn_input uses this ** buffer for both initial character data entry and ** subsequent editing. ** ** On return, ubuff contains the actual data entered in ** character format with fill and mask characters as ** spaces (e.g. "-1240.20"). ** ** Calls wn_input to perform data entry. ** ** Data must satisfy validation checks for function to return. ** ** Calls wn_iemsg(errmsg) when vaildation fails. */ /* ************* * wn_gfloat * ************* */ wn_gfloat(fun,frm,fld,wn,row,col,prmpt,atrib,fill,value,fwidth,ndec,low,high,ubuff,hlpmsg,errmsg) int fun; /* SET or XEQ */ WIFORM frm; /* form pointer or NFRM */ int fld; /* field number or NFLD */ WINDOWPTR wn; /* window to use */ int row, col; /* position of input field */ char *prmpt; /* prompt string */ unsigned atrib; /* data entry atribute */ char fill; /* fill char */ float *value; /* the float */ #if DLC | BORLAND | LC3 double low, high; /* limits: low & high */ #else float low, high; /* limits: low & high */ #endif int fwidth; /* field width */ int ndec; /* # of decimal places */ char *ubuff; /* returns "value" */ char *hlpmsg, *errmsg; /* help and error messages */ { double v; /* temp value */ char mask[25]; /* long precision */ unsigned r; /* sscanf return value */ int rv; /* return value */ if(fun != SET && fun != XEQ) /* saftey check */ return(NULL); if(fun == SET) { /* set up */ if(frm[fld]->pself != (char *)frm[fld]) wns_ierr("wn_gfloat"); /* die if memory is mangled */ frm[fld]->wn = wn; /* set window */ frm[fld]->row = row; /* set row */ frm[fld]->col = col; /* set col */ frm[fld]->prmpt = prmpt; /* set prompt */ frm[fld]->atrib = atrib; /* set attribute */ frm[fld]->fill = fill; /* set fill character */ frm[fld]->fcode = GFLOAT; /* function code */ frm[fld]->v1.vfp = value; /* &value */ frm[fld]->v2.vi = fwidth; /* fwidth */ frm[fld]->v3.vi = ndec; /* # of decimal places */ #if DLC frm[fld]->v4.vf = (float)low; /* lower limit */ frm[fld]->v5.vf = (float)high; /* upper limit */ #else frm[fld]->v4.vf = low; /* lower limit */ frm[fld]->v5.vf = high; /* upper limit */ #endif frm[fld]->v6.vcp = ubuff; /* &ubuff */ frm[fld]->v7.vcp = hlpmsg; /* &hlpmsg */ frm[fld]->v8.vcp = errmsg; /* &errmsg */ return(TRUE); } strcpy(mask,"FFFFFFFFFFFFFFFFFFFFF"); /* set mask */ if(fwidth > 20 || ndec > fwidth) { /* dont allow foolishness */ *ubuff = NUL; /* indicate error */ return(NULL); /* and return */ } mask[fwidth] = NUL; /* set length */ fwidth = fwidth - (ndec+1); /* decimal position */ mask[fwidth] = '.'; /* set decimal point */ begin: if(!(rv=wn_input(wn,row,col,prmpt,mask,fill,atrib,ubuff,hlpmsg))) { *ubuff = NUL; /* indicate error */ return(NULL); /* indicate error */ } if(wni_frmflg) return(TRUE); /* wn_frmget in progress */ r = sscanf(ubuff, "%lf", &v); /* convert to float */ if(r == EOF || r == 0) v = 0.0; /* no data! */ if(v < low || v > high) { /* bad float */ wn_iemsg(errmsg); /* do error message */ goto begin; /* and stgart over */ } *value = v; /* load user value */ return(rv); /* all is well.. in gross sense */ } /* End */