diff --git a/src/ioc/db/dbConstLink.c b/src/ioc/db/dbConstLink.c index 1c1f89c3a..90f5d8d6b 100644 --- a/src/ioc/db/dbConstLink.c +++ b/src/ioc/db/dbConstLink.c @@ -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" diff --git a/src/ioc/db/dbConstLink.h b/src/ioc/db/dbConstLink.h index fb598ab9f..c187f9fc5 100644 --- a/src/ioc/db/dbConstLink.h +++ b/src/ioc/db/dbConstLink.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 diff --git a/src/ioc/db/dbConvertJSON.c b/src/ioc/db/dbConvertJSON.c index d877fe043..cd7b7ca44 100644 --- a/src/ioc/db/dbConvertJSON.c +++ b/src/ioc/db/dbConvertJSON.c @@ -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); diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index 111175276..a07d35caf 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -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; diff --git a/src/ioc/dbStatic/dbStaticLib.c b/src/ioc/dbStatic/dbStaticLib.c index c718dacab..9ef89e802 100644 --- a/src/ioc/dbStatic/dbStaticLib.c +++ b/src/ioc/dbStatic/dbStaticLib.c @@ -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; } diff --git a/src/std/dev/devAaiSoft.c b/src/std/dev/devAaiSoft.c index 768ddb00e..31626bacb 100644 --- a/src/std/dev/devAaiSoft.c +++ b/src/std/dev/devAaiSoft.c @@ -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; } diff --git a/src/std/dev/devWfSoft.c b/src/std/dev/devWfSoft.c index 4128ed47a..e5aef8195 100644 --- a/src/std/dev/devWfSoft.c +++ b/src/std/dev/devWfSoft.c @@ -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; }