[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 2/3] qdict: Extract non-QDicts in qdict_array_sp
From: |
Eric Blake |
Subject: |
Re: [Qemu-devel] [PATCH 2/3] qdict: Extract non-QDicts in qdict_array_split() |
Date: |
Fri, 21 Feb 2014 11:37:20 -0700 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 |
On 02/21/2014 11:11 AM, Max Reitz wrote:
> Currently, qdict_array_split() only splits off entries with a key prefix
> of "%u.", packing them into a new QDict. This patch makes it support
> entries with the plain key "%u" as well, directly putting them into the
> new QList without creating a QDict.
>
> If there is both an entry with a key of "%u" and other entries with keys
> prefixed "%u." (for the same index), the function simply terminates.
>
> To do this, this patch also adds a static function which tests whether a
> given QDict contains any keys with the given prefix. This is used to test
> whether entries with a key prefixed "%u." do exist in the source QDict
> without modifying it.
>
> Signed-off-by: Max Reitz <address@hidden>
> ---
> qobject/qdict.c | 60
> +++++++++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 46 insertions(+), 14 deletions(-)
>
> +static bool qdict_has_prefixed_entries(const QDict *src, const char *start)
> +{
> + const QDictEntry *entry;
> +
> + for (entry = qdict_first(src); entry; entry = qdict_next(src, entry)) {
> + if (strstart(entry->key, start, NULL)) {
> + return true;
Note that if called with start="1" and the dict contains a key "10",
this would return true.
> @@ -617,19 +632,36 @@ void qdict_array_split(QDict *src, QList **dst)
> *dst = qlist_new();
>
> for (i = 0; i < UINT_MAX; i++) {
> + QObject *subqobj;
> + bool is_subqdict;
> QDict *subqdict;
> - char prefix[32];
> + char indexstr[32], prefix[32];
> size_t snprintf_ret;
>
> + snprintf_ret = snprintf(indexstr, 32, "%u", i);
> + assert(snprintf_ret < 32);
This assertion is redundant...
> +
> + subqobj = qdict_get(src, indexstr);
> +
> snprintf_ret = snprintf(prefix, 32, "%u.", i);
> assert(snprintf_ret < 32);
...if this assertion about a longer string holds true. But it doesn't
hurt my feelings to leave it in.
>
> - qdict_extract_subqdict(src, &subqdict, prefix);
> - if (!qdict_size(subqdict)) {
> - QDECREF(subqdict);
> + is_subqdict = qdict_has_prefixed_entries(src, prefix);
Thankfully you always test a prefix with a trailing '.', so this is not
a problem in your usage.
Reviewed-by: Eric Blake <address@hidden>
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
- [Qemu-devel] [PATCH 0/3] Extract non-QDicts in qdict_array_split(), Max Reitz, 2014/02/21
- [Qemu-devel] [PATCH 1/3] qemu-config: Sections must consist of keys, Max Reitz, 2014/02/21
- [Qemu-devel] [PATCH 2/3] qdict: Extract non-QDicts in qdict_array_split(), Max Reitz, 2014/02/21
- Re: [Qemu-devel] [PATCH 2/3] qdict: Extract non-QDicts in qdict_array_split(),
Eric Blake <=
- [Qemu-devel] [PATCH 3/3] check-qdict: Adjust test for qdict_array_split(), Max Reitz, 2014/02/21
- Re: [Qemu-devel] [PATCH 0/3] Extract non-QDicts in qdict_array_split(), Kevin Wolf, 2014/02/21
- Re: [Qemu-devel] [PATCH 0/3] Extract non-QDicts in qdict_array_split(), Eric Blake, 2014/02/21