From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34375) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WGuyW-0007yk-T7 for qemu-devel@nongnu.org; Fri, 21 Feb 2014 13:37:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WGuyQ-0006yH-Sb for qemu-devel@nongnu.org; Fri, 21 Feb 2014 13:37:28 -0500 Received: from mx1.redhat.com ([209.132.183.28]:17062) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WGuyQ-0006yD-Jt for qemu-devel@nongnu.org; Fri, 21 Feb 2014 13:37:22 -0500 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s1LIbLit000595 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 21 Feb 2014 13:37:21 -0500 Message-ID: <53079CE0.1040504@redhat.com> Date: Fri, 21 Feb 2014 11:37:20 -0700 From: Eric Blake MIME-Version: 1.0 References: <1393006301-22514-1-git-send-email-mreitz@redhat.com> <1393006301-22514-3-git-send-email-mreitz@redhat.com> In-Reply-To: <1393006301-22514-3-git-send-email-mreitz@redhat.com> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="6j8lhG5AG3UbRxuivk6JUXOOhISpdbwAa" Subject: Re: [Qemu-devel] [PATCH 2/3] qdict: Extract non-QDicts in qdict_array_split() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz , qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --6j8lhG5AG3UbRxuivk6JUXOOhISpdbwAa Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 02/21/2014 11:11 AM, Max Reitz wrote: > Currently, qdict_array_split() only splits off entries with a key prefi= x > 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. >=20 > If there is both an entry with a key of "%u" and other entries with key= s > prefixed "%u." (for the same index), the function simply terminates. >=20 > 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 te= st > whether entries with a key prefixed "%u." do exist in the source QDict > without modifying it. >=20 > Signed-off-by: Max Reitz > --- > qobject/qdict.c | 60 +++++++++++++++++++++++++++++++++++++++++++------= -------- > 1 file changed, 46 insertions(+), 14 deletions(-) >=20 > +static bool qdict_has_prefixed_entries(const QDict *src, const char *s= tart) > +{ > + const QDictEntry *entry; > + > + for (entry =3D qdict_first(src); entry; entry =3D qdict_next(src, = entry)) { > + if (strstart(entry->key, start, NULL)) { > + return true; Note that if called with start=3D"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 =3D qlist_new(); > =20 > for (i =3D 0; i < UINT_MAX; i++) { > + QObject *subqobj; > + bool is_subqdict; > QDict *subqdict; > - char prefix[32]; > + char indexstr[32], prefix[32]; > size_t snprintf_ret; > =20 > + snprintf_ret =3D snprintf(indexstr, 32, "%u", i); > + assert(snprintf_ret < 32); This assertion is redundant... > + > + subqobj =3D qdict_get(src, indexstr); > + > snprintf_ret =3D snprintf(prefix, 32, "%u.", i); > assert(snprintf_ret < 32); =2E..if this assertion about a longer string holds true. But it doesn't hurt my feelings to leave it in. > =20 > - qdict_extract_subqdict(src, &subqdict, prefix); > - if (!qdict_size(subqdict)) { > - QDECREF(subqdict); > + is_subqdict =3D 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 --=20 Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org --6j8lhG5AG3UbRxuivk6JUXOOhISpdbwAa Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Public key at http://people.redhat.com/eblake/eblake.gpg Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBCAAGBQJTB5zgAAoJEKeha0olJ0Nq71EH/AuYpLM4+SRCt4DANIHTiI66 ORMyu4BmvgRa46S9kl09Jq/aC3xO3tqY6hWHugNTwNeAREe+Q3SJvfUe5Mqj09Sn clOwgeZjciaMQ9ui92G3sPp2pJyEtEkl8AtQ/nWEK4XePy7mrzMRxu/uiInxNAOP qCill7GGVfEWTQUrxEqcWOvp2nqVrIPaKKpR0HFJEBnLOvWzQOyH9DpPt3LpDip3 EgtNH74lQI1k1CHP+ucTq0LphyUoMoL5M+RwSZPSRFG3nM+RAoOqpIEqZFwhel9m HcE5d5RrhrbdlyA2ldIWKqzbAxmbH1cA+sW9ewGTsbS/mEW99CrPBJ9h0O9MORo= =XwvF -----END PGP SIGNATURE----- --6j8lhG5AG3UbRxuivk6JUXOOhISpdbwAa--