rfc->v1: - addressed Paolo's comments for patches 1 and 2, - patches 7 and 8 are new (unit tests), - updated the cover letter to take native lists into account, plus cleaned it up.
Consider the following QAPI schema fragment, for the purpose of command line parsing with OptsVisitor: { 'union': 'NumaOptions', 'data': { 'node': 'NumaNodeOptions', 'mem' : 'NumaMemOptions' }} { 'type': 'NumaNodeOptions', 'data': { '*nodeid': 'int', '*cpus' : ['uint16'] }} { 'type': 'NumaMemOptions', 'data': { '*nodeid': 'int', '*size' : 'size' }} (Commit eb7ee2cb ("qapi: introduce OptsVisitor") had originally documented OptsVisitor's general schema requirements for parsing repeated options such that the list element type had to be a struct with one mandatory scalar field. Accordingly, the RFC version of this series required for interval flattening that this underlying scalar type be an integer type. However, since commit a678e26c ("qapi: pad GenericList value fields to 64 bits") we've had reliable native lists; OptsVisitor turns out to support them automatically.) OptsVisitor already accepts the following command line with the above schema: -numa node,nodeid=3,cpus=0,cpus=1,cpus=2,cpus=6,cpus=7,cpus=8 Paolo suggested in <http://thread.gmane.org/gmane.comp.emulators.qemu/222589/focus=222732> that OptsVisitor should allow the following shortcut: -numa node,nodeid=3,cpus=0-2,cpus=6-8 and that the code processing the "cpus" list should encounter all six elements (0, 1, 2, 6, 7, 8) individually. The series implements this feature. Both signed and unsigned values and intervals are supported in general: * 0 (zero) * 1-5 (one to five) * 4-4 (four to four, range with one element) * -2 (minus two) * -5-8 (minus five to plus eight) * -9--6 (minus nine to minus six) The restrictions imposed by the native list element's signedness and size (in the above schema example, 'uint16') are enforced element-wise as usual. That is, for 'uint16', the command line option -numa node,nodeid=3,cpus=65534-65537 is equivalent to -numa node,nodeid=3,cpus=65534,cpus=65535,cpus=65536,cpus=65537 and visit_type_uint16() [qapi/qapi-visit-core.c] will catch the first element (= 65536) that has been parsed by opts_type_int() but cannot be represented as 'uint16'. Laszlo Ersek (8): OptsVisitor: introduce basic list modes OptsVisitor: introduce list modes for interval flattening OptsVisitor: opts_type_int(): recognize intervals when LM_IN_PROGRESS OptsVisitor: rebase opts_type_uint64() to parse_uint_full() OptsVisitor: opts_type_uint64(): recognize intervals when LM_IN_PROGRESS OptsVisitor: don't try to flatten overlong integer ranges add "test-int128" to .gitignore OptsVisitor: introduce unit tests, with test cases for range flattening tests/Makefile | 6 +- qapi-schema-test.json | 15 +++ include/qapi/opts-visitor.h | 6 + qapi/opts-visitor.c | 184 ++++++++++++++++++++++++----- tests/test-opts-visitor.c | 275 +++++++++++++++++++++++++++++++++++++++++++ .gitignore | 2 + 6 files changed, 456 insertions(+), 32 deletions(-) create mode 100644 tests/test-opts-visitor.c