qemu-e2k/include/qapi/qmp
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
..
dispatch.h qapi: Support unregistering QMP commands 2016-09-19 17:32:21 +02:00
json-lexer.h include: Clean up includes 2016-02-23 12:43:05 +00:00
json-parser.h include: Clean up includes 2016-02-23 12:43:05 +00:00
json-streamer.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qbool.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qdict.h qdict: implement a qdict_crumple method for un-flattening a dict 2016-10-25 17:56:14 +02:00
qerror.h blockjob: Update description of the 'id' field 2016-07-13 13:26:02 +02:00
qfloat.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qint.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qjson.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qlist.h qobject: Simplify QObject 2015-12-17 08:21:28 +01:00
qobject.h include: Clean up includes 2016-02-23 12:43:05 +00:00
qstring.h include: Clean up includes 2016-02-23 12:43:05 +00:00
types.h Clean up header guards that don't match their file name 2016-07-12 16:19:16 +02:00