Fix issues related to const array initialization
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "dbAccessDefs.h"
|
||||
#include "dbAddr.h"
|
||||
#include "dbCommon.h"
|
||||
#include "dbConstLink.h"
|
||||
#include "dbConvertFast.h"
|
||||
#include "dbConvertJSON.h"
|
||||
#include "dbFldTypes.h"
|
||||
|
||||
@@ -23,7 +23,7 @@ extern "C" {
|
||||
|
||||
struct link;
|
||||
|
||||
epicsShareFunc long dbConstInitLink(struct link *plink);
|
||||
epicsShareFunc void dbConstInitLink(struct link *plink);
|
||||
epicsShareFunc void dbConstAddLink(struct link *plink);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -42,8 +42,8 @@ static int dbcj_integer(void *ctx, long num) {
|
||||
|
||||
if (parser->elems > 0) {
|
||||
conv(&val32, parser->pdest, NULL);
|
||||
parser->pdest += parser->dbrSize;
|
||||
parser->elems--;
|
||||
parser->pdest += parser->dbrSize;
|
||||
parser->elems--;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -54,8 +54,8 @@ static int dbcj_double(void *ctx, double num) {
|
||||
|
||||
if (parser->elems > 0) {
|
||||
conv(&num, parser->pdest, NULL);
|
||||
parser->pdest += parser->dbrSize;
|
||||
parser->elems--;
|
||||
parser->pdest += parser->dbrSize;
|
||||
parser->elems--;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -71,10 +71,12 @@ static int dbcj_string(void *ctx, const unsigned char *val, unsigned int len) {
|
||||
return 0; /* Illegal */
|
||||
|
||||
if (parser->elems > 0) {
|
||||
if (len > MAX_STRING_SIZE - 1)
|
||||
len = MAX_STRING_SIZE - 1;
|
||||
if (len > parser->dbrSize - 1)
|
||||
len = parser->dbrSize - 1;
|
||||
strncpy(pdest, (const char *) val, len);
|
||||
pdest[len] = 0;
|
||||
pdest[len] = 0;
|
||||
parser->pdest += parser->dbrSize;
|
||||
parser->elems--;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -147,7 +149,7 @@ long dbPutConvertJSON(const char *json, short dbrType,
|
||||
break;
|
||||
|
||||
case yajl_status_error: {
|
||||
unsigned char *err = yajl_get_error(yh, 1,
|
||||
unsigned char *err = yajl_get_error(yh, 1,
|
||||
(const unsigned char *) json, (unsigned int) jlen);
|
||||
fprintf(stderr, "dbPutConvertJSON: %s\n", err);
|
||||
yajl_free_error(yh, err);
|
||||
|
||||
@@ -146,7 +146,7 @@ long dbLoadLink(struct link *plink, short dbrType, void *pbuffer)
|
||||
lset *plset = plink->lset;
|
||||
|
||||
|
||||
if (plset->loadScalar)
|
||||
if (plset && plset->loadScalar)
|
||||
return plset->loadScalar(plink, dbrType, pbuffer);
|
||||
|
||||
return S_db_notFound;
|
||||
@@ -157,7 +157,7 @@ long dbLoadLinkArray(struct link *plink, short dbrType, void *pbuffer,
|
||||
{
|
||||
lset *plset = plink->lset;
|
||||
|
||||
if (plset->loadArray)
|
||||
if (plset && plset->loadArray)
|
||||
return plset->loadArray(plink, dbrType, pbuffer, pnRequest);
|
||||
|
||||
return S_db_notFound;
|
||||
|
||||
@@ -2331,7 +2331,8 @@ long dbParseLink(const char *str, short ftype, dbLinkInfo *pinfo)
|
||||
}
|
||||
|
||||
/* Link may be an array constant */
|
||||
if (pstr[0] == '[' && pstr[len-1] == ']' && strchr(pstr, ',')) {
|
||||
if (pstr[0] == '[' && pstr[len-1] == ']' &&
|
||||
(strchr(pstr, ',') || strchr(pstr, '"'))) {
|
||||
pinfo->ltype = CONSTANT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "alarm.h"
|
||||
#include "dbDefs.h"
|
||||
#include "dbAccess.h"
|
||||
#include "dbConstLink.h"
|
||||
#include "recGbl.h"
|
||||
#include "devSup.h"
|
||||
#include "cantProceed.h"
|
||||
@@ -52,11 +53,24 @@ epicsExportAddress(dset,devAaiSoft);
|
||||
|
||||
static long init_record(aaiRecord *prec)
|
||||
{
|
||||
long nRequest = prec->nelm;
|
||||
|
||||
if (prec->inp.type == CONSTANT) {
|
||||
dbLoadLinkArray(&prec->inp, prec->ftvl, prec->bptr, &nRequest);
|
||||
prec->nord = (nRequest > 0) ? nRequest : 0;
|
||||
long nRequest = prec->nelm;
|
||||
long status;
|
||||
|
||||
/* Allocate a buffer, record support hasn't done that yet */
|
||||
if (!prec->bptr) {
|
||||
prec->bptr = callocMustSucceed(nRequest, dbValueSize(prec->ftvl),
|
||||
"devAaiSoft: buffer calloc failed");
|
||||
}
|
||||
|
||||
/* This is pass 0 so link hasn't been initialized either */
|
||||
dbConstInitLink(&prec->inp);
|
||||
|
||||
status = dbLoadLinkArray(&prec->inp, prec->ftvl, prec->bptr, &nRequest);
|
||||
if (!status && nRequest > 0) {
|
||||
prec->nord = nRequest;
|
||||
prec->udf = FALSE;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,10 @@ static long init_record(waveformRecord *prec)
|
||||
long nelm = prec->nelm;
|
||||
long status = dbLoadLinkArray(&prec->inp, prec->ftvl, prec->bptr, &nelm);
|
||||
|
||||
prec->nord = !status && (nelm > 0) ? nelm : 0;
|
||||
if (!status && nelm > 0) {
|
||||
prec->nord = nelm;
|
||||
prec->udf = FALSE;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user