home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 15
/
CD_ASCQ_15_070894.iso
/
news
/
683
/
recio120
/
_rget.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-08
|
3KB
|
73 lines
/*****************************************************************************
MODULE: _rget.h
PURPOSE: header used to compile library functions
COPYRIGHT: (C) 1994 William Pierpoint
VERSION: 1.20
RELEASE: April 8, 1994
*****************************************************************************/
#ifndef _RGET_H
#define _RGET_H
#include "recio.h"
extern int _rstatus(REC *rp);
extern char *_rfldstr(REC *rp, size_t len);
extern char *_rerrs(REC *rp, int errnum);
/* clip value v between lower l and upper u bounds */
#define range(l, v, u) (min(max((l),(v)),(u)))
/* macro for floating point conversion */
#define rget_fn( /* define function to get number from record */\
fn_type, /* defined function return type */\
fn_name, /* defined function name */\
fn_err, /* defined function error return value */\
cv_type, /* conversion function return type */\
cv_name, /* conversion function name */\
fn_negmin, /* inclusive valid negative minimum value */\
fn_negmax, /* inclusive valid negative maximum value */\
fn_posmin, /* inclusive valid positive minimum value */\
fn_posmax) /* inclusive valid positive maximum value */\
\
fn_type fn_name( /* return fn_type, return fn_err on error */\
REC *rp) /* record pointer */\
{ \
fn_type result=(fn_err); /* result to return */\
cv_type val; /* conversion value */\
char *fldptr; /* pointer to field string */\
char *endptr; /* pointer to first invalid field char */\
\
if (!_rstatus(rp)) { \
fldptr = _rfldstr(rp, 0); \
if (fldptr) { \
for (;;) { \
if (*fldptr != '\0') { \
endptr = fldptr; \
val = cv_name(fldptr, &endptr); \
while (isspace(*endptr)) endptr++; \
if (errno==ERANGE || !*endptr) { \
if (!errno) { \
if (!val || (val>=(fn_negmin) && val<=(fn_negmax)) || \
(val>=(fn_posmin) && val<=(fn_posmax))) { \
result = (fn_type) val; \
goto done; \
} \
} /* out of range */ \
fldptr = _rerrs(rp, R_ERANGE); \
if (fldptr) { continue; } else { goto done; } \
} /* invalid data */ \
fldptr = _rerrs(rp, R_EINVDAT); \
if (fldptr) { continue; } else { goto done; } \
} /* missing data (empty fldstr) */ \
fldptr = _rerrs(rp, R_EMISDAT); \
if (fldptr) { continue; } else { goto done; } \
} \
} /* null pointer */ \
} \
done: \
return result; \
}
#endif