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

  1. /*****************************************************************************
  2.    MODULE: rgets.c
  3.   PURPOSE: recio character 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 <ctype.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "recio.h"
  17.  
  18. extern int _risready(REC *rp, int mode);
  19. extern char *_rfldstr(REC *rp, size_t len);
  20. extern char *_rerrs(REC *rp, int errnum);
  21.  
  22. #define rflags(rp)       ((rp)->r_flags)
  23. #define rcol(rp)         ((rp)->r_colno)
  24. #define rreclen(rp)      ((rp)->r_reclen)
  25.  
  26. /****************************************************************************/
  27. int                          /* return character; EOF=error or missing data */
  28.     str2c(                   /* convert string to character                 */
  29.         const char  *nptr,   /* pointer to string to convert                */
  30.               char **endptr) /* pointer to conversion leftover string       */
  31. /****************************************************************************/
  32. {
  33.     int ch=EOF;              /* result to return */
  34.  
  35.     /* set *endptr to nptr just in case conversion fails */
  36.     if (endptr) *endptr = (char *) nptr;
  37.  
  38.     /* skip over white space */
  39.     while (isspace(*nptr)) nptr++;
  40.     
  41.     /* if string contains a non-whitespace character */
  42.     if (*nptr != '\0') {
  43.         
  44.         /* get the character */
  45.         ch = (int) *nptr;
  46.         
  47.         /* position endptr just past the character */
  48.         if (endptr) *endptr = (char *) ++nptr;
  49.     } 
  50.     return ch;
  51. }
  52.  
  53. /****************************************************************************/
  54. int                          /* return pointer to char; EOF on error        */
  55.     rgetc(                   /* get character from record stream            */
  56.         REC *rp)             /* record pointer                              */
  57. /****************************************************************************/
  58. {
  59.     int result=EOF;          /* character to return */
  60.     int ch;                  /* conversion character */
  61.     char *fldptr;            /* pointer to field string */
  62.     char *endptr;            /* pointer to first invalid field char */
  63.  
  64.     if (_risready(rp, R_READ)) {
  65.       fldptr = _rfldstr(rp, 0);
  66.       if (fldptr) {
  67.         strims(fldptr);
  68.         for (;;) {
  69.           if (*fldptr != '\0') {
  70.             endptr = fldptr;
  71.             ch = str2c(fldptr, &endptr);
  72.             while (isspace(*endptr)) endptr++;
  73.             if (!*endptr) {
  74.                 result = ch;
  75.                 goto done;
  76.             } /* invalid data (more than 1 character in field) */
  77.             fldptr = _rerrs(rp, R_EINVDAT);
  78.             if (fldptr) { continue; } else { goto done; }
  79.           } /* missing data (nothing but white space) */
  80.           fldptr = _rerrs(rp, R_EMISDAT);
  81.           if (fldptr) { continue; } else { goto done; }
  82.         }
  83.       }
  84.     }
  85. done:
  86.     return result;
  87. }
  88.  
  89. /****************************************************************************/
  90. char *                       /* return pointer to string; "" on error       */
  91.     rgets(                   /* get string from record stream               */
  92.         REC *rp)             /* record pointer                              */
  93. /****************************************************************************/
  94. {
  95.     static char empty[]="";  /* empty string */
  96.     char *retp=empty;        /* return pointer */
  97.     char *fldptr;            /* pointer to field buffer */
  98.  
  99.     if (_risready(rp, R_READ)) {
  100.  
  101.         /* if field position is within record */
  102.         if (rcol(rp) <= rreclen(rp)) {
  103.             fldptr = _rfldstr(rp, 0);
  104.             if (fldptr) {
  105.                 /* if string not empty */
  106.                 if (*fldptr) {
  107.                     retp = fldptr;
  108.                 } else {
  109.                     rsetwarn(rp, R_WEMPSTR);
  110.                     retp = rflds(rp);
  111.                 }
  112.             }
  113.  
  114.         /* else beyond end of record */
  115.         } else {
  116.             rfldno(rp)++;
  117.             rsetfldstr(rp, "");
  118.             rsetwarn(rp, R_WEMPSTR);
  119.             retp = rflds(rp);
  120.         }
  121.     }
  122.     return retp;
  123. }
  124.