Added loadLS routine to lset

The long string in/out records use a different initializer
for constant links. The new loadLS method allows a constant
link type to initialize such a long string field.

NB: This routine was added in the middle of the lset table.
Any external link support implementations must be adjusted.
This commit is contained in:
Andrew Johnson
2016-08-31 00:36:23 -05:00
parent d0dcd61b23
commit 40a3a66745
6 changed files with 70 additions and 17 deletions

View File

@@ -715,7 +715,7 @@ static void scanLinkOnce(dbCommon *prec, caLink *pca) {
static lset dbCa_lset = {
0, 1, /* not Constant, Volatile */
dbCaRemoveLink,
NULL, NULL,
NULL, NULL, NULL,
isConnected,
getDBFtype, getElements,
dbCaGetLink,

View File

@@ -69,6 +69,30 @@ static long dbConstLoadScalar(struct link *plink, short dbrType, void *pbuffer)
(pstr, pbuffer, NULL);
}
static long dbConstLoadLS(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen)
{
const char *pstr = plink->value.constantStr;
size_t len;
if (!pstr)
return S_db_badField;
len = strlen(pstr);
/* FIXME This handles the common case, but not the general one... */
if (pstr[0] == '[' && pstr[1] == '"' &&
pstr[len-2] == '"' && pstr[len-1] == ']') {
pstr += 2;
len -= 4;
}
if (--size > len) size = len;
strncpy(pbuffer, pstr, size);
pbuffer[size] = 0;
*plen = (epicsUInt32) strlen(pbuffer) + 1;
return 0;
}
static long dbConstLoadArray(struct link *plink, short dbrType, void *pbuffer,
long *pnReq)
{
@@ -102,6 +126,7 @@ static lset dbConst_lset = {
1, 0, /* Constant, not Volatile */
NULL,
dbConstLoadScalar,
dbConstLoadLS,
dbConstLoadArray,
NULL,
NULL, dbConstGetNelements,

View File

@@ -338,7 +338,7 @@ static void dbDbScanFwdLink(struct link *plink)
static lset dbDb_lset = {
0, 0, /* not Constant, not Volatile */
dbDbRemoveLink,
NULL, NULL,
NULL, NULL, NULL,
dbDbIsConnected,
dbDbGetDBFtype, dbDbGetElements,
dbDbGetValue,

View File

@@ -206,6 +206,17 @@ long dbLoadLink(struct link *plink, short dbrType, void *pbuffer)
return S_db_noLSET;
}
long dbLoadLinkLS(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen)
{
lset *plset = plink->lset;
if (plset && plset->loadLS)
return plset->loadLS(plink, pbuffer, size, plen);
return S_db_noLSET;
}
long dbLoadLinkArray(struct link *plink, short dbrType, void *pbuffer,
long *pnRequest)
{
@@ -400,20 +411,6 @@ void dbScanFwdLink(struct link *plink)
/* Helper functions for long string support */
long dbLoadLinkLS(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen)
{
if (plink->type == CONSTANT &&
plink->value.constantStr) {
strncpy(pbuffer, plink->value.constantStr, --size);
pbuffer[size] = 0;
*plen = (epicsUInt32) strlen(pbuffer) + 1;
return 0;
}
return S_db_noLSET;
}
long dbGetLinkLS(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen)
{

View File

@@ -37,6 +37,8 @@ typedef struct lset {
/* Const init, data type hinting */
long (*loadScalar)(struct link *plink, short dbrType, void *pbuffer);
long (*loadLS)(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen);
long (*loadArray)(struct link *plink, short dbrType, void *pbuffer,
long *pnRequest);

View File

@@ -341,6 +341,35 @@ static long lnkConst_loadScalar(struct link *plink, short dbrType, void *pbuffer
return status;
}
static long lnkConst_loadLS(struct link *plink, char *pbuffer, epicsUInt32 size,
epicsUInt32 *plen)
{
clink *clink = CONTAINER(plink->value.json.jlink, struct clink, jlink);
const char *pstr;
IFDEBUG(10)
printf("lnkConst_loadLS(const@%p, %p, %d, %d)\n",
clink, pbuffer, size, *plen);
switch (clink->type) {
case sc40:
pstr = clink->value.scalar_string;
break;
case ac40:
pstr = clink->value.pstrings[0];
break;
default:
return S_db_badField;
}
strncpy(pbuffer, pstr, --size);
pbuffer[size] = 0;
*plen = (epicsUInt32) strlen(pbuffer) + 1;
return 0;
}
static long lnkConst_loadArray(struct link *plink, short dbrType, void *pbuffer,
long *pnReq)
{
@@ -437,7 +466,7 @@ static long lnkConst_getValue(struct link *plink, short dbrType, void *pbuffer,
static lset lnkConst_lset = {
1, 0, /* Constant, not Volatile */
NULL, lnkConst_loadScalar, lnkConst_loadArray, NULL,
NULL, lnkConst_loadScalar, lnkConst_loadLS, lnkConst_loadArray, NULL,
NULL, lnkConst_getNelements, lnkConst_getValue,
NULL, NULL, NULL,
NULL, NULL,