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

  1. /*****************************************************************************
  2.    MODULE: rcgett.c
  3.   PURPOSE: recio column delimited time 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 <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <time.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. #define rtmfmt(rp) ((rp)->r_tmfmt)
  25. #define rcol(rp) (rp->r_colno)
  26.  
  27. extern int _rgett_c_warno;
  28. extern void _tminit(struct tm *);
  29.  
  30. /****************************************************************************/
  31. struct tm                    /* return broken-down time                     */
  32.     rcgettm(                 /* get time from col delim record stream       */
  33.         REC *rp,             /* record pointer                              */
  34.         size_t begcol,       /* field inclusive beginning column            */
  35.         size_t endcol)       /* field inclusive ending column               */
  36. /****************************************************************************/
  37. {
  38.     struct tm t;             /* return broken-down time */
  39.     struct tm val;           /* conversion value */
  40.     char *fldptr;            /* pointer to field buffer */
  41.     char *fldp;              /* another pointer to field buffer */
  42.  
  43.     _tminit(&t);
  44.     if (_risready(rp, R_READ)) {
  45.       if (endcol >= begcol && begcol >= rbegcolno(rp)) {
  46.         rcol(rp) = begcol - rbegcolno(rp);
  47.         fldptr = _rfldstr(rp, endcol-begcol+1);
  48.         if (fldptr) {
  49.           for (;;) {
  50.             for (fldp=fldptr; *fldp; fldp++) {if (!isspace(*fldp)) break;}
  51.             if (*fldp) {
  52.               val = sftotm(fldp, rtmfmt(rp));
  53.               if (errno) {
  54.                 switch (errno) {
  55.                 case EINVAL:
  56.                   fldptr = _rerrs(rp, R_EINVAL);
  57.                   break;
  58.                 case EDOM:
  59.                   fldptr = _rerrs(rp, R_EDOM);
  60.                   break;
  61.                 case ERANGE:
  62.                   fldptr = _rerrs(rp, R_EINVDAT);
  63.                   break;
  64.                 default:
  65.                   fldptr = _rerrs(rp, R_EFAULT);
  66.                   break;
  67.                 }
  68.                 if (fldptr) { continue; } else { goto done; } 
  69.               } else {
  70.                 t = val;
  71.                 if (_rgett_c_warno) rsetwarn(rp, _rgett_c_warno);
  72.                 goto done;
  73.               }
  74.             } /* missing data */ 
  75.             fldptr = _rerrs(rp, R_EMISDAT); 
  76.             if (fldptr) { continue; } else { goto done; } 
  77.           }
  78.         }
  79.       } /* column args reversed or tried to start before first column */
  80.       rseterr(rp, R_EINVAL);
  81.     }
  82. done:
  83.     return t;
  84. }
  85.  
  86. /****************************************************************************/
  87. time_t                       /* return time (-1=error)                      */
  88.     rcgett(                  /* get time from col delim record stream       */
  89.         REC *rp,             /* record pointer                              */
  90.         size_t begcol,       /* field inclusive beginning column            */
  91.         size_t endcol)       /* field inclusive ending column               */
  92. /****************************************************************************/
  93. {
  94.     time_t time=(time_t) -1; /* return time (-1 = error) */
  95.     char *fldptr;            /* pointer to field buffer  */
  96.  
  97.     if (_risready(rp, R_READ)) {
  98.         time = tmtotime(rcgettm(rp, begcol, endcol));
  99.         while (time == (time_t) -1) {
  100.             fldptr = _rerrs(rp, R_ERANGE);
  101.             if (fldptr) {
  102.                 time = tmtotime(sftotm(fldptr, rtmfmt(rp)));
  103.             } else {
  104.                 break;
  105.             }
  106.         }
  107.     }
  108.     return time;
  109. }
  110.