24 #include "epicsMath.h" 30 #define GEN_SIZE_OFFSET 31 #include "printfRecord.h" 32 #undef GEN_SIZE_OFFSET 44 #define F_BAD (F_BADFMT | F_BADLNK) 46 #define GET_PRINT(VALTYPE, DBRTYPE) \ 50 if (dbLinkIsConstant(plink)) \ 51 ok = recGblInitConstantLink(plink++, DBRTYPE, &val); \ 53 ok = ! dbGetLink(plink++, DBRTYPE, &val, 0, 0); \ 55 added = epicsSnprintf(pval, vspace + 1, format, val); \ 59 static void doPrintf(printfRecord *
prec)
61 const char *pfmt = prec->fmt;
62 DBLINK *plink = &prec->inp0;
64 char *pval = prec->val;
65 int vspace = prec->sizv - 1;
68 while (vspace > 0 && (ch = *pfmt++)) {
76 char *pformat = format;
94 while (cont && (ch = *pfmt++)) {
97 case '+':
case ' ':
case '#':
105 case '0':
case '1':
case '2':
case '3':
case '4':
106 case '5':
case '6':
case '7':
case '8':
case '9':
107 *pnum = *pnum * 10 + ch -
'0';
113 else if (linkn++ < PRINTF_NLINKS) {
117 if (dbLinkIsConstant(plink))
118 ok = recGblInitConstantLink(plink++,
DBR_SHORT, &i);
120 ok = ! dbGetLink(plink++,
DBR_SHORT, &i, 0, 0);
136 flags = (flags & ~F_SHORT) |
F_CHAR;
149 if (strchr(
"diouxXeEfFgGcs%", ch) ==
NULL)
173 else if (linkn++ >= PRINTF_NLINKS) {
179 case 'c':
case 'd':
case 'i':
180 if (ch ==
'c' || flags &
F_CHAR) {
194 case 'o':
case 'x':
case 'X':
case 'u':
195 if (flags & F_CHAR) {
198 else if (flags & F_SHORT) {
201 else if (flags & F_LONGLONG) {
212 if (flags & F_SHORT) {
225 if (precision && n > precision)
231 if (dbLinkIsConstant(plink)) {
233 status = dbLoadLinkLS(plink++, pval, n, &len);
237 status = dbGetLink(plink++,
DBR_CHAR, pval, 0, &n);
245 added = strlen(pval);
246 padding = width - added;
252 padding = vspace - added;
253 memset(pval + added,
' ', padding);
257 int trunc = width - vspace;
261 memmove(pval + padding, pval, added);
267 memset(pval,
' ', padding);
277 if (dbLinkIsConstant(plink))
278 ok = recGblInitConstantLink(plink++,
DBR_STRING, val);
280 ok = ! dbGetLink(plink++,
DBR_STRING, val, 0, 0);
289 errlogPrintf(
"printfRecord: Unexpected conversion '%s'\n",
298 flags &
F_BADLNK ? prec->ivls : format);
301 if (added <= vspace) {
313 prec->len = pval - prec->val;
317 static long init_record(
struct dbCommon *pcommon,
int pass)
319 struct printfRecord *
prec = (
struct printfRecord *)pcommon;
323 size_t sizv = prec->sizv;
335 pdset = (printfdset *) prec->dset;
339 if (pdset->common.number < 5) {
344 if (pdset->common.init_record) {
345 long status = pdset->common.init_record(pcommon);
353 static long process(
struct dbCommon *pcommon)
355 struct printfRecord *
prec = (
struct printfRecord *)pcommon;
356 int pact = prec->pact;
365 recGblGetTimeStamp(prec);
369 pdset = (printfdset *) prec->dset;
371 pdset->common.number >= 5 &&
372 pdset->write_string) {
373 status = pdset->write_string(prec);
376 if (!pact && prec->pact)
383 events = recGblResetAlarms(prec);
395 printfRecord *
prec = (printfRecord *)paddr->precord;
396 int fieldIndex = dbGetFieldIndex(paddr);
398 if (fieldIndex == printfRecordVAL) {
399 paddr->pfield = prec->val;
400 paddr->no_elements = 1;
403 paddr->field_size = prec->sizv;
406 errlogPrintf(
"printfRecord::cvt_dbaddr called for %s.%s\n",
407 prec->name, paddr->pfldDes->name);
411 static long get_array_info(DBADDR *paddr,
long *no_elements,
long *offset)
413 printfRecord *
prec = (printfRecord *) paddr->precord;
415 *no_elements = prec->len;
424 #define initialize NULL 428 #define get_value NULL 431 #define put_array_info NULL 432 #define get_units NULL 433 #define get_precision NULL 434 #define get_enum_str NULL 435 #define get_enum_strs NULL 436 #define put_enum_str NULL 437 #define get_graphic_double NULL 438 #define get_control_double NULL 439 #define get_alarm_double NULL
epicsExportAddress(rset, printfRSET)
unsigned short epicsUInt16
Miscellaneous macro definitions.
unsigned long long epicsUInt64
#define get_graphic_double
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
int errlogPrintf(const char *pFormat,...)
#define GET_PRINT(VALTYPE, DBRTYPE)
Routines for code that can't continue or return after an error.
LIBCOM_API int epicsStdCall epicsSnprintf(char *str, size_t size, const char *format,...) EPICS_PRINTF_STYLE(3
#define get_control_double