qemu/qobject
Daniel P. Berrange 603476c25c qdict: implement a qdict_crumple method for un-flattening a dict
The qdict_flatten() method will take a dict whose elements are
further nested dicts/lists and flatten them by concatenating
keys.

The qdict_crumple() method aims to do the reverse, taking a flat
qdict, and turning it into a set of nested dicts/lists. It will
apply nesting based on the key name, with a '.' indicating a
new level in the hierarchy. If the keys in the nested structure
are all numeric, it will create a list, otherwise it will create
a dict.

If the keys are a mixture of numeric and non-numeric, or the
numeric keys are not in strictly ascending order, an error will
be reported.

As an example, a flat dict containing

 {
   'foo.0.bar': 'one',
   'foo.0.wizz': '1',
   'foo.1.bar': 'two',
   'foo.1.wizz': '2'
 }

will get turned into a dict with one element 'foo' whose
value is a list. The list elements will each in turn be
dicts.

 {
   'foo': [
     { 'bar': 'one', 'wizz': '1' },
     { 'bar': 'two', 'wizz': '2' }
   ],
 }

If the key is intended to contain a literal '.', then it must
be escaped as '..'. ie a flat dict

  {
     'foo..bar': 'wizz',
     'bar.foo..bar': 'eek',
     'bar.hello': 'world'
  }

Will end up as

  {
     'foo.bar': 'wizz',
     'bar': {
        'foo.bar': 'eek',
        'hello': 'world'
     }
  }

The intent of this function is that it allows a set of QemuOpts
to be turned into a nested data structure that mirrors the nesting
used when the same object is defined over QMP.

Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1475246744-29302-3-git-send-email-berrange@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[Parameter recursive dropped along with its tests; whitespace style
touched up]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2016-10-25 17:56:14 +02:00
..
Makefile.objs qobject: Simplify QObject 2015-12-17 08:21:28 +01:00
json-lexer.c qobject: Correct JSON lexer grammar comments 2016-06-30 15:24:36 +02:00
json-parser.c qapi: Improve use of qmp/types.h 2016-07-06 10:52:03 +02:00
json-streamer.c json-streamer: fix double-free on exiting during a parse 2016-07-12 18:31:27 +02:00
qbool.c qobject: Clean up includes 2016-02-04 17:41:30 +00:00
qdict.c qdict: implement a qdict_crumple method for un-flattening a dict 2016-10-25 17:56:14 +02:00
qfloat.c qobject: Clean up includes 2016-02-04 17:41:30 +00:00
qint.c qobject: Clean up includes 2016-02-04 17:41:30 +00:00
qjson.c qapi: Improve use of qmp/types.h 2016-07-06 10:52:03 +02:00
qlist.c coccinelle: Remove unnecessary variables for function return value 2016-06-20 16:38:13 +02:00
qnull.c qobject: Clean up includes 2016-02-04 17:41:30 +00:00
qobject.c qapi: Improve use of qmp/types.h 2016-07-06 10:52:03 +02:00
qstring.c qobject: Clean up includes 2016-02-04 17:41:30 +00:00