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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user