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

  1. /*****************************************************************************
  2.    MODULE: rcgets.c
  3.   PURPOSE: recio column delimited string and char 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 <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "recio.h"
  16.  
  17. extern int _risready(REC *rp, int mode);
  18. extern char *_rfldstr(REC *rp, size_t len);
  19. extern char *_rerrs(REC *rp, int errnum);
  20.  
  21. #define rcol(rp)         ((rp)->r_colno)
  22.  
  23. /****************************************************************************/
  24. int                          /* return character; EOF on error              */
  25.     rcgetc(                  /* get character at column position            */
  26.         REC *rp,             /* record pointer                              */
  27.         size_t col)          /* column position                             */
  28. /****************************************************************************/
  29. {
  30.     int ch=EOF;              /* character */
  31.     char *fldptr;            /* pointer to field buffer */
  32.     
  33.     if (_risready(rp, R_READ)) {
  34.         if (col >= rbegcolno(rp)) {
  35.             rcol(rp) = col - rbegcolno(rp);
  36.             fldptr = _rfldstr(rp, 1);
  37.             if (fldptr) {
  38.                 /* loop while field empty or error cleared */
  39.                 for (;;) {
  40.                     /* if field not empty, success */
  41.                     if (*fldptr != '\0') {
  42.                         ch = *fldptr;
  43.                         goto done;
  44.                     }
  45.                     
  46.                     /* field empty; see if errfn() replaces it */
  47.                     fldptr = _rerrs(rp, R_EMISDAT);
  48.                     if (fldptr) { continue; } else { goto done; }
  49.                 }
  50.             }
  51.         }
  52.         rseterr(rp, R_EINVAL);
  53.     }
  54. done:
  55.     return ch;
  56. }
  57.  
  58. /****************************************************************************/
  59. char *                       /* return pointer to string; "" on error       */
  60.     rcgets(                  /* get string between columns (inclusive)      */
  61.         REC *rp,             /* record pointer                              */
  62.         size_t begcol,       /* beginning column                            */
  63.         size_t endcol)       /* ending column                               */
  64. /****************************************************************************/
  65. {
  66.     static char empty[]="";  /* empty string */
  67.     char *retp=empty;        /* return pointer */
  68.     char *fldptr;            /* pointer to field buffer */
  69.     
  70.     if (_risready(rp, R_READ)) {
  71.         if (endcol >= begcol && begcol >= rbegcolno(rp)) {
  72.             rcol(rp) = begcol - rbegcolno(rp);
  73.             fldptr = _rfldstr(rp, endcol-begcol+1);
  74.             if (fldptr) {
  75.                     
  76.                 /* if field not empty, success */
  77.                 if (*fldptr) {
  78.                     retp = fldptr;
  79.                     goto done;
  80.                     
  81.                 /* field empty (beyond end of record) */
  82.                 } else {
  83.                     rsetfldstr(rp, "");
  84.                     rsetwarn(rp, R_WEMPSTR);
  85.                     retp = rflds(rp);
  86.                     goto done;
  87.                 }
  88.             }
  89.         }
  90.         rseterr(rp, R_EINVAL);
  91.     }
  92. done:
  93.     return retp;
  94. }
  95.