home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / RECIO110.ZIP / _RCBGET.H < prev    next >
C/C++ Source or Header  |  1994-03-28  |  3KB  |  82 lines

  1. /*****************************************************************************
  2.    MODULE: _rcbget.h
  3.   PURPOSE: header used to compile library functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.   VERSION: 1.10
  6.   RELEASE: Mar 28, 1994
  7. *****************************************************************************/
  8.  
  9. #ifndef _RCBGET_H
  10. #define _RCBGET_H
  11.  
  12. #include "recio.h"
  13.  
  14. extern int _rstatus(REC *rp);
  15. extern char *_rfldstr(REC *rp, size_t len);
  16. extern char *_rerrs(REC *rp, int errnum);
  17.  
  18. #define rcol(rp) (rp->r_colno)
  19.  
  20. /* macro for number conversion between two inclusive columns */
  21. #define rcbget_fn( /* define function to get number from record */\
  22.     fn_type,      /* defined function return type */\
  23.     fn_name,      /* defined function name */\
  24.     fn_err,       /* defined function error return value */\
  25.     cv_type,      /* conversion function return type */\
  26.     cv_name,      /* conversion function name */\
  27.     fn_min,       /* inclusive valid minimum value */\
  28.     fn_max)       /* inclusive valid maximum value */\
  29. \
  30. fn_type fn_name(        /* return fn_type, return fn_err on error */\
  31.         REC *rp,        /* record pointer */\
  32.         size_t begcol,  /* field inclusive beginning column */\
  33.         size_t endcol,  /* field inclusive ending column */\
  34.         int base)       /* radix of number */\
  35. { \
  36.     fn_type result=(fn_err); /* result to return */\
  37.     cv_type val;             /* conversion value */\
  38.     char *fldptr;            /* pointer to field string */\
  39.     char *endptr;            /* pointer to first invalid field char */\
  40.     char *fldp;              /* another pointer to field string */\
  41. \
  42.     if (!_rstatus(rp)) { \
  43.       if (endcol >= begcol && begcol >= rbegcolno(rp)) { \
  44.         rcol(rp) = begcol - rbegcolno(rp); \
  45.         fldptr = _rfldstr(rp, endcol-begcol+1); \
  46.         if (fldptr) { \
  47.           for (;;) { \
  48.             for (fldp=fldptr; *fldp; fldp++) {if (!isspace(*fldp)) break;} \
  49.             if (*fldp) { \
  50.               endptr = fldptr; \
  51.               val = cv_name(fldptr, &endptr, base); \
  52.               while(isspace(*endptr)) endptr++; \
  53.               if (errno==ERANGE||!*endptr) { \
  54.                 if (!errno&&((fn_min)==(fn_max)||(val>=(fn_min)&&val<=(fn_max)))) { \
  55.                   result = (fn_type) val; \
  56.                   goto done; \
  57.                 } /* out of range */\
  58.                 fldptr = _rerrs(rp, R_ERANGE); \
  59.                 if (fldptr) { continue; } else { goto done; } \
  60.               } /* invalid data */ \
  61.               fldptr = _rerrs(rp, R_EINVDAT); \
  62.               if (fldptr) { continue; } else { goto done; } \
  63.             } /* missing data (empty fldstr) */ \
  64.             fldptr = _rerrs(rp, R_EMISDAT); \
  65.             if (fldptr) { continue; } else { goto done; } \
  66.           } \
  67.         } /* null pointer */ \
  68.       } /* arguments reversed or tried to start before first column*/ \
  69.       rseterr(rp, R_EINVAL); \
  70.     } \
  71. done: \
  72.     return result; \
  73. }
  74.  
  75. /* useful macro support */
  76. #define BUILTIN 0  /* indicates that range testing and/or radix
  77.                       is built into the conversion function */
  78. #define uint   unsigned int
  79. #define ulong  unsigned long
  80.  
  81. #endif
  82.