dbNameToAddr() needs to adjust paddr->field_size when a $ modifier is used.

This commit is contained in:
Andrew Johnson
2009-11-18 16:55:04 +00:00
parent e83182e812
commit d0466179b0

View File

@@ -665,7 +665,7 @@ long epicsShareAPI dbNameToAddr(const char *pname, DBADDR *paddr)
struct rset *prset;
long status = 0;
long no_elements = 1;
short dbfType, dbrType;
short dbfType, dbrType, field_size;
if (!pname || !*pname || !pdbbase)
return S_db_notFound;
@@ -686,17 +686,20 @@ long epicsShareAPI dbNameToAddr(const char *pname, DBADDR *paddr)
dbfType = pflddes->field_type;
dbrType = mapDBFToDBR[dbfType];
field_size = pflddes->size;
if (*pname++ == '$') {
/* Some field types can be accessed as char arrays */
if (dbfType == DBF_STRING) {
dbfType = DBF_CHAR;
dbrType = DBR_CHAR;
no_elements = pflddes->size;
no_elements = field_size;
field_size = 1;
} else if (dbfType >= DBF_INLINK && dbfType <= DBF_FWDLINK) {
/* Clients see a char array, but keep original dbfType */
dbrType = DBR_CHAR;
no_elements = PVNAME_STRINGSZ + 12;
field_size = 1;
} else {
status = S_dbLib_fieldNotFound;
goto finish;
@@ -706,7 +709,7 @@ long epicsShareAPI dbNameToAddr(const char *pname, DBADDR *paddr)
paddr->pfldDes = pflddes;
paddr->field_type = dbfType;
paddr->dbr_field_type = dbrType;
paddr->field_size = pflddes->size;
paddr->field_size = field_size;
paddr->special = pflddes->special;
paddr->no_elements = no_elements;