Fix issues related to const array initialization

This commit is contained in:
Andrew Johnson
2016-08-12 23:21:26 -05:00
parent bb58598eba
commit d3a9ba7701
7 changed files with 38 additions and 17 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}