home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- MODULE: _rcbput.h
- PURPOSE: recio column delimited integral number output functions
- COPYRIGHT: (C) 1994 William Pierpoint
- VERSION: 2.00
- RELEASE: April 15, 1994
- *****************************************************************************/
-
- #ifndef _RCBPUT_H
- #define _RCBPUT_H
-
- #include "recio.h"
-
- extern int _rstatus(REC *rp, int mode);
- extern int _rputc(REC *rp, int ch);
-
- #define rfp(rp) ((rp)->r_fp)
- #define rcol(rp) ((rp)->r_colno)
- #define rfldch(rp) ((rp)->r_fldch)
-
- /* macro to put column delimited integral number */
- #define rcbput_fn( /* define function to put number to record stream */\
- fn_type, /* defined function number type */\
- fn_name, /* defined function name */\
- cv_type, /* conversion function type */\
- cv_name) /* conversion function name */\
- \
- int /* return 0 on success; !0 on error */\
- fn_name( /* put string to record stream */\
- REC *rp, /* record pointer */\
- size_t begcol, /* field inclusive beginning column */\
- size_t endcol, /* field inclusive ending column */\
- int base, /* base (radix) (2 to 36) */\
- fn_type num) /* number to put to stream */\
- { \
- int err=EOF; /* return error (0=no error; !0=error) */\
- size_t sl; /* length of _r_nsbuf */\
- if (!_rstatus(rp, R_WRITE)) { \
- if (endcol >= begcol && begcol >= rcolno(rp) && base >= 2 && base <= 36) { \
- rfldno(rp)++; \
- /* if colno < begcol, pad with spaces */\
- while (rcolno(rp) < begcol) { \
- err = _rputc(rp, ' '); \
- if (err) goto done; \
- } \
- cv_name((cv_type)num, _r_nsbuf, base); \
- sl = strlen(_r_nsbuf); \
- /* if converted string fits space */\
- if (sl <= (endcol-begcol+1)) { \
- while (rcolno(rp) <= endcol-sl) { \
- err = _rputc(rp, ' '); \
- if (err) goto done; \
- } \
- err = fputs(_r_nsbuf, rfp(rp)); \
- if (err==EOF) { \
- rseterr(rp, R_ENOPUT); \
- } else { \
- rcol(rp) += sl; \
- err = 0; \
- } \
- /* else converted string too long for space */\
- } else { \
- rsetwarn(rp, R_WWIDTH); \
- while (rcolno(rp) <= endcol) { \
- err = _rputc(rp, '*'); \
- } \
- } \
- } else { \
- rseterr(rp, R_EINVAL); \
- } \
- } \
- done: \
- return err; \
- }
-
- #endif
-