diff --git a/src/db/dbTest.c b/src/db/dbTest.c index 84cc23e48..2c9350d6f 100644 --- a/src/db/dbTest.c +++ b/src/db/dbTest.c @@ -8,7 +8,7 @@ \*************************************************************************/ /* $Revision-Id$ */ -/* database access test subroutines */ +/* database access test subroutines */ #include #include @@ -44,7 +44,7 @@ #include "dbTest.h" #define MAXLINE 80 -struct msgBuff { /* line output structure */ +struct msgBuff { /* line output structure */ char out_buff[MAXLINE + 1]; char *pNext; char *pLast; @@ -63,25 +63,26 @@ typedef struct msgBuff TAB_BUFFER; /* Local Routines */ static long nameToAddr(const char *pname, DBADDR *paddr); static void printDbAddr(DBADDR *paddr); -static void printBuffer( - long status,short dbr_type,void *pbuffer,long reqOptions, - long retOptions,long no_elements,TAB_BUFFER *pMsgBuff,int tab_size); -static int dbpr_report( - const char *pname,DBADDR *paddr,int interest_level, - TAB_BUFFER *pMsgBuff,int tab_size); +static void printBuffer(long status, short dbr_type, void *pbuffer, + long reqOptions, long retOptions, long no_elements, + TAB_BUFFER *pMsgBuff, int tab_size); +static int dbpr_report(const char *pname, DBADDR *paddr, int interest_level, + TAB_BUFFER *pMsgBuff, int tab_size); static void dbpr_msgOut(TAB_BUFFER *pMsgBuff,int tab_size); static void dbpr_init_msg(TAB_BUFFER *pMsgBuff,int tab_size); static void dbpr_insert_msg(TAB_BUFFER *pMsgBuff,int len,int tab_size); static void dbpr_msg_flush(TAB_BUFFER *pMsgBuff,int tab_size); -static char *dbf[DBF_NTYPES]={ - "STRING","CHAR","UCHAR","SHORT","USHORT","LONG","ULONG", - "FLOAT","DOUBLE","ENUM","MENU","DEVICE", - "INLINK","OUTLINK","FWDLINK","NOACCESS"}; +static char *dbf[DBF_NTYPES] = { + "STRING","CHAR","UCHAR","SHORT","USHORT","LONG","ULONG", + "FLOAT","DOUBLE","ENUM","MENU","DEVICE", + "INLINK","OUTLINK","FWDLINK","NOACCESS" +}; -static char *dbr[DBR_ENUM+2]={ - "STRING","CHAR","UCHAR","SHORT","USHORT","LONG","ULONG", - "FLOAT","DOUBLE","ENUM","NOACCESS"}; +static char *dbr[DBR_ENUM+2] = { + "STRING","CHAR","UCHAR","SHORT","USHORT","LONG","ULONG", + "FLOAT","DOUBLE","ENUM","NOACCESS" +}; long epicsShareAPI dba(const char*pname) { @@ -91,7 +92,10 @@ long epicsShareAPI dba(const char*pname) printf("Usage: dba \"pv name\"\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; + + if (nameToAddr(pname, &addr)) + return -1; + printDbAddr(&addr); return 0; } @@ -110,6 +114,7 @@ long epicsShareAPI dbl(const char *precordTypename, const char *fields) printf("No database loaded\n"); return 0; } + if (precordTypename && ((*precordTypename == '\0') || !strcmp(precordTypename,"*"))) precordTypename = NULL; @@ -144,6 +149,7 @@ long epicsShareAPI dbl(const char *precordTypename, const char *fields) if (status) { printf("No record type\n"); } + while (!status) { status = dbFirstRecord(pdbentry); while (!status) { @@ -154,11 +160,13 @@ long epicsShareAPI dbl(const char *precordTypename, const char *fields) if (status) { if (!strcmp(papfields[ifield], "recordType")) { pvalue = dbGetRecordTypeName(pdbentry); - } else { - printf(", "); + } + else { + printf(", "); continue; } - } else { + } + else { pvalue = dbGetString(pdbentry); } printf(", \"%s\"", pvalue ? pvalue : ""); @@ -166,7 +174,9 @@ long epicsShareAPI dbl(const char *precordTypename, const char *fields) printf("\n"); status = dbNextRecord(pdbentry); } - if (precordTypename) break; + if (precordTypename) + break; + status = dbNextRecordType(pdbentry); } if (nfields > 0) { @@ -191,12 +201,14 @@ long epicsShareAPI dbnr(int verbose) printf("No database loaded\n"); return 0; } + dbInitEntry(pdbbase, pdbentry); status = dbFirstRecordType(pdbentry); if (status) { printf("No record types loaded\n"); return 0; } + printf("Records Aliases Record Type\n"); while (!status) { naliases = dbGetNAliases(pdbentry); @@ -208,6 +220,7 @@ long epicsShareAPI dbnr(int verbose) nrecords, naliases, dbGetRecordTypeName(pdbentry)); status = dbNextRecordType(pdbentry); } + dbFinishEntry(pdbentry); printf("Total %d records, %d aliases\n", trecords, taliases); return 0; @@ -223,6 +236,7 @@ long epicsShareAPI dbla(const char *pmask) printf("No database loaded\n"); return 0; } + dbInitEntry(pdbbase, pdbentry); status = dbFirstRecordType(pdbentry); while (!status) { @@ -230,14 +244,18 @@ long epicsShareAPI dbla(const char *pmask) status = dbNextRecord(pdbentry)) { char *palias; - if (!dbIsAlias(pdbentry)) continue; + if (!dbIsAlias(pdbentry)) + continue; + palias = dbGetRecordName(pdbentry); - if (pmask && *pmask && !epicsStrGlobMatch(palias, pmask)) continue; + if (pmask && *pmask && !epicsStrGlobMatch(palias, pmask)) + continue; dbFindField(pdbentry, "NAME"); printf("%s -> %s\n", palias, dbGetString(pdbentry)); } status = dbNextRecordType(pdbentry); } + dbFinishEntry(pdbentry); return 0; } @@ -252,21 +270,25 @@ long epicsShareAPI dbgrep(const char *pmask) printf("Usage: dbgrep \"pattern\"\n"); return 1; } + if (!pdbbase) { printf("No database loaded\n"); return 0; } + dbInitEntry(pdbbase, pdbentry); status = dbFirstRecordType(pdbentry); while (!status) { status = dbFirstRecord(pdbentry); while (!status) { char *pname = dbGetRecordName(pdbentry); - if (epicsStrGlobMatch(pname, pmask)) puts(pname); + if (epicsStrGlobMatch(pname, pmask)) + puts(pname); status = dbNextRecord(pdbentry); } status = dbNextRecordType(pdbentry); } + dbFinishEntry(pdbentry); return 0; } @@ -277,64 +299,84 @@ long epicsShareAPI dbgf(const char *pname) long buffer[100]; long *pbuffer=&buffer[0]; DBADDR addr; - long status; long options = 0; long no_elements; static TAB_BUFFER msg_Buff; - int tab_size = 10; if (!pname || !*pname) { printf("Usage: dbgf \"pv name\"\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; + + if (nameToAddr(pname, &addr)) + return -1; + no_elements = MIN(addr.no_elements, sizeof(buffer)/addr.field_size); if (addr.dbr_field_type == DBR_ENUM) { - status = dbGetField(&addr, DBR_STRING, pbuffer, + long status = dbGetField(&addr, DBR_STRING, pbuffer, &options, &no_elements, NULL); + printBuffer(status, DBR_STRING, pbuffer, 0L, 0L, - no_elements, &msg_Buff, tab_size); - } else { - status = dbGetField(&addr, addr.dbr_field_type, pbuffer, - &options, &no_elements, NULL); - printBuffer(status, addr.dbr_field_type, pbuffer, 0L, 0L, - no_elements, &msg_Buff, tab_size); + no_elements, &msg_Buff, 10); } + else { + long status = dbGetField(&addr, addr.dbr_field_type, pbuffer, + &options, &no_elements, NULL); + + printBuffer(status, addr.dbr_field_type, pbuffer, 0L, 0L, + no_elements, &msg_Buff, 10); + } + msg_Buff.message[0] = '\0'; - dbpr_msgOut(&msg_Buff, tab_size); + dbpr_msgOut(&msg_Buff, 10); return 0; } long epicsShareAPI dbpf(const char *pname,const char *pvalue) { DBADDR addr; - long status = 0; + long status; + epicsUInt16 value; + short dbrType; + long n = 1; if (!pname || !*pname || !pvalue) { printf("Usage: dbpf \"pv name\", \"value\"\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; - /* For enumerated types must allow for ENUM rather than string*/ - /* If entire field is digits then use DBR_ENUM else DBR_STRING*/ + + if (nameToAddr(pname, &addr)) + return -1; + + /* For enumerated types must allow for ENUM rather than string */ + /* If entire field is digits then use DBR_ENUM else DBR_STRING */ if (addr.dbr_field_type == DBR_ENUM && *pvalue && strspn(pvalue,"0123456789") == strlen(pvalue)) { - unsigned short value; sscanf(pvalue, "%hu", &value); - status = dbPutField(&addr, DBR_ENUM, &value, 1L); - } else if (addr.dbr_field_type == DBR_CHAR && - addr.no_elements > 1) { - status = dbPutField(&addr, DBR_CHAR, pvalue, strlen(pvalue) + 1); - } else { - status = dbPutField(&addr, DBR_STRING, pvalue, 1L); + pvalue = (char *) &value; + dbrType = DBR_ENUM; } + else if (addr.no_elements > 1 && + (addr.dbr_field_type == DBR_CHAR || addr.dbr_field_type == DBR_UCHAR)) { + dbrType = addr.dbr_field_type; + n = strlen(pvalue) + 1; + } + else { + dbrType = DBR_STRING; + } + + status = dbPutField(&addr, dbrType, pvalue, n); if (status) { - errMessage(status,"- dbPutField error\n"); - return status; + if (status == -1) + printf("dbpf: Value conversion from %s to %s failed\n", + dbr[dbrType], dbf[addr.field_type]); + else + errMessage(status,"- dbPutField error\n"); + return status; } - status = dbgf(pname); - return status; + + return dbgf(pname); } long epicsShareAPI dbpr(const char *pname,int interest_level) @@ -349,11 +391,15 @@ long epicsShareAPI dbpr(const char *pname,int interest_level) printf("Usage: dbpr \"pv name\", level\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; + + if (nameToAddr(pname, &addr)) + return -1; + pmsg = pMsgBuff->message; if (dbpr_report(pname, &addr, interest_level, pMsgBuff, tab_size)) return 1; + pmsg[0] = '\0'; dbpr_msgOut(pMsgBuff, tab_size); return 0; @@ -369,17 +415,23 @@ long epicsShareAPI dbtr(const char *pname) printf("Usage: dbtr \"pv name\"\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; + + if (nameToAddr(pname, &addr)) + return -1; + precord = (struct dbCommon*)addr.precord; if (precord->pact) { printf("record active\n"); return 1; } + dbScanLock(precord); status = dbProcess(precord); dbScanUnlock(precord); + if (status) recGblRecordError(status, precord, "dbtr(dbProcess)"); + dbpr(pname, 3); return 0; } @@ -402,7 +454,9 @@ long epicsShareAPI dbtgf(const char *pname) printf("Usage: dbtgf \"pv name\"\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; + + if (nameToAddr(pname, &addr)) + return -1; /* try all options first */ req_options = 0xffffffff; @@ -486,12 +540,6 @@ long epicsShareAPI dbtpf(const char *pname, const char *pvalue) int validULong; int valid = 1; int put_type; - epicsInt8 val_i8; - epicsUInt8 val_u8; - epicsInt16 val_i16; - epicsUInt16 val_u16; - epicsInt32 val_i32; - epicsUInt32 val_u32; epicsFloat32 fvalue; epicsFloat64 dvalue; static TAB_BUFFER msg_Buff; @@ -503,7 +551,9 @@ long epicsShareAPI dbtpf(const char *pname, const char *pvalue) printf("Usage: dbtpf \"pv name\", \"value\"\n"); return 1; } - if (nameToAddr(pname, &addr)) return -1; + + if (nameToAddr(pname, &addr)) + return -1; val_long = strtol(pvalue, &pend, 10); validLong = (*pend == 0); @@ -518,37 +568,37 @@ long epicsShareAPI dbtpf(const char *pname, const char *pvalue) break; case DBR_CHAR: if ((valid = validLong)) { - val_i8 = (epicsInt8)val_long; + epicsInt8 val_i8 = (epicsInt8)val_long; status = dbPutField(&addr, put_type, &val_i8, 1L); } break; case DBR_UCHAR: if ((valid = validULong)) { - val_u8 = (epicsUInt8)val_ulong; + epicsUInt8 val_u8 = (epicsUInt8)val_ulong; status = dbPutField(&addr, put_type, &val_u8, 1L); } break; case DBR_SHORT: if ((valid = validLong)) { - val_i16 = val_long; + epicsInt16 val_i16 = val_long; status = dbPutField(&addr, put_type, &val_i16,1L); } break; case DBR_USHORT: if ((valid = validULong)) { - val_u16 = val_ulong; + epicsUInt16 val_u16 = val_ulong; status = dbPutField(&addr, put_type, &val_u16, 1L); } break; case DBR_LONG: if ((valid = validLong)) { - val_i32 = val_long; + epicsInt32 val_i32 = val_long; status = dbPutField(&addr, put_type,&val_i32,1L); } break; case DBR_ULONG: if ((valid = validULong)) { - val_u32 = val_ulong; + epicsUInt32 val_u32 = val_ulong; status = dbPutField(&addr, put_type, &val_u32, 1L); } break; @@ -562,8 +612,8 @@ long epicsShareAPI dbtpf(const char *pname, const char *pvalue) break; case DBR_ENUM: if ((valid = validULong)) { - val_u16 = val_ulong; - status = dbPutField(&addr, put_type, &val_u16, 1L); + epicsEnum16 val_e16 = val_ulong; + status = dbPutField(&addr, put_type, &val_e16, 1L); } break; } @@ -590,51 +640,65 @@ long epicsShareAPI dbtpf(const char *pname, const char *pvalue) long epicsShareAPI dbior(const char *pdrvName,int interest_level) { - char *pname; - drvSup *pdrvSup; + drvSup *pdrvSup; struct drvet *pdrvet; dbRecordType *pdbRecordType; - devSup *pdevSup; - struct dset *pdset; if (!pdbbase) { printf("No database loaded\n"); return 0; } + if (pdrvName && ((*pdrvName == '\0') || !strcmp(pdrvName,"*"))) pdrvName = NULL; + for (pdrvSup = (drvSup *)ellFirst(&pdbbase->drvList); pdrvSup; pdrvSup = (drvSup *)ellNext(&pdrvSup->node)) { - pname = pdrvSup->name; - if(pdrvName!=NULL && *pdrvName!='\0' && (strcmp(pdrvName,pname)!=0)) continue; - pdrvet = pdrvSup->pdrvet ; - if(pdrvet==NULL) { - printf("No driver entry table is present for %s\n",pname); - continue; - } - if(pdrvet->report==NULL) - printf("Driver: %s No report available\n",pname); - else { - printf("Driver: %s\n",pname); - (*pdrvet->report)(interest_level); - } + const char *pname = pdrvSup->name; + + if (pdrvName!=NULL && *pdrvName!='\0' && + (strcmp(pdrvName,pname)!=0)) + continue; + + pdrvet = pdrvSup->pdrvet ; + if (pdrvet == NULL) { + printf("No driver entry table is present for %s\n", pname); + continue; + } + + if (pdrvet->report == NULL) + printf("Driver: %s No report available\n", pname); + else { + printf("Driver: %s\n", pname); + pdrvet->report(interest_level); + } } + /* now check devSup reports */ for (pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); pdbRecordType; pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { + devSup *pdevSup; + for (pdevSup = (devSup *)ellFirst(&pdbRecordType->devList); pdevSup; pdevSup = (devSup *)ellNext(&pdevSup->node)) { - if(!(pdset = pdevSup->pdset)) continue; - if(!(pname = pdevSup->name)) continue; - if(pdrvName!=NULL && *pdrvName!='\0' && (strcmp(pdrvName,pname)!=0)) continue; - if(pdset->report!=NULL) { - printf("Device Support: %s\n",pname); - (*pdset->report)(interest_level); - } - } + struct dset *pdset = pdevSup->pdset; + const char *pname = pdevSup->name; + + if (!pdset || !pname) + continue; + + if (pdrvName != NULL && *pdrvName != '\0' && + (strcmp(pdrvName, pname) != 0)) + continue; + + if (pdset->report != NULL) { + printf("Device Support: %s\n", pname); + pdset->report(interest_level); + } + } } return 0; } @@ -645,6 +709,7 @@ int epicsShareAPI dbhcr(void) printf("No database loaded\n"); return 0; } + dbReportDeviceConfig(pdbbase, stdout); return 0; } @@ -652,39 +717,35 @@ int epicsShareAPI dbhcr(void) static long nameToAddr(const char *pname, DBADDR *paddr) { long status = dbNameToAddr(pname, paddr); + if (status) { - printf("Record '%s' not found\n", pname); + printf("PV '%s' not found\n", pname); } return status; } static void printDbAddr(DBADDR *paddr) { - short field_type; - short dbr_field_type; - dbFldDes *pdbFldDes = paddr->pfldDes; + dbFldDes *pdbFldDes = paddr->pfldDes; + short field_type = paddr->field_type; + short dbr_field_type = paddr->dbr_field_type; - printf("Record Address: %p",(void *)paddr->precord); - printf(" Field Address: %p",paddr->pfield); - printf(" Field Description: %p\n",(void *)pdbFldDes); - printf(" No Elements: %ld\n",paddr->no_elements); - printf(" Record Type: %s\n",pdbFldDes->pdbRecordType->name); - printf(" FieldType: DBF_"); - field_type = paddr->field_type; - if(field_type<0 || field_type>DBR_NOACCESS) - printf(" Illegal = %d\n",field_type); - else - printf("%s\n",dbf[field_type]); - printf(" Field Type: %d\n",paddr->field_type); - printf(" Field Size: %d\n",paddr->field_size); - printf(" Special: %d\n",paddr->special); - printf("DBR Field Type: DBR_"); - dbr_field_type = paddr->dbr_field_type; - if(dbr_field_type==DBR_NOACCESS)dbr_field_type=DBR_ENUM + 1; - if(dbr_field_type<0 || dbr_field_type>(DBR_ENUM+1)) - printf(" Illegal = %d\n",dbr_field_type); - else - printf("%s\n",dbr[dbr_field_type]); + printf("Record Address: %p", paddr->precord); + printf(" Field Address: %p", paddr->pfield); + printf(" Field Description: %p\n", pdbFldDes); + printf(" No Elements: %ld\n", paddr->no_elements); + printf(" Record Type: %s\n", pdbFldDes->pdbRecordType->name); + printf(" Field Type: %d = DBF_%s\n", field_type, + (field_type < 0 || field_type > DBR_NOACCESS) ? "????" : + dbf[field_type]); + printf(" Field Size: %d\n", paddr->field_size); + printf(" Special: %d\n", paddr->special); + + if (dbr_field_type == DBR_NOACCESS) + dbr_field_type = DBR_ENUM + 1; + printf("DBR Field Type: %d = DBR_%s\n", paddr->dbr_field_type, + (dbr_field_type < 0 || dbr_field_type > (DBR_ENUM+1)) ? "????" : + dbr[dbr_field_type]); } @@ -704,32 +765,39 @@ static void printBuffer( printf("status = %u, severity = %u\n", pdbr_status->status, pdbr_status->severity); - } else + } + else { printf("status and severity not returned\n"); + } pbuffer = (char *)pbuffer + dbr_status_size; } + if (reqOptions & DBR_UNITS) { if (retOptions & DBR_UNITS) { struct dbr_units *pdbr_units = (void *)pbuffer; printf("units = \"%s\"\n", pdbr_units->units); - }else{ + } + else { printf("units not returned\n"); } pbuffer = (char *)pbuffer + dbr_units_size; } + if (reqOptions & DBR_PRECISION) { if (retOptions & DBR_PRECISION){ struct dbr_precision *pdbr_precision = (void *)pbuffer; printf("precision = %ld\n", pdbr_precision->precision.dp); - }else{ + } + else { printf("precision not returned\n"); } pbuffer = (char *)pbuffer + dbr_precision_size; } + if (reqOptions & DBR_TIME) { if (retOptions & DBR_TIME) { struct dbr_time *pdbr_time = (void *)pbuffer; @@ -737,11 +805,13 @@ static void printBuffer( epicsTimeToStrftime(time_buf, 40, "%Y-%m-%d %H:%M:%S.%09f", &pdbr_time->time); printf("time = %s\n", time_buf); - }else{ + } + else { printf("time not returned\n"); } pbuffer = (char *)pbuffer + dbr_time_size; } + if (reqOptions & DBR_ENUM_STRS) { if (retOptions & DBR_ENUM_STRS) { struct dbr_enumStrs *pdbr_enumStrs = (void *)pbuffer; @@ -750,10 +820,13 @@ static void printBuffer( pdbr_enumStrs->no_str); for (i = 0; i < pdbr_enumStrs->no_str; i++) printf("\t\"%s\"\n", pdbr_enumStrs->strs[i]); - } else + } + else { printf("enum strings not returned\n"); + } pbuffer = (char *)pbuffer + dbr_enumStrs_size; } + if (reqOptions & DBR_GR_LONG) { if (retOptions & DBR_GR_LONG) { struct dbr_grLong *pdbr_grLong = (void *)pbuffer; @@ -761,11 +834,13 @@ static void printBuffer( printf("grLong: %d .. %d\n", pdbr_grLong->lower_disp_limit, pdbr_grLong->upper_disp_limit); - }else{ + } + else { printf("DBRgrLong not returned\n"); } pbuffer = (char *)pbuffer + dbr_grLong_size; } + if (reqOptions & DBR_GR_DOUBLE) { if (retOptions & DBR_GR_DOUBLE) { struct dbr_grDouble *pdbr_grDouble = (void *)pbuffer; @@ -773,11 +848,13 @@ static void printBuffer( printf("grDouble: %g .. %g\n", pdbr_grDouble->lower_disp_limit, pdbr_grDouble->upper_disp_limit); - }else{ + } + else { printf("DBRgrDouble not returned\n"); } pbuffer = (char *)pbuffer + dbr_grDouble_size; } + if (reqOptions & DBR_CTRL_LONG) { if (retOptions & DBR_CTRL_LONG){ struct dbr_ctrlLong *pdbr_ctrlLong = (void *)pbuffer; @@ -785,11 +862,13 @@ static void printBuffer( printf("ctrlLong: %d .. %d\n", pdbr_ctrlLong->lower_ctrl_limit, pdbr_ctrlLong->upper_ctrl_limit); - }else{ + } + else { printf("DBRctrlLong not returned\n"); } pbuffer = (char *)pbuffer + dbr_ctrlLong_size; } + if (reqOptions & DBR_CTRL_DOUBLE) { if (retOptions & DBR_CTRL_DOUBLE) { struct dbr_ctrlDouble *pdbr_ctrlDouble = (void *)pbuffer; @@ -797,11 +876,13 @@ static void printBuffer( printf("ctrlDouble: %g .. %g\n", pdbr_ctrlDouble->lower_ctrl_limit, pdbr_ctrlDouble->upper_ctrl_limit); - }else{ + } + else { printf("DBRctrlDouble not returned\n"); } pbuffer = (char *)pbuffer + dbr_ctrlDouble_size; } + if (reqOptions & DBR_AL_LONG) { if (retOptions & DBR_AL_LONG) { struct dbr_alLong *pdbr_alLong = (void *)pbuffer; @@ -811,11 +892,13 @@ static void printBuffer( pdbr_alLong->lower_warning_limit, pdbr_alLong->upper_warning_limit, pdbr_alLong->upper_alarm_limit); - }else{ + } + else { printf("DBRalLong not returned\n"); } pbuffer = (char *)pbuffer + dbr_alLong_size; } + if (reqOptions & DBR_AL_DOUBLE) { if (retOptions & DBR_AL_DOUBLE) { struct dbr_alDouble *pdbr_alDouble = (void *)pbuffer; @@ -825,13 +908,17 @@ static void printBuffer( pdbr_alDouble->lower_warning_limit, pdbr_alDouble->upper_warning_limit, pdbr_alDouble->upper_alarm_limit); - }else{ + } + else { printf("DBRalDouble not returned\n"); } pbuffer = (char *)pbuffer + dbr_alDouble_size; } + /* Now print values */ - if (no_elements == 0) return; + if (no_elements == 0) + return; + switch (dbr_type) { case (DBR_STRING): if (no_elements == 1) @@ -844,6 +931,7 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for(i=0; i 0) { @@ -853,6 +941,7 @@ static void printBuffer( pbuffer = (char *)pbuffer + MAX_STRING_SIZE; } break; + case (DBR_CHAR): if (no_elements == 1) sprintf(pmsg, "DBR_CHAR: "); @@ -864,11 +953,13 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + if (no_elements == 1) { val_i32 = *(epicsInt8 *) pbuffer; sprintf(pmsg, "%-9d 0x%-9x", val_i32, val_i32); dbpr_msgOut(pMsgBuff, tab_size); - } else { + } + else { for (i = 0; i < no_elements; i+= MAXLINE - 5) { sprintf(pmsg, " \"%.*s\"", MAXLINE - 5, (char *)pbuffer + i); if (i + MAXLINE - 5 < no_elements) strcat(pmsg, " +"); @@ -876,6 +967,7 @@ static void printBuffer( } } break; + case (DBR_UCHAR): if (no_elements == 1) sprintf(pmsg, "DBR_UCHAR: "); @@ -887,6 +979,7 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { val_u32 = *(epicsUInt8 *) pbuffer; sprintf(pmsg, "%-9u 0x%-9x", val_u32, val_u32); @@ -894,6 +987,7 @@ static void printBuffer( pbuffer = (char *)pbuffer + sizeof(epicsUInt8); } break; + case (DBR_SHORT): if (no_elements == 1) sprintf(pmsg, "DBR_SHORT: "); @@ -905,6 +999,7 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { val_i32 = *(epicsInt16 *) pbuffer; sprintf(pmsg, "%-9d 0x%-9x", val_i32, val_i32); @@ -912,6 +1007,7 @@ static void printBuffer( pbuffer = (char *)pbuffer + sizeof(epicsInt16); } break; + case (DBR_USHORT): if (no_elements == 1) sprintf(pmsg, "DBR_USHORT: "); @@ -923,6 +1019,7 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { val_u32 = *(epicsUInt16 *) pbuffer; sprintf(pmsg, "%-9u 0x%-9x", val_u32, val_u32); @@ -930,6 +1027,7 @@ static void printBuffer( pbuffer = (char *)pbuffer + sizeof(epicsUInt16); } break; + case (DBR_LONG): if (no_elements == 1) sprintf(pmsg, "DBR_LONG: "); @@ -941,6 +1039,7 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { val_i32 = *(epicsInt32 *) pbuffer; sprintf(pmsg, "%-9d 0x%-9x", val_i32, val_i32); @@ -948,6 +1047,7 @@ static void printBuffer( pbuffer = (char *)pbuffer + sizeof(epicsInt32); } break; + case (DBR_ULONG): if (no_elements == 1) sprintf(pmsg, "DBR_ULONG: "); @@ -959,6 +1059,7 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { val_u32 = *(epicsUInt32 *) pbuffer; sprintf(pmsg, "%-9u 0x%-9x", val_u32, val_u32); @@ -966,6 +1067,7 @@ static void printBuffer( pbuffer = (char *)pbuffer + sizeof(epicsUInt32); } break; + case (DBR_FLOAT): if (no_elements == 1) sprintf(pmsg, "DBR_FLOAT: "); @@ -977,12 +1079,14 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { sprintf(pmsg, "%-13.6g", *((epicsFloat32 *) pbuffer)); dbpr_msgOut(pMsgBuff, tab_size); pbuffer = (char *)pbuffer + sizeof(epicsFloat32); } break; + case (DBR_DOUBLE): if (no_elements == 1) sprintf(pmsg, "DBR_DOUBLE: "); @@ -994,12 +1098,14 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { sprintf(pmsg, "%-13.6g", *((epicsFloat64 *) pbuffer)); dbpr_msgOut(pMsgBuff, tab_size); pbuffer = (char *)pbuffer + sizeof(epicsFloat64); } break; + case (DBR_ENUM): if (no_elements == 1) sprintf(pmsg, "DBR_ENUM: "); @@ -1011,122 +1117,133 @@ static void printBuffer( dbpr_msgOut(pMsgBuff, tab_size); break; } + for (i = 0; i < no_elements; i++) { sprintf(pmsg, "%-9u", *((epicsEnum16 *) pbuffer)); dbpr_msgOut(pMsgBuff, tab_size); pbuffer = (char *)pbuffer + sizeof(epicsEnum16); } break; + default: printf(" illegal request type."); break; } + dbpr_msg_flush(pMsgBuff, tab_size); return; } static int dbpr_report( - const char *pname,DBADDR *paddr,int interest_level, - TAB_BUFFER *pMsgBuff,int tab_size) + const char *pname, DBADDR *paddr, int interest_level, + TAB_BUFFER *pMsgBuff, int tab_size) { - - char *pmsg; - dbFldDes *pdbFldDes = paddr->pfldDes; - dbRecordType *pdbRecordType = pdbFldDes->pdbRecordType; - short n2; - void *pfield; - char *pfield_name; - char *pfield_value; - DBENTRY dbentry; - DBENTRY *pdbentry = &dbentry; - long status; + char *pmsg; + dbFldDes *pdbFldDes = paddr->pfldDes; + dbRecordType *pdbRecordType = pdbFldDes->pdbRecordType; + short n2; + void *pfield; + char *pfield_name; + char *pfield_value; + DBENTRY dbentry; + DBENTRY *pdbentry = &dbentry; + long status; dbInitEntry(pdbbase,pdbentry); status = dbFindRecord(pdbentry,pname); - if(status) { - errMessage(status,pname); - return(-1); + if (status) { + errMessage(status,pname); + return -1; } + pmsg = pMsgBuff->message; for (n2 = 0; n2 <= pdbRecordType->no_fields - 1; n2++) { - pdbFldDes = pdbRecordType->papFldDes[pdbRecordType->sortFldInd[n2]]; - pfield_name = pdbFldDes->name; - pfield = ((char *)paddr->precord) + pdbFldDes->offset; - if (pdbFldDes->interest > interest_level ) - continue; - switch (pdbFldDes->field_type) { - case DBF_STRING: - case DBF_USHORT: - case DBF_ENUM: - case DBF_FLOAT: - case DBF_CHAR: - case DBF_UCHAR: - case DBF_SHORT: - case DBF_LONG: - case DBF_ULONG: - case DBF_DOUBLE: - case DBF_MENU: - case DBF_DEVICE: - status = dbFindField(pdbentry,pfield_name); - pfield_value = dbGetString(pdbentry); - sprintf(pmsg, "%s: %s", pfield_name, - (pfield_value ? pfield_value : "")); - dbpr_msgOut(pMsgBuff, tab_size); - break; - case DBF_INLINK: - case DBF_OUTLINK: - case DBF_FWDLINK: { - DBLINK *plink = (DBLINK *)pfield; - int ind; + pdbFldDes = pdbRecordType->papFldDes[pdbRecordType->sortFldInd[n2]]; + pfield_name = pdbFldDes->name; + pfield = ((char *)paddr->precord) + pdbFldDes->offset; + if (pdbFldDes->interest > interest_level ) + continue; - status = dbFindField(pdbentry,pfield_name); - for(ind=0; indtype) break; - } - if(ind>=LINK_NTYPES) { - sprintf(pmsg,"%s: Illegal Link Type", pfield_name); - } else { - sprintf(pmsg,"%s:%s %s", pfield_name, - pamaplinkType[ind].strvalue,dbGetString(pdbentry)); - } - dbpr_msgOut(pMsgBuff, tab_size); - } - break; - case DBF_NOACCESS: - if (pfield == (void *)&paddr->precord->time) { - /* Special for the TIME field, make it human-readable */ - char time_buf[40]; - epicsTimeToStrftime(time_buf, 40, "%Y-%m-%d %H:%M:%S.%09f", - &paddr->precord->time); - sprintf(pmsg, "%s: %s", pfield_name, time_buf); - dbpr_msgOut(pMsgBuff, tab_size); - } else if (pdbFldDes->size == sizeof(void *) && + switch (pdbFldDes->field_type) { + case DBF_STRING: + case DBF_USHORT: + case DBF_ENUM: + case DBF_FLOAT: + case DBF_CHAR: + case DBF_UCHAR: + case DBF_SHORT: + case DBF_LONG: + case DBF_ULONG: + case DBF_DOUBLE: + case DBF_MENU: + case DBF_DEVICE: + status = dbFindField(pdbentry,pfield_name); + pfield_value = dbGetString(pdbentry); + sprintf(pmsg, "%s: %s", pfield_name, + (pfield_value ? pfield_value : "")); + dbpr_msgOut(pMsgBuff, tab_size); + break; + + case DBF_INLINK: + case DBF_OUTLINK: + case DBF_FWDLINK: { + DBLINK *plink = (DBLINK *)pfield; + int ind; + + status = dbFindField(pdbentry,pfield_name); + for (ind=0; indtype) + break; + } + if (ind>=LINK_NTYPES) { + sprintf(pmsg,"%s: Illegal Link Type", pfield_name); + } + else { + sprintf(pmsg,"%s:%s %s", pfield_name, + pamaplinkType[ind].strvalue,dbGetString(pdbentry)); + } + dbpr_msgOut(pMsgBuff, tab_size); + } + break; + + case DBF_NOACCESS: + if (pfield == (void *)&paddr->precord->time) { + /* Special for the TIME field, make it human-readable */ + char time_buf[40]; + epicsTimeToStrftime(time_buf, 40, "%Y-%m-%d %H:%M:%S.%09f", + &paddr->precord->time); + sprintf(pmsg, "%s: %s", pfield_name, time_buf); + dbpr_msgOut(pMsgBuff, tab_size); + } + else if (pdbFldDes->size == sizeof(void *) && strchr(pdbFldDes->extra, '*')) { /* Special for pointers, needed on little-endian CPUs */ sprintf(pmsg, "%s: %p", pfield_name, *(void **)pfield); dbpr_msgOut(pMsgBuff, tab_size); - } else { /* just print field as hex bytes */ - unsigned char *pchar = (unsigned char *)pfield; - char temp_buf[61]; - char *ptemp_buf = &temp_buf[0]; - short n = pdbFldDes->size; - short i; + } + else { /* just print field as hex bytes */ + unsigned char *pchar = (unsigned char *)pfield; + char temp_buf[61]; + char *ptemp_buf = &temp_buf[0]; + short n = pdbFldDes->size; + short i; unsigned int value; - if (n > sizeof(temp_buf)/3) n = sizeof(temp_buf)/3; - for (i=0; i sizeof(temp_buf)/3) n = sizeof(temp_buf)/3; + for (i=0; imessage; - static int last_tabsize; + int len; + int err = 0; + char *pmsg = pMsgBuff->message; + static int last_tabsize; if (!((tab_size == 10) || (tab_size == 20))) { - printf("tab_size not 10 or 20 - dbpr_msgOut()\n"); - return; + printf("tab_size not 10 or 20 - dbpr_msgOut()\n"); + return; } /* init if first time */ if (!(pMsgBuff->pNext)) - dbpr_init_msg(pMsgBuff, tab_size); + dbpr_init_msg(pMsgBuff, tab_size); if (tab_size != last_tabsize) - pMsgBuff->pNexTab = pMsgBuff->out_buff + tab_size; + pMsgBuff->pNexTab = pMsgBuff->out_buff + tab_size; last_tabsize = tab_size; /* flush output if NULL string command */ if (*pmsg == 0) { - dbpr_msg_flush(pMsgBuff, tab_size); - return; + dbpr_msg_flush(pMsgBuff, tab_size); + return; } /* truncate if too long */ len = strlen(pmsg); @@ -1168,15 +1285,11 @@ static void dbpr_msgOut(TAB_BUFFER *pMsgBuff,int tab_size) /* warn if msg gt 80 */ if (err == 1) { - len = strlen(pmsg); - sprintf(pmsg, - "dbpr_msgOut: ERROR - msg length=%d limit=%d ", - len, - MAXLINE); - dbpr_insert_msg(pMsgBuff, len, tab_size); - return; + len = strlen(pmsg); + sprintf(pmsg, "dbpr_msgOut: ERROR - msg length=%d limit=%d ", + len, MAXLINE); + dbpr_insert_msg(pMsgBuff, len, tab_size); } - return; } static void dbpr_init_msg(TAB_BUFFER *pMsgBuff,int tab_size) @@ -1184,7 +1297,6 @@ static void dbpr_init_msg(TAB_BUFFER *pMsgBuff,int tab_size) pMsgBuff->pNext = pMsgBuff->out_buff; pMsgBuff->pLast = pMsgBuff->out_buff + MAXLINE; pMsgBuff->pNexTab = pMsgBuff->out_buff + tab_size; - return; } static void dbpr_insert_msg(TAB_BUFFER *pMsgBuff,int len,int tab_size) @@ -1198,35 +1310,33 @@ static void dbpr_insert_msg(TAB_BUFFER *pMsgBuff,int len,int tab_size) /* flush buffer if overflow would occor */ if (tot_line > MAXLINE) - dbpr_msg_flush(pMsgBuff, tab_size); + dbpr_msg_flush(pMsgBuff, tab_size); /* append message to buffer */ n = 0; while ((*pmsg) && (n < len)) { - *pMsgBuff->pNext++ = *pmsg++; + *pMsgBuff->pNext++ = *pmsg++; - /* position to next tab stop */ - if (*(pMsgBuff->pNexTab - 1) != '\0') - pMsgBuff->pNexTab = pMsgBuff->pNexTab + tab_size; - n++; + /* position to next tab stop */ + if (*(pMsgBuff->pNexTab - 1) != '\0') + pMsgBuff->pNexTab = pMsgBuff->pNexTab + tab_size; + n++; } /* fill spaces to next tab stop */ while (*(pMsgBuff->pNexTab - 1) != ' ' - && pMsgBuff->pNext < pMsgBuff->pLast) { - *pMsgBuff->pNext++ = ' '; + && pMsgBuff->pNext < pMsgBuff->pLast) { + *pMsgBuff->pNext++ = ' '; } - return; - } static void dbpr_msg_flush(TAB_BUFFER *pMsgBuff,int tab_size) { /* skip print if buffer empty */ if (pMsgBuff->pNext != pMsgBuff->out_buff) - printf("%s\n", pMsgBuff->out_buff); + printf("%s\n", pMsgBuff->out_buff); + memset(pMsgBuff->out_buff,'\0', (int) MAXLINE + 1); pMsgBuff->pNext = pMsgBuff->out_buff; pMsgBuff->pNexTab = pMsgBuff->out_buff + tab_size; - return; }