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

  1. /*****************************************************************************
  2.    MODULE: rbget.c
  3.   PURPOSE: recio character delimited integral number 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 <limits.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. extern unsigned long str2ul(const char *nptr, char **endptr, int base);
  24.  
  25. #define uint      unsigned int
  26. #define ulong     unsigned long
  27. #define UNSIGNED  0
  28. #define SIGNED    1
  29.  
  30. /****************************************************************************/
  31. static long                  /* return integral number                      */
  32.     _rbgetl(                 /* get integral number from record stream      */
  33.         REC *rp,             /* record pointer                              */
  34.         int base,            /* radix of number                             */
  35.         int sign,            /* signed number? (0=unsigned; !0=signed)      */
  36.         long min,            /* inclusive valid min value (0 if unsigned)   */
  37.         long max)            /* inclusive valid max value                   */
  38. /****************************************************************************/
  39.     long result=0L;          /* result to return */
  40.     long val;                /* conversion value */
  41.     char *fldptr;            /* pointer to field string */
  42.     char *endptr;            /* pointer to first invalid field char */
  43.  
  44.     if (_risready(rp, R_READ)) { 
  45.       if (!(base==0 || (base >= 2 && base <= 36))) {
  46.           rseterr(rp, R_EDOM);
  47.           goto done;
  48.       }
  49.       fldptr = _rfldstr(rp, 0); 
  50.       if (fldptr) {
  51.         strims(fldptr);
  52.         for (;;) { 
  53.           if (*fldptr != '\0') { 
  54.             endptr = fldptr; 
  55.             errno = 0; 
  56.             if (sign) {
  57.               val = strtol(fldptr, &endptr, base); 
  58.             } else {
  59.               val = str2ul(fldptr, &endptr, base); 
  60.             }
  61.             while (isspace(*endptr)) endptr++; 
  62.             if (errno==ERANGE || !*endptr) { 
  63.               if (!errno) { 
  64.                 if (sign) {
  65.                   if (val >= min && val <= max) { 
  66.                     result = val; 
  67.                     goto done; 
  68.                   }
  69.                 } else {
  70.                   /* note: unsigned min always assumed to be zero */
  71.                   if ((ulong) val <= (ulong) max) {
  72.                     result = val; 
  73.                     goto done;
  74.                   }
  75.                 }
  76.               } /* data out of range */ 
  77.               fldptr = _rerrs(rp, R_ERANGE); 
  78.               if (fldptr) { continue; } else { goto done; } 
  79.             } /* invalid data */ 
  80.             fldptr = _rerrs(rp, R_EINVDAT); 
  81.             if (fldptr) { continue; } else { goto done; } 
  82.           } /* missing data */ 
  83.           fldptr = _rerrs(rp, R_EMISDAT); 
  84.           if (fldptr) { continue; } else { goto done; } 
  85.         } 
  86.       }
  87.     }
  88. done:
  89.     return result;
  90. }
  91.  
  92. /****************************************************************************/
  93. /* character delimited integral number input functions                      */
  94. /****************************************************************************/
  95. int rbgeti(REC *rp, int base)
  96. {
  97.     return (int) _rbgetl(rp, base, SIGNED, INT_MIN, INT_MAX);
  98. }
  99.  
  100. unsigned int rbgetui(REC *rp, int base)
  101. {
  102.     return (uint) _rbgetl(rp, base, UNSIGNED, 0, UINT_MAX);
  103. }
  104.  
  105. long rbgetl(REC *rp, int base)
  106. {
  107.     return _rbgetl(rp, base, SIGNED, LONG_MIN, LONG_MAX);
  108. }
  109.  
  110. unsigned long rbgetul(REC *rp, int base)
  111. {
  112.     return (ulong) _rbgetl(rp, base, UNSIGNED, 0L, ULONG_MAX);
  113. }
  114.