Allow getting a DBF_*LINK field using a DBR_CHAR array (put already done).

Fetch options before SPC_ATTRIBUTE str; allow a DBR_CHAR array there too.
This commit is contained in:
Andrew Johnson
2009-03-05 21:23:22 +00:00
parent e2a933c51f
commit 8597ae087b
+43 -16
View File
@@ -922,8 +922,21 @@ long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType,
dbFldDes *pfldDes = paddr->pfldDes;
char *rtnString;
char *pbuf = (char *)pbuffer;
int maxlen;
if(dbrType!=DBR_STRING) {
switch (dbrType) {
case DBR_STRING:
maxlen = MAX_STRING_SIZE - 1;
break;
case DBR_CHAR:
case DBR_UCHAR:
if (nRequest && *nRequest > 1) {
maxlen = *nRequest - 1;
break;
}
/* else fall through ... */
default:
status = S_db_badDbrtype;
goto done;
}
@@ -936,14 +949,8 @@ long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType,
if (!status) status = dbFindField(&dbEntry, pfldDes->name);
if (!status) {
rtnString = dbGetString(&dbEntry);
/*begin kludge for old db_access MAX_STRING_SIZE*/
if (strlen(rtnString) >= MAX_STRING_SIZE) {
strncpy(pbuf, rtnString, MAX_STRING_SIZE-1);
pbuf[MAX_STRING_SIZE-1] = 0;
} else {
strcpy(pbuf, rtnString);
}
/*end kludge for old db_access MAX_STRING_SIZE*/
strncpy(pbuf, rtnString, maxlen - 1);
pbuf[maxlen - 1] = 0;
}
dbFinishEntry(&dbEntry);
} else {
@@ -964,13 +971,6 @@ long epicsShareAPI dbGet(DBADDR *paddr, short dbrType,
struct rset *prset;
long status = 0;
if (paddr->special == SPC_ATTRIBUTE) {
if (dbrType != DBR_STRING) return S_db_badDbrtype;
if (!paddr->pfield) return S_db_badField;
strcpy((char *)pbuffer, (char *)paddr->pfield);
return 0;
}
if (options && *options) {
char *pbuf = pbuffer;
@@ -979,6 +979,33 @@ long epicsShareAPI dbGet(DBADDR *paddr, short dbrType,
}
if (nRequest && *nRequest == 0) return 0;
if (paddr->special == SPC_ATTRIBUTE) {
char *pbuf = pbuffer;
int maxlen;
if (!paddr->pfield) return S_db_badField;
switch (dbrType) {
case DBR_STRING:
maxlen = MAX_STRING_SIZE - 1;
break;
case DBR_CHAR:
case DBR_UCHAR:
if (nRequest && *nRequest > 1) {
maxlen = *nRequest - 1;
break;
}
/* else fall through ... */
default:
return S_db_badDbrtype;
}
strncpy(pbuf, (char *)paddr->pfield, maxlen - 1);
pbuf[maxlen - 1] = 0;
return 0;
}
/* Check for valid request */
if (INVALID_DB_REQ(dbrType) || field_type > DBF_DEVICE) {
char message[80];