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

  1. /*****************************************************************************
  2.    MODULE: rcputf.c
  3.   PURPOSE: recio column delimited floating point output 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 <float.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 int _rputc(REC *rp, int ch);
  20. extern char *dtoa(double d, char *str, int dig);
  21.  
  22. #define rfp(rp)          ((rp)->r_fp)
  23. #define rcol(rp)         ((rp)->r_colno)
  24. #define rfldch(rp)       ((rp)->r_fldch)
  25. #define rflags(rp)       ((rp)->r_flags)
  26.  
  27. /****************************************************************************/
  28. static void                  /* returns nothing                             */
  29.     _rcputd(                 /* output flt pt number to col delim stream    */
  30.         REC   *rp,           /* pointer to record stream                    */
  31.         size_t begcol,       /* field inclusive beginning column            */
  32.         size_t endcol,       /* field inclusive ending column               */
  33.         int    sigdig,       /* number of significant digits                */
  34.         double num)          /* floating point number to put to stream      */
  35. /****************************************************************************/
  36. {
  37.     size_t sl;               /* length of string _r_nsbuf */
  38.     int dig;                 /* significant digits available */
  39.  
  40.     if (_risready(rp, R_WRITE)) { 
  41.       if (endcol >= begcol && begcol >= rcolno(rp)) { 
  42.         rfldno(rp)++; 
  43.         rflags(rp) &= ~_R_TXT;
  44.  
  45.         /* if colno < begcol, pad with spaces */
  46.         while (rcolno(rp) < begcol) { 
  47.           if (_rputc(rp, ' ')) goto done; 
  48.         } 
  49.  
  50.         /* fit number into space defined by begcol and endcol */
  51.         dig = min(sigdig, (endcol-begcol+1)); 
  52.         while (dig > 0) {
  53.           /* convert number to string */
  54.           dtoa(num, _r_nsbuf, dig); 
  55.           sl = strlen(_r_nsbuf); 
  56.           if (sl <= (endcol-begcol+1)) {
  57.           
  58.             /* right justify string */
  59.             while (rcolno(rp) <= endcol-sl) { 
  60.               if (_rputc(rp, ' ')) goto done; 
  61.             } 
  62.             
  63.             /* output converted string */
  64.             if (fputs(_r_nsbuf, rfp(rp)) != EOF) { 
  65.               rcol(rp) += sl; 
  66.             } else { 
  67.               rseterr(rp, R_ENOPUT); 
  68.             } 
  69.             goto done; 
  70.           } 
  71.           dig -= sl-(endcol-begcol+1); 
  72.         } 
  73.  
  74.         /* converted string too long for space */
  75.         rsetwarn(rp, R_WWIDTH); 
  76.         while (rcolno(rp) <= endcol) { 
  77.           if (_rputc(rp, '*')) goto done; 
  78.         } 
  79.  
  80.       } else { 
  81.         rseterr(rp, R_EINVAL); 
  82.       } 
  83.     } 
  84. done:
  85.     return;
  86. }
  87.  
  88. /****************************************************************************/
  89. /* column delimited floating point output functions                         */
  90. /****************************************************************************/
  91. void rcputf(REC *rp, size_t begcol, size_t endcol, float num)
  92. {
  93.     _rcputd(rp, begcol, endcol, FLT_DIG, (double) num);
  94. }
  95.  
  96. void rcputd(REC *rp, size_t begcol, size_t endcol, double num)
  97. {
  98.     _rcputd(rp, begcol, endcol, DBL_DIG, num);
  99. }
  100.