From 07b09eed1f27a0cd0665fd25f5a10211f9803b66 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 3 Sep 2016 13:36:17 -0500 Subject: [PATCH] Fixes to dbJLink, added dbJLinkFree() Moved the clearing of key_is_link to the right place, embedded links now parse correctly. --- src/ioc/db/dbJLink.c | 10 +++++++--- src/ioc/db/dbJLink.h | 2 ++ src/ioc/dbStatic/dbStaticLib.c | 3 +-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ioc/db/dbJLink.c b/src/ioc/db/dbJLink.c index 11f364e5e..ec98fbccb 100644 --- a/src/ioc/db/dbJLink.c +++ b/src/ioc/db/dbJLink.c @@ -17,6 +17,7 @@ #define epicsExportSharedSybols #include "dbAccessDefs.h" #include "dbCommon.h" +#include "dbLink.h" #include "dbJLink.h" #include "dbStaticLib.h" #include "link.h" @@ -45,6 +46,11 @@ typedef struct parseContext { #define CALL_OR_STOP(routine) !(routine) ? jlif_stop : (routine) +void dbJLinkFree(jlink *pjlink) { + if (pjlink) + pjlink->pif->free_jlink(pjlink); +} + static int dbjl_return(parseContext *parser, jlif_result result) { jlink *pjlink = parser->pjlink; @@ -83,7 +89,6 @@ static int dbjl_value(parseContext *parser, jlif_result result) { else if (parent->pif->end_child) parent->pif->end_child(parent, pjlink); - parser->key_is_link = 0; parser->pjlink = parent; IFDEBUG(8) @@ -256,12 +261,11 @@ static int dbjl_map_key(void *ctx, const unsigned char *key, unsigned len) { pjlink->parent = parser->pjlink; } parser->pjlink = pjlink; + parser->key_is_link = 0; IFDEBUG(8) printf("dbjl_map_key: New %s@%p\n", pjlink->pif->name, pjlink); - // FIXME How to ensure a link map has only one key/value pair? - return jlif_continue; } diff --git a/src/ioc/db/dbJLink.h b/src/ioc/db/dbJLink.h index 7b32fb130..fff8b7fe1 100644 --- a/src/ioc/db/dbJLink.h +++ b/src/ioc/db/dbJLink.h @@ -63,6 +63,8 @@ epicsShareFunc long dbJLinkParse(const char *json, size_t len, short dbfType, jlink **ppjlink); epicsShareFunc long dbJLinkInit(struct link *plink); +epicsShareFunc void dbJLinkFree(jlink *); + #ifdef __cplusplus } #endif diff --git a/src/ioc/dbStatic/dbStaticLib.c b/src/ioc/dbStatic/dbStaticLib.c index a1a62e652..62527c693 100644 --- a/src/ioc/dbStatic/dbStaticLib.c +++ b/src/ioc/dbStatic/dbStaticLib.c @@ -124,8 +124,7 @@ void dbFreeLinkContents(struct link *plink) case MACRO_LINK: free((void *)plink->value.macro_link.macroStr); break; case PV_LINK: free((void *)plink->value.pv_link.pvname); break; case JSON_LINK: - if (plink->value.json.jlink) - plink->value.json.jlink->pif->free_jlink(plink->value.json.jlink); + dbJLinkFree(plink->value.json.jlink); parm = plink->value.json.string; break; case VME_IO: parm = plink->value.vmeio.parm; break;