dbNameToAddr() needs to adjust paddr->field_size when a $ modifier is used.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user