On 27/04/13 05:01, Eric Blake wrote:
In an upcoming patch, I need the way to safely transfer a nested virJSON object out of its parent container for independent use, even after the parent is freed. * src/util/virjson.h (virJSONValueObjectRemoveKey): New function. (_virJSONObject, _virJSONArray): Use correct type. * src/util/virjson.c (virJSONValueObjectRemoveKey): Implement it. * src/libvirt_private.syms (virjson.h): Export it. * tests/jsontest.c (mymain): Test it. Signed-off-by: Eric Blake <eblake@xxxxxxxxxx> --- src/libvirt_private.syms | 1 + src/util/virjson.c | 34 +++++++++++++++++++- src/util/virjson.h | 9 ++++-- tests/jsontest.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 120 insertions(+), 7 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 0bb6f5f..b502ed8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1392,6 +1392,7 @@ virJSONValueObjectGetValue; virJSONValueObjectHasKey; virJSONValueObjectIsNull; virJSONValueObjectKeysNumber; +virJSONValueObjectRemoveKey; virJSONValueToString; diff --git a/src/util/virjson.c b/src/util/virjson.c index e6a3b1b..10afe88 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -1,7 +1,7 @@ /* * virjson.c: JSON object parsing/formatting * - * Copyright (C) 2009-2010, 2012 Red Hat, Inc. + * Copyright (C) 2009-2010, 2012-2013 Red Hat, Inc. * Copyright (C) 2009 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -447,6 +447,38 @@ const char *virJSONValueObjectGetKey(virJSONValuePtr object, unsigned int n) return object->data.object.pairs[n].key; } +/* Remove the key-value pair tied to KEY out of OBJECT. If VALUE is + * not NULL, the dropped value object is returned instead of freed.
How about: s/KEY/@key/, s/OBJECT/@object/, s/VALUE/@value/, ?
+ * Returns 1 on success, 0 if no key was found, and -1 on error. */ +int +virJSONValueObjectRemoveKey(virJSONValuePtr object, const char *key, + virJSONValuePtr *value) +{ + int i; + + if (value) + *value = NULL; + + if (object->type != VIR_JSON_TYPE_OBJECT) + return -1; + + for (i = 0 ; i < object->data.object.npairs ; i++) { + if (STREQ(object->data.object.pairs[i].key, key)) { + if (value) { + *value = object->data.object.pairs[i].value; + object->data.object.pairs[i].value = NULL; + } + VIR_FREE(object->data.object.pairs[i].key); + virJSONValueFree(object->data.object.pairs[i].value); + VIR_DELETE_ELEMENT(object->data.object.pairs, i, + object->data.object.npairs); + return 1; + } + } + + return 0; +} + virJSONValuePtr virJSONValueObjectGetValue(virJSONValuePtr object, unsigned int n) { if (object->type != VIR_JSON_TYPE_OBJECT) diff --git a/src/util/virjson.h b/src/util/virjson.h index 67f4398..ff0fe75 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -1,7 +1,7 @@ /* * virjson.h: JSON object parsing/formatting * - * Copyright (C) 2009, 2012 Red Hat, Inc. + * Copyright (C) 2009, 2012-2013 Red Hat, Inc. * Copyright (C) 2009 Daniel P. Berrange * * This library is free software; you can redistribute it and/or @@ -55,12 +55,12 @@ struct _virJSONObjectPair { }; struct _virJSONObject { - unsigned int npairs; + size_t npairs; virJSONObjectPairPtr pairs; }; struct _virJSONArray { - unsigned int nvalues; + size_t nvalues; virJSONValuePtr *values; }; @@ -131,6 +131,9 @@ int virJSONValueObjectAppendNumberDouble(virJSONValuePtr object, const char *key int virJSONValueObjectAppendBoolean(virJSONValuePtr object, const char *key, int boolean); int virJSONValueObjectAppendNull(virJSONValuePtr object, const char *key); +int virJSONValueObjectRemoveKey(virJSONValuePtr object, const char *key,
Worth to add ATTRIBUTE_NONNULL for "object" and "key"? with the questions. ACK with the two questions resolved. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list