home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / recio213.zip / rgetf.c < prev    next >
C/C++ Source or Header  |  1995-09-05  |  3KB  |  84 lines

  1. /*****************************************************************************
  2.    MODULE: rgetf.c
  3.   PURPOSE: recio character delimited floating point input functions
  4. COPYRIGHT: (C) 1994-1995, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.13
  8.   RELEASE: September 4, 1995
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <float.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. #include "recio.h"
  19.  
  20. extern int _risready(REC *rp, int mode);
  21. extern char *_rfldstr(REC *rp, size_t len);
  22. extern char *_rerrs(REC *rp, int errnum);
  23.  
  24. /****************************************************************************/
  25. static double                /* return floating point value                 */
  26.     _rgetd(                  /* get floating point number from rec stream   */
  27.         REC *rp,             /* pointer to record stream                    */
  28.         double negmin,       /* valid negative minimum value                */
  29.         double negmax,       /* valid negative maximum value                */
  30.         double posmin,       /* valid positive minimum value                */
  31.         double posmax)       /* valid positive maximum value                */
  32. /****************************************************************************/
  33. {
  34.     double result=0.0;       /* result to return */
  35.     double val;              /* conversion value */
  36.     char *fldptr;            /* pointer to field string */
  37.     char *endptr;            /* pointer to first invalid field char */
  38.  
  39.     if (_risready(rp, R_READ)) { 
  40.       fldptr = _rfldstr(rp, 0); 
  41.       if (fldptr) {
  42.         strims(fldptr);
  43.         for (;;) { 
  44.           if (*fldptr != '\0') { 
  45.             endptr = fldptr; 
  46.             errno = 0; 
  47.             val = strtod(fldptr, &endptr); 
  48.             while (isspace(*endptr)) endptr++; 
  49.             if (errno==ERANGE || !*endptr) { 
  50.               if (!errno) { 
  51.                 if (!val || (val >= negmin && val <= negmax) || 
  52.                             (val >= posmin && val <= posmax)) { 
  53.                   result = val; 
  54.                   goto done; 
  55.                 } 
  56.               } /* data out of range */ 
  57.               fldptr = _rerrs(rp, R_ERANGE); 
  58.               if (fldptr) { continue; } else { goto done; } 
  59.             } /* invalid data */ 
  60.             fldptr = _rerrs(rp, R_EINVDAT); 
  61.             if (fldptr) { continue; } else { goto done; } 
  62.           } /* missing data */ 
  63.           fldptr = _rerrs(rp, R_EMISDAT); 
  64.           if (fldptr) { continue; } else { goto done; } 
  65.         } 
  66.       }
  67.     } 
  68. done: 
  69.     return result; 
  70. }
  71.  
  72. /****************************************************************************/
  73. /* character delimited floating point input functions                       */
  74. /****************************************************************************/
  75. float rgetf(REC *rp)
  76. {
  77.     return (float) _rgetd(rp, -FLT_MAX, -FLT_MIN, FLT_MIN, FLT_MAX);
  78. }
  79.  
  80. double rgetd(REC *rp)
  81. {
  82.     return _rgetd(rp, -DBL_MAX, -DBL_MIN, DBL_MIN, DBL_MAX);
  83. }
  84.