Fixes to dbJLink, added dbJLinkFree()

Moved the clearing of key_is_link to the right place,
embedded links now parse correctly.
This commit is contained in:
Andrew Johnson
2016-09-03 13:36:17 -05:00
parent 1e1c52cb69
commit 07b09eed1f
3 changed files with 10 additions and 5 deletions

View File

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

View File

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

View File

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