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

  1. /*****************************************************************************
  2.    MODULE: rcbget.c
  3.   PURPOSE: recio column 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 rcol(rp) (rp->r_colno)
  26.  
  27. #define uint      unsigned int
  28. #define ulong     unsigned long
  29. #define UNSIGNED  0
  30. #define SIGNED    1
  31.  
  32. /****************************************************************************/
  33. static long                  /* return integral number                      */
  34.     _rcbgetl(                /* get integral number from col delim stream   */
  35.         REC *rp,             /* pointer to record stream                    */
  36.         size_t begcol,       /* field inclusive beginning column            */
  37.         size_t endcol,       /* field inclusive ending column               */
  38.         int base,            /* radix of number                             */
  39.         int sign,            /* signed number? (0=unsigned; !0=signed)      */
  40.         long min,            /* inclusive valid min value (0 if unsigned)   */
  41.         long max)            /* inclusive valid max value                   */
  42. /****************************************************************************/
  43.     long result=0L;          /* result to return */
  44.     long val;                /* conversion value */
  45.     char *fldptr;            /* pointer to field string */
  46.     char *endptr;            /* pointer to first invalid field char */
  47.     char *fldp;              /* another pointer to field string */
  48.  
  49.     if (_risready(rp, R_READ)) { 
  50.       if (!(base==0 || (base >= 2 && base <= 36))) {
  51.           rseterr(rp, R_EDOM);
  52.           goto done;
  53.       }
  54.       if (endcol >= begcol && begcol >= rbegcolno(rp)) { 
  55.         rcol(rp) = begcol - rbegcolno(rp); 
  56.         fldptr = _rfldstr(rp, endcol-begcol+1); 
  57.         if (fldptr) { 
  58.           for (;;) { 
  59.             for (fldp=fldptr; *fldp; fldp++) {if (!isspace(*fldp)) break;} 
  60.             if (*fldp) { 
  61.               endptr = fldptr; 
  62.               errno = 0; 
  63.               if (sign) {
  64.                 val = strtol(fldptr, &endptr, base); 
  65.               } else {
  66.                 val = str2ul(fldptr, &endptr, base); 
  67.               }
  68.               while (isspace(*endptr)) endptr++; 
  69.               if (errno==ERANGE || !*endptr) { 
  70.                 if (!errno) { 
  71.                   if (sign) {
  72.                     if (val >= min && val <= max) { 
  73.                       result = val; 
  74.                       goto done; 
  75.                     }
  76.                   } else {
  77.                     /* note: unsigned min always assumed to be zero */
  78.                     if ((ulong) val <= (ulong) max) {
  79.                       result = val; 
  80.                       goto done;
  81.                     }
  82.                   }
  83.                 } /* out of range */ 
  84.                 fldptr = _rerrs(rp, R_ERANGE); 
  85.                 if (fldptr) { continue; } else { goto done; } 
  86.               } /* invalid data */ 
  87.               fldptr = _rerrs(rp, R_EINVDAT); 
  88.               if (fldptr) { continue; } else { goto done; } 
  89.             } /* missing data */ 
  90.             fldptr = _rerrs(rp, R_EMISDAT); 
  91.             if (fldptr) { continue; } else { goto done; } 
  92.           } 
  93.         }
  94.       } /* arguments reversed or tried to start before first column*/ 
  95.       rseterr(rp, R_EINVAL); 
  96.     } 
  97. done: 
  98.     return result; 
  99. }
  100.  
  101. /****************************************************************************/
  102. /* column delimited integral number input functions                         */
  103. /****************************************************************************/
  104. int rcbgeti(REC *rp, size_t begcol, size_t endcol, int base)
  105. {
  106.     return (int) _rcbgetl(rp, begcol, endcol, base, SIGNED, INT_MIN, INT_MAX);
  107. }
  108.  
  109. unsigned int rcbgetui(REC *rp, size_t begcol, size_t endcol, int base)
  110. {
  111.     return (uint) _rcbgetl(rp, begcol, endcol, base, UNSIGNED, 0, UINT_MAX);
  112. }
  113.  
  114. long rcbgetl(REC *rp, size_t begcol, size_t endcol, int base)
  115. {
  116.     return _rcbgetl(rp, begcol, endcol, base, SIGNED, LONG_MIN, LONG_MAX);
  117. }
  118.  
  119. unsigned long rcbgetul(REC *rp, size_t begcol, size_t endcol, int base)
  120. {
  121.     return (ulong) _rcbgetl(rp, begcol, endcol, base, UNSIGNED, 0L, ULONG_MAX);
  122. }
  123.